Mesa (8.0): i965/Gen7: Work around GPU hangs due to misaligned depth coordinate offsets.

Paul Berry stereotype441 at kemper.freedesktop.org
Mon Aug 13 20:22:46 UTC 2012


Module: Mesa
Branch: 8.0
Commit: 889cc4d9225084e15b9e8d010e30b31a87dbfd2d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=889cc4d9225084e15b9e8d010e30b31a87dbfd2d

Author: Paul Berry <stereotype441 at gmail.com>
Date:   Thu Apr 26 06:35:56 2012 -0700

i965/Gen7: Work around GPU hangs due to misaligned depth coordinate offsets.

In i965 Gen7, Mesa has for a long time used the "depth coordinate
offset X/Y" settings (in 3DSTATE_DEPTH_BUFFER) to cause the GPU to
render to miplevels other than 0.  Unfortunately, this doesn't work,
because these offsets must be aligned to multiples of 8, and miplevels
in the depth buffer are only guaranteed to be aligned to multiples of
4.  When the offsets aren't aligned to a multiple of 8, the GPU
sometimes hangs.

As a temporary measure, to avoid GPU hangs, this patch smashes the 3
LSB's of "depth coordinate offset X/Y" to 0.  This results in
incorrect rendering to mipmapped depth textures, but that seems like a
reasonable stopgap while we figure out a better solution.

Avoids GPU hangs in piglit test "depthstencil-render-miplevels" at
texture sizes that are not powers of 2.

Reviewed-by: Chad Verace <chad.versace at linux.intel.com>

Cherry-picked from 714b4f6184db84a738cf2d063980f0e19ab03b4b
Conflicts:

	src/mesa/drivers/dri/i965/gen7_misc_state.c

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50271

---

 src/mesa/drivers/dri/i965/gen7_hiz.c        |   18 ++++++++++++++++++
 src/mesa/drivers/dri/i965/gen7_misc_state.c |   18 ++++++++++++++++++
 2 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/gen7_hiz.c b/src/mesa/drivers/dri/i965/gen7_hiz.c
index 34e51ab..962079e 100644
--- a/src/mesa/drivers/dri/i965/gen7_hiz.c
+++ b/src/mesa/drivers/dri/i965/gen7_hiz.c
@@ -349,6 +349,24 @@ gen7_hiz_exec(struct intel_context *intel,
          offset = intel_renderbuffer_tile_offsets(&rb, &tile_x, &tile_y);
       }
 
+      /* According to the Sandy Bridge PRM, volume 2 part 1, pp326-327
+       * (3DSTATE_DEPTH_BUFFER dw5), in the documentation for "Depth
+       * Coordinate Offset X/Y":
+       *
+       *   "The 3 LSBs of both offsets must be zero to ensure correct
+       *   alignment"
+       *
+       * We have no guarantee that tile_x and tile_y are correctly aligned,
+       * since they are determined by the mipmap layout, which is only aligned
+       * to multiples of 4.
+       *
+       * So, to avoid hanging the GPU, just smash the low order 3 bits of
+       * tile_x and tile_y to 0.  This is a temporary workaround until we come
+       * up with a better solution.
+       */
+      tile_x &= ~7;
+      tile_y &= ~7;
+
       intel_emit_depth_stall_flushes(intel);
 
       BEGIN_BATCH(7);
diff --git a/src/mesa/drivers/dri/i965/gen7_misc_state.c b/src/mesa/drivers/dri/i965/gen7_misc_state.c
index d0ce542..870702f 100644
--- a/src/mesa/drivers/dri/i965/gen7_misc_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_misc_state.c
@@ -93,6 +93,24 @@ static void emit_depthbuffer(struct brw_context *brw)
 
       offset = intel_renderbuffer_tile_offsets(drb, &tile_x, &tile_y);
 
+      /* According to the Sandy Bridge PRM, volume 2 part 1, pp326-327
+       * (3DSTATE_DEPTH_BUFFER dw5), in the documentation for "Depth
+       * Coordinate Offset X/Y":
+       *
+       *   "The 3 LSBs of both offsets must be zero to ensure correct
+       *   alignment"
+       *
+       * We have no guarantee that tile_x and tile_y are correctly aligned,
+       * since they are determined by the mipmap layout, which is only aligned
+       * to multiples of 4.
+       *
+       * So, to avoid hanging the GPU, just smash the low order 3 bits of
+       * tile_x and tile_y to 0.  This is a temporary workaround until we come
+       * up with a better solution.
+       */
+      tile_x &= ~7;
+      tile_y &= ~7;
+
       assert(region->tiling == I915_TILING_Y);
 
       /* _NEW_DEPTH, _NEW_STENCIL */




More information about the mesa-commit mailing list