From: Chad Versace <chad.vers...@intel.com> ... when a HiZ region is present. Also change the hiz bits and depth format in 3D_STATE_DEPTH_BUFFER.
Signed-off-by: Chad Versace <chad.vers...@intel.com> --- src/mesa/drivers/dri/i965/brw_misc_state.c | 47 +++++++++++++++++++++++++--- 1 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_misc_state.c b/src/mesa/drivers/dri/i965/brw_misc_state.c index 8d1832d..874a1d5 100644 --- a/src/mesa/drivers/dri/i965/brw_misc_state.c +++ b/src/mesa/drivers/dri/i965/brw_misc_state.c @@ -32,6 +32,7 @@ #include "intel_batchbuffer.h" +#include "intel_fbo.h" #include "intel_regions.h" #include "brw_context.h" @@ -188,15 +189,21 @@ const struct brw_tracked_state brw_psp_urb_cbs = { static void prepare_depthbuffer(struct brw_context *brw) { struct intel_region *depth_region = brw->state.depth_region; + struct intel_region *hiz_region = + intel_framebuffer_get_hiz_region(brw->intel.ctx.DrawBuffer); if (depth_region != NULL) brw_add_validated_bo(brw, depth_region->buffer); + if (hiz_region != NULL) + brw_add_validated_bo(brw, hiz_region->buffer); } static void emit_depthbuffer(struct brw_context *brw) { struct intel_context *intel = &brw->intel; struct intel_region *depth_region = brw->state.depth_region; + struct intel_region *hiz_region = + intel_framebuffer_get_hiz_region(intel->ctx.DrawBuffer); unsigned int len; if (intel->gen >= 6) @@ -232,8 +239,12 @@ static void emit_depthbuffer(struct brw_context *brw) case 4: if (intel->depth_buffer_is_float) format = BRW_DEPTHFORMAT_D32_FLOAT; - else - format = BRW_DEPTHFORMAT_D24_UNORM_S8_UINT; + else { + if (hiz_region) + format = BRW_DEPTHFORMAT_D24_UNORM_X8_UINT; + else + format = BRW_DEPTHFORMAT_D24_UNORM_S8_UINT; + } break; default: assert(0); @@ -241,11 +252,18 @@ static void emit_depthbuffer(struct brw_context *brw) } assert(depth_region->tiling != I915_TILING_X); - assert(intel->gen < 6 || depth_region->tiling == I915_TILING_Y); + /* + * If HiZ is enabled on Gen5, then Y tiling must be used. See Vol 2, + * Section 11.5.6.1 3DSTATE_DEPTH_BUFFER, Bit 1.27 "Tiled Surface". + */ + assert((intel->gen < 6 && !hiz_region) + || depth_region->tiling == I915_TILING_Y); BEGIN_BATCH(len); OUT_BATCH(_3DSTATE_DEPTH_BUFFER << 16 | (len - 2)); OUT_BATCH(((depth_region->pitch * depth_region->cpp) - 1) | + ((hiz_region ? 1 : 0) << 21) | /* hiearchical depth buffer enable */ + ((hiz_region ? 1 : 0) << 22) | /* separate stencil buffer enable */ (format << 18) | (BRW_TILEWALK_YMAJOR << 26) | ((depth_region->tiling != I915_TILING_NONE) << 27) | @@ -267,8 +285,27 @@ static void emit_depthbuffer(struct brw_context *brw) ADVANCE_BATCH(); } - /* Initialize it for safety. */ - if (intel->gen >= 6) { + /* Emit batch for HiZ buffer. */ + if (hiz_region) { + BEGIN_BATCH(3); + OUT_BATCH((_3DSTATE_HIER_DEPTH_BUFFER << 16) | (3 - 2)); + OUT_BATCH(hiz_region->pitch * hiz_region->cpp - 1); + OUT_RELOC(hiz_region->buffer, + I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, + 0); + ADVANCE_BATCH(); + } + + /* + * Emit clear params for safety. + * + * If hiz is enabled, then clear params must be emitted. From Vol 2, + * Section 11.5.6.4.1 3DSTATE_CLEAR_PARAMS: + * [DevIL], [DevSNB] 3DSTATE_CLEAR_PARAMS packet must follow the + * DEPTH_BUFFER_STATE packet when HiZ is enabled and the DEPTH_BUFFER_STATE + * changes. + */ + if (intel->gen >= 6 || hiz_region) { BEGIN_BATCH(2); OUT_BATCH(_3DSTATE_CLEAR_PARAMS << 16 | (2 - 2)); OUT_BATCH(0); -- 1.7.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev