i965/gen6: Adjust render height in errata case for MSAA
authorJordan Justen <jordan.l.justen@intel.com>
Tue, 25 Feb 2014 19:18:25 +0000 (11:18 -0800)
committerJordan Justen <jordan.l.justen@intel.com>
Sat, 16 Aug 2014 03:11:40 +0000 (20:11 -0700)
In the gen6 PRM Volume 1 Part 1: Graphics Core, Section
7.18.3.7.1 (Surface Arrays For all surfaces other than separate
stencil buffer):

 "[DevSNB] Errata: Sampler MSAA Qpitch will be 4 greater than the
  value calculated in the equation above , for every other odd Surface
  Height starting from 1 i.e. 1,5,9,13"

Since this Qpitch errata only impacts the sampler, we have to adjust
the input for the rendering surface to achieve the same qpitch. For
the affected heights, we increment the height by 1 for the rendering
surface.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Acked-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/gen6_surface_state.c

index 65bcf7d0af2daaec48537f0902fdfc58585c081a..27b441956df00e7813af1f2063aec213d2cd47c6 100644 (file)
@@ -99,8 +99,24 @@ gen6_update_renderbuffer_surface(struct brw_context *brw,
    /* reloc */
    surf[1] = mt->bo->offset64;
 
+   /* In the gen6 PRM Volume 1 Part 1: Graphics Core, Section 7.18.3.7.1
+    * (Surface Arrays For all surfaces other than separate stencil buffer):
+    *
+    * "[DevSNB] Errata: Sampler MSAA Qpitch will be 4 greater than the value
+    *  calculated in the equation above , for every other odd Surface Height
+    *  starting from 1 i.e. 1,5,9,13"
+    *
+    * Since this Qpitch errata only impacts the sampler, we have to adjust the
+    * input for the rendering surface to achieve the same qpitch. For the
+    * affected heights, we increment the height by 1 for the rendering
+    * surface.
+    */
+   int height0 = irb->mt->logical_height0;
+   if (brw->gen == 6 && irb->mt->num_samples > 1 && (height0 % 4) == 1)
+      height0++;
+
    surf[2] = SET_FIELD(mt->logical_width0 - 1, BRW_SURFACE_WIDTH) |
-             SET_FIELD(mt->logical_height0 - 1, BRW_SURFACE_HEIGHT) |
+             SET_FIELD(height0 - 1, BRW_SURFACE_HEIGHT) |
              SET_FIELD(irb->mt_level - irb->mt->first_level, BRW_SURFACE_LOD);
 
    surf[3] = brw_get_surface_tiling_bits(mt->tiling) |