<div dir="ltr">On 5 March 2013 15:56, Matt Turner <span dir="ltr"><<a href="mailto:mattst88@gmail.com" target="_blank">mattst88@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Replaces (samples - 1) ADDs and a MUL with (samples - 1) LRPs.<br>
---<br>
 src/mesa/drivers/dri/i965/brw_blorp_blit.cpp |   31 +++++++++++--------------<br>
 1 files changed, 14 insertions(+), 17 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp<br>
index 37524ad..4d1ba90 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp<br>
@@ -1376,12 +1376,11 @@ brw_blorp_blit_program::manual_blend(unsigned num_samples)<br>
     * For integer formats, we replace the add operations with average<br>
     * operations and skip the final division.<br>
     */<br>
-   typedef struct brw_instruction *(*brw_op2_ptr)(struct brw_compile *,<br>
-                                                  struct brw_reg,<br>
-                                                  struct brw_reg,<br>
-                                                  struct brw_reg);<br>
-   brw_op2_ptr combine_op =<br>
-      key->texture_data_type == BRW_REGISTER_TYPE_F ? brw_ADD : brw_AVG;<br>
+   struct brw_reg zero_point_five;<br>
+   if (key->texture_data_type == BRW_REGISTER_TYPE_F) {<br>
+      brw_MOV(&func, zero_point_five, brw_imm_f(0.5f));<br>
+   }<br>
+<br></blockquote><div><br></div><div>It looks like you're not initializing the struct zero_point_five.  You need to allocate a register in brw_blorp_blit_program::alloc_regs() and then store it in this.<br><br></div>
<div>Other than that the patch looks good.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    unsigned stack_depth = 0;<br>
    for (unsigned i = 0; i < num_samples; ++i) {<br>
       assert(stack_depth == _mesa_bitcount(i)); /* Loop invariant */<br>
@@ -1423,9 +1422,17 @@ brw_blorp_blit_program::manual_blend(unsigned num_samples)<br>
<br>
          /* TODO: should use a smaller loop bound for non_RGBA formats */<br>
          for (int k = 0; k < 4; ++k) {<br>
-            combine_op(&func, offset(texture_data[stack_depth - 1], 2*k),<br>
+            if (key->texture_data_type == BRW_REGISTER_TYPE_F) {<br>
+               /* LRP operands are (a, y, x). */<br>
+               brw_LRP(&func, offset(texture_data[stack_depth - 1], 2*k),<br>
+                       zero_point_five,<br>
+                       offset(vec8(texture_data[stack_depth]), 2*k),<br>
+                       offset(vec8(texture_data[stack_depth - 1]), 2*k));<br>
+            } else {<br>
+               brw_AVG(&func, offset(texture_data[stack_depth - 1], 2*k),<br>
                        offset(vec8(texture_data[stack_depth - 1]), 2*k),<br>
                        offset(vec8(texture_data[stack_depth]), 2*k));<br>
+            }<br>
          }<br>
       }<br>
    }<br>
@@ -1433,16 +1440,6 @@ brw_blorp_blit_program::manual_blend(unsigned num_samples)<br>
    /* We should have just 1 sample on the stack now. */<br>
    assert(stack_depth == 1);<br>
<br>
-   if (key->texture_data_type == BRW_REGISTER_TYPE_F) {<br>
-      /* Scale the result down by a factor of num_samples */<br>
-      /* TODO: should use a smaller loop bound for non-RGBA formats */<br>
-      for (int j = 0; j < 4; ++j) {<br>
-         brw_MUL(&func, offset(texture_data[0], 2*j),<br>
-                 offset(vec8(texture_data[0]), 2*j),<br>
-                 brw_imm_f(1.0/num_samples));<br>
-      }<br>
-   }<br>
-<br>
    if (key->tex_layout == INTEL_MSAA_LAYOUT_CMS)<br>
       brw_ENDIF(&func);<br>
 }<br>
<span class=""><font color="#888888">--<br>
1.7.8.6<br>
<br>
</font></span></blockquote></div><br></div></div>