From a23cfb86489af20ddc1f67395b1552560001f0d0 Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Tue, 9 Jul 2013 15:24:56 -0700 Subject: [PATCH] gen7 depth surface: calculate minimum array element being rendered In layered rendering this will be 0. Otherwise it will be the selected slice. Signed-off-by: Jordan Justen Reviewed-by: Paul Berry --- src/mesa/drivers/dri/i965/gen7_blorp.cpp | 7 +++++++ src/mesa/drivers/dri/i965/gen7_misc_state.c | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/mesa/drivers/dri/i965/gen7_blorp.cpp b/src/mesa/drivers/dri/i965/gen7_blorp.cpp index 2ab7c5787e1..9ce1a758399 100644 --- a/src/mesa/drivers/dri/i965/gen7_blorp.cpp +++ b/src/mesa/drivers/dri/i965/gen7_blorp.cpp @@ -665,6 +665,7 @@ gen7_blorp_emit_depth_stencil_config(struct brw_context *brw, uint8_t mocs = brw->is_haswell ? GEN7_MOCS_L3 : 0; uint32_t surftype; unsigned int depth = MAX2(params->depth.mt->logical_depth0, 1); + unsigned int min_array_element; GLenum gl_target = params->depth.mt->target; unsigned int lod; @@ -689,6 +690,12 @@ gen7_blorp_emit_depth_stencil_config(struct brw_context *brw, break; } + min_array_element = params->depth.layer; + if (params->depth.mt->num_samples > 1) { + /* Convert physical layer to logical layer. */ + min_array_element /= params->depth.mt->num_samples; + } + lod = params->depth.level - params->depth.mt->first_level; /* 3DSTATE_DEPTH_BUFFER */ diff --git a/src/mesa/drivers/dri/i965/gen7_misc_state.c b/src/mesa/drivers/dri/i965/gen7_misc_state.c index acbf79d1c3a..e9167b70239 100644 --- a/src/mesa/drivers/dri/i965/gen7_misc_state.c +++ b/src/mesa/drivers/dri/i965/gen7_misc_state.c @@ -45,6 +45,7 @@ gen7_emit_depth_stencil_hiz(struct brw_context *brw, struct gl_framebuffer *fb = ctx->DrawBuffer; uint32_t surftype; unsigned int depth = 1; + unsigned int min_array_element; GLenum gl_target = GL_TEXTURE_2D; unsigned int lod; const struct intel_renderbuffer *irb = NULL; @@ -79,6 +80,15 @@ gen7_emit_depth_stencil_hiz(struct brw_context *brw, break; } + if (fb->Layered || !irb) { + min_array_element = 0; + } else if (irb->mt->num_samples > 1) { + /* Convert physical layer to logical layer. */ + min_array_element = irb->mt_layer / irb->mt->num_samples; + } else { + min_array_element = irb->mt_layer; + } + lod = irb ? irb->mt_level - irb->mt->first_level : 0; /* _NEW_DEPTH, _NEW_STENCIL, _NEW_BUFFERS */ -- 2.30.2