i965/blorp: Properly adjust primitive size for 8x MSAA.
authorPaul Berry <stereotype441@gmail.com>
Wed, 18 Jul 2012 04:06:01 +0000 (21:06 -0700)
committerPaul Berry <stereotype441@gmail.com>
Tue, 24 Jul 2012 21:52:58 +0000 (14:52 -0700)
When rendering to an IMS MSAA surface on Gen7, blorp sets up the
rendering pipeline as though it were rendering to a single-sampled
surface; accordingly it must adjust the size of the primitive it sends
down the pipeline to account for the interleaving of samples in an IMS
surface.

This patch modifies the size adjustment code to properly handle 8x
MSAA, which makes room for the extra samples by using an interleaving
pattern that is twice as wide as 4x MSAA.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_blorp_blit.cpp

index ae60ae29e03b975438015bec42cb65d16fa62bf1..f77008d87bc328096bc27afcbdc3dc1136868dfc 100644 (file)
@@ -1633,10 +1633,23 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,
        * pipeline as multisampled.
        */
       assert(dst_mt->msaa_layout == INTEL_MSAA_LAYOUT_IMS);
-      x0 = (x0 * 2) & ~3;
-      y0 = (y0 * 2) & ~3;
-      x1 = ALIGN(x1 * 2, 4);
-      y1 = ALIGN(y1 * 2, 4);
+      switch (dst_mt->num_samples) {
+      case 4:
+         x0 = (x0 * 2) & ~3;
+         y0 = (y0 * 2) & ~3;
+         x1 = ALIGN(x1 * 2, 4);
+         y1 = ALIGN(y1 * 2, 4);
+         break;
+      case 8:
+         x0 = (x0 * 4) & ~7;
+         y0 = (y0 * 2) & ~3;
+         x1 = ALIGN(x1 * 4, 8);
+         y1 = ALIGN(y1 * 2, 4);
+         break;
+      default:
+         assert(!"Unrecognized sample count in brw_blorp_blit_params ctor");
+         break;
+      }
       wm_prog_key.use_kill = true;
    }