diff options
author | Chad Versace <[email protected]> | 2011-12-21 17:09:58 -0800 |
---|---|---|
committer | Chad Versace <[email protected]> | 2012-01-10 15:52:38 -0800 |
commit | 06ad9adcb031b97af2ce9cd22b919b8befcec43b (patch) | |
tree | 0ab7a009b8241d2cb75f32b1e4d242ddf05ca687 /src/mesa/drivers/dri/i965/gen7_misc_state.c | |
parent | bebc91f0f3a1f2d19d36a7f1a4f7c992ace064e9 (diff) |
i965/gen7: Enable HiZ
This patch modifies all batches needed for HiZ. The batch length for
3DSTATE_HIER_DEPTH_BUFFER is also corrected from 4 to 3.
Performance +6.7% on Citybench.
num-frames: 400
resolution: 1918x1031
avg-hiz-off: 127.90 fps
avg-hiz-on: 136.50 fps
kernel: git://people.freedesktop.org/~anholt/linux.git branch=gen7-reset-sol sha=23360e4
Reviewed-by: Eric Anholt <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Signed-off-by: Chad Versace <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen7_misc_state.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/gen7_misc_state.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/mesa/drivers/dri/i965/gen7_misc_state.c b/src/mesa/drivers/dri/i965/gen7_misc_state.c index 9c93046fdfb..f28748597a1 100644 --- a/src/mesa/drivers/dri/i965/gen7_misc_state.c +++ b/src/mesa/drivers/dri/i965/gen7_misc_state.c @@ -38,11 +38,16 @@ static void emit_depthbuffer(struct brw_context *brw) /* _NEW_BUFFERS */ struct intel_renderbuffer *drb = intel_get_renderbuffer(fb, BUFFER_DEPTH); struct intel_renderbuffer *srb = intel_get_renderbuffer(fb, BUFFER_STENCIL); - struct intel_mipmap_tree *depth_mt = NULL, *stencil_mt = NULL; + struct intel_mipmap_tree *depth_mt = NULL, + *stencil_mt = NULL, + *hiz_mt = NULL; if (drb) depth_mt = drb->mt; + if (depth_mt) + hiz_mt = depth_mt->hiz_mt; + if (srb) { stencil_mt = srb->mt; if (stencil_mt->stencil_mt) @@ -97,7 +102,7 @@ static void emit_depthbuffer(struct brw_context *brw) OUT_BATCH(GEN7_3DSTATE_DEPTH_BUFFER << 16 | (7 - 2)); OUT_BATCH(((region->pitch * region->cpp) - 1) | (brw_depthbuffer_format(brw) << 18) | - (0 << 22) /* no HiZ buffer */ | + ((hiz_mt ? 1 : 0) << 22) | /* hiz enable */ ((stencil_mt != NULL && ctx->Stencil.WriteMask != 0) << 27) | ((ctx->Depth.Mask != 0) << 28) | (BRW_SURFACE_2D << 29)); @@ -112,12 +117,22 @@ static void emit_depthbuffer(struct brw_context *brw) ADVANCE_BATCH(); } - BEGIN_BATCH(4); - OUT_BATCH(GEN7_3DSTATE_HIER_DEPTH_BUFFER << 16 | (4 - 2)); - OUT_BATCH(0); - OUT_BATCH(0); - OUT_BATCH(0); - ADVANCE_BATCH(); + if (hiz_mt == NULL) { + BEGIN_BATCH(5); + OUT_BATCH(GEN7_3DSTATE_HIER_DEPTH_BUFFER << 16 | (3 - 2)); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + } else { + BEGIN_BATCH(5); + OUT_BATCH(GEN7_3DSTATE_HIER_DEPTH_BUFFER << 16 | (3 - 2)); + OUT_BATCH(hiz_mt->region->pitch * hiz_mt->region->cpp - 1); + OUT_RELOC(hiz_mt->region->bo, + I915_GEM_DOMAIN_RENDER, + I915_GEM_DOMAIN_RENDER, + 0); + ADVANCE_BATCH(); + } if (stencil_mt == NULL) { BEGIN_BATCH(3); |