i965/blorp: Optimize manual_blend() for compressed multisampled surfaces.
authorPaul Berry <stereotype441@gmail.com>
Mon, 9 Jul 2012 18:10:52 +0000 (11:10 -0700)
committerPaul Berry <stereotype441@gmail.com>
Fri, 20 Jul 2012 16:35:37 +0000 (09:35 -0700)
When downsampling a compressed multisampled surface, we can take a
shortcut to downsample any pixels that were completely covered by a
single primitive.  In this case, the first color value we fetch is the
correct final color for the downsampled pixel, so we can skip the rest
of the blending operation.

Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/mesa/drivers/dri/i965/brw_blorp_blit.cpp

index 32fd48e2061d7bed95e4533bd2d468d86dcd95f7..c8db662e23aac620cb96a3725781171384cb1e28 100644 (file)
@@ -1143,6 +1143,26 @@ brw_blorp_blit_program::manual_blend()
       }
       texel_fetch(texture_data[stack_depth++]);
 
+      if (i == 0 && key->tex_layout == INTEL_MSAA_LAYOUT_CMS) {
+         /* The Ivy Bridge PRM, Vol4 Part1 p27 (Multisample Control Surface)
+          * suggests an optimization:
+          *
+          *     "A simple optimization with probable large return in
+          *     performance is to compare the MCS value to zero (indicating
+          *     all samples are on sample slice 0), and sample only from
+          *     sample slice 0 using ld2dss if MCS is zero."
+          *
+          * Note that in the case where the MCS value is zero, sampling from
+          * sample slice 0 using ld2dss and sampling from sample 0 using
+          * ld2dms are equivalent (since all samples are on sample slice 0).
+          * Since we have already sampled from sample 0, all we need to do is
+          * skip the remaining fetches and averaging if MCS is zero.
+          */
+         brw_CMP(&func, vec16(brw_null_reg()), BRW_CONDITIONAL_NZ,
+                 mcs_data, brw_imm_ud(0));
+         brw_IF(&func, BRW_EXECUTE_16);
+      }
+
       /* Do count_trailing_one_bits(i) times */
       for (int j = count_trailing_one_bits(i); j-- > 0; ) {
          assert(stack_depth >= 2);
@@ -1169,6 +1189,9 @@ brw_blorp_blit_program::manual_blend()
                  brw_imm_f(1.0/num_samples));
       }
    }
+
+   if (key->tex_layout == INTEL_MSAA_LAYOUT_CMS)
+      brw_ENDIF(&func);
 }
 
 /**