i965/Gen6: Work around GPU hangs due to misaligned depth coordinate offsets.
authorPaul Berry <stereotype441@gmail.com>
Thu, 26 Apr 2012 13:35:56 +0000 (06:35 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 7 May 2012 17:50:04 +0000 (10:50 -0700)
commita683012a80a3408b3b71f22b2a97d9eaaac11a46
treeaef2b70bd95c3448416c088b76f35de4917fc56b
parentb9819a027d08b38abb380526bed9f2908ffeb507
i965/Gen6: Work around GPU hangs due to misaligned depth coordinate offsets.

In i965 Gen6, 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.

(Note that we have only ever observed this GPU hang on Gen6 when HiZ
is enabled, so another possible stopgap would be to disable HiZ).

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

Reviewed-by: Chad Verace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/i965/brw_misc_state.c
src/mesa/drivers/dri/i965/gen6_hiz.c