i965/gen5: Fix rendering of depth buffers without stencil [v2]
authorChad Versace <chad.versace@linux.intel.com>
Tue, 17 Jan 2012 23:41:46 +0000 (15:41 -0800)
committerChad Versace <chad.versace@linux.intel.com>
Wed, 18 Jan 2012 01:26:45 +0000 (17:26 -0800)
Fixes the following OGLConform tests on gen5:
    depth-stencil(misc.state_on.depth_int)
    fbo_db_ARBfp(basic.OnlyDepthBuffDrawBufferRender)

The problem was that, if the depth buffer's Mesa format was X8_Z24, then
we emitted the hardware format D24_UNORM_X8. But, on gen5, D24_UNORM_S8
must be emitted.

This bug was introduced by:
    commit d84a180417d1eabd680554970f1eaaa93abcd41e
    Author: Eric Anholt <eric@anholt.net>
    i965: Base HW depth format setup based on MESA_FORMAT, not bpp.

v2: Deref 'intel' directly. Move the branch for newer chipset to top.
    Quote the PRM. As requested by Ken.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=43408
Note: This is a candidate for the 8.0 branch.
Reported-by: Xunx Fang <xunx.fang@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/i965/brw_misc_state.c

index b6bca4ba9970bf19c86327310515e191c5a20bb6..8e59a472bacbd51885023abdaff04df11cfd7ebf 100644 (file)
@@ -223,10 +223,23 @@ brw_depthbuffer_format(struct brw_context *brw)
    case MESA_FORMAT_Z32_FLOAT:
       return BRW_DEPTHFORMAT_D32_FLOAT;
    case MESA_FORMAT_X8_Z24:
-      if (intel->gen >= 5)
+      if (intel->gen >= 6) {
         return BRW_DEPTHFORMAT_D24_UNORM_X8_UINT;
-      else /* Gen4 doesn't support X8; use S8 instead. */
+      } else {
+        /* Use D24_UNORM_S8, not D24_UNORM_X8.
+         *
+         * D24_UNORM_X8 was not introduced until Gen5. (See the Ironlake PRM,
+         * Volume 2, Part 1, Section 8.4.6 "Depth/Stencil Buffer State", Bits
+         * 3DSTATE_DEPTH_BUFFER.Surface_Format).
+         *
+         * However, on Gen5, D24_UNORM_X8 may be used only if separate
+         * stencil is enabled, and we never enable it. From the Ironlake PRM,
+         * same section as above, Bit 3DSTATE_DEPTH_BUFFER.Separate_Stencil_Buffer_Enable:
+         *     If this field is disabled, the Surface Format of the depth
+         *     buffer cannot be D24_UNORM_X8_UINT.
+         */
         return BRW_DEPTHFORMAT_D24_UNORM_S8_UINT;
+      }
    case MESA_FORMAT_S8_Z24:
       return BRW_DEPTHFORMAT_D24_UNORM_S8_UINT;
    case MESA_FORMAT_Z32_FLOAT_X24S8: