hsw hiz: Add new size restrictions for miplevels > 0
authorJordan Justen <jordan.l.justen@intel.com>
Tue, 16 Jul 2013 07:01:05 +0000 (00:01 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Sun, 4 Aug 2013 18:52:37 +0000 (11:52 -0700)
When performing hiz ops, we must ensure that the region sizes
have an 8 aligned width and 4 aligned height. We can tweak the
size for blorp hiz operations at LOD 0, but for the others we
can't. Therefore, we disable hiz for these miplevels if they
don't meet the size alignment requirements.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/intel_mipmap_tree.c

index 36a080f8f74bb6ab2f89d4e2677ab25c5748313d..d6988e0019157d4d9c6213834b6c1e69ead05349 100644 (file)
@@ -1264,9 +1264,19 @@ intel_miptree_slice_enable_hiz(struct brw_context *brw,
        * stencil buffer tile size, 64x64 pixels, then
        * 3DSTATE_DEPTH_BUFFER.Depth_Coordinate_Offset_X/Y is set to 0.
        */
-      uint32_t depth_x_offset = mt->level[level].slice[layer].x_offset;
-      uint32_t depth_y_offset = mt->level[level].slice[layer].y_offset;
-      if ((depth_x_offset & 63) || (depth_y_offset & 63)) {
+      const struct intel_mipmap_level *l = &mt->level[level];
+      const struct intel_mipmap_slice *s = &l->slice[layer];
+      if ((s->x_offset & 63) || (s->y_offset & 63)) {
+         return false;
+      }
+
+      /* Disable HiZ for LOD > 0 unless the width is 8 aligned
+       * and the height is 4 aligned. This allows our HiZ support
+       * to fulfill Haswell restrictions for HiZ ops. For LOD == 0,
+       * we can grow the width & height to allow the HiZ op to
+       * force the proper size alignments.
+       */
+      if (level > 0 && ((l->width & 7) || (l->height & 3))) {
          return false;
       }
    }