[Mesa-dev] [PATCH v3 10/19] i965/gen6 depth surface: calculate minimum array element being rendered
Pohjolainen, Topi
topi.pohjolainen at intel.com
Mon Aug 4 01:39:03 PDT 2014
On Fri, Aug 01, 2014 at 12:43:38PM -0700, Jordan Justen wrote:
> On Fri, Aug 1, 2014 at 2:44 AM, Pohjolainen, Topi
> <topi.pohjolainen at intel.com> wrote:
> > On Fri, Aug 01, 2014 at 12:53:40AM -0700, Jordan Justen wrote:
> >> (a23cfb8 for gen6)
> >>
> >> In layered rendering this will be 0. Otherwise it will be the
> >> selected slice.
> >>
> >> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> >> ---
> >> src/mesa/drivers/dri/i965/gen6_blorp.cpp | 3 +++
> >> src/mesa/drivers/dri/i965/gen6_depth_state.c | 10 ++++++++++
> >> 2 files changed, 13 insertions(+)
> >>
> >> diff --git a/src/mesa/drivers/dri/i965/gen6_blorp.cpp b/src/mesa/drivers/dri/i965/gen6_blorp.cpp
> >> index 131c4aa..ff1732d 100644
> >> --- a/src/mesa/drivers/dri/i965/gen6_blorp.cpp
> >> +++ b/src/mesa/drivers/dri/i965/gen6_blorp.cpp
> >> @@ -793,6 +793,7 @@ gen6_blorp_emit_depth_stencil_config(struct brw_context *brw,
> >> uint32_t tile_mask_x, tile_mask_y;
> >> 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;
> >>
> >> @@ -818,6 +819,8 @@ gen6_blorp_emit_depth_stencil_config(struct brw_context *brw,
> >> NULL,
> >> &tile_mask_x, &tile_mask_y);
> >>
> >> + min_array_element = params->depth.layer;
> >
> > This could be slightly simpler:
> >
> > const unsigned min_array_element = params->depth.layer;
> >
> >> +
> >> lod = params->depth.level - params->depth.mt->first_level;
> >>
> >> /* 3DSTATE_DEPTH_BUFFER */
> >> diff --git a/src/mesa/drivers/dri/i965/gen6_depth_state.c b/src/mesa/drivers/dri/i965/gen6_depth_state.c
> >> index 1f36ed8..5e3981c 100644
> >> --- a/src/mesa/drivers/dri/i965/gen6_depth_state.c
> >> +++ b/src/mesa/drivers/dri/i965/gen6_depth_state.c
> >> @@ -48,6 +48,7 @@ gen6_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;
> >> @@ -100,6 +101,15 @@ gen6_emit_depth_stencil_hiz(struct brw_context *brw,
> >> break;
> >> }
> >>
> >> + if (fb->MaxNumLayers > 0 || !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;
> >
> > I still don't understand this. This would be needed only for surfaces were
> > samples indices are in their own layers. On gen6 this is never the case as
> > all the surfaces are interleaved (i.e., samples are in the same physical
> > layer). Moreover, this is true also on gen7 for depth surfaces - and hence
> > I'm also questioning the existing logic in the gen7 specific path.
>
> I looked again, and I think gen7/gen8 does not divide by num_samples
> for depth state. (Chris changed this in 77d55ef4.) It does in
> gen7_wm_surface_state.c.
>
> A piglit run verifies that this works for gen6:
> const unsigned min_array_element = irb ? irb->mt_layer : 0;
> This matches gen7 & gen8 for depth state, so I'll change to this.
> Would that get an r-b from you for this patch?
Sure.
>
> But delving further into the "divide by num_samples" question,
> git grep -C5 "mt_layer =" src/mesa/drivers/dri/i965
> turned up some interesting results.
>
> intel_fbo.c:
> irb->mt_layer = layer_multiplier * layer;
> (For gen7+ UMS/CMS layer_multiplier = mt->num_samples)
>
> intel_fbo.h:
> * Note: for a 2D multisample array texture on Gen7+ using
> * INTEL_MSAA_LAYOUT_UMS or INTEL_MSAA_LAYOUT_CMS, mt_layer is the physical
> * layer holding sample 0. So, for example, if mt->num_samples == 4, then
> * logical layer n corresponds to mt_layer == 4*n.
>
> intel_mipmap_tree.c:compute_msaa_layout always returns IMS for depth,
> so that explains why in all cases we don't divide by num_samples for
> depth.
>
> It might be better to make a helper routine that adjusts layer based
> on the msaa layout type. Basically if UMS/CMS, divide by num_samples.
>
> Right now there is a lot of code path knowledge in this calculation.
> For instance:
> * on depth paths we are using IMS, so don't divide
> * on gen6 we only use IMS for color, so don't divide
> * on gen7/8 color, we are using UMS/CMS, so divide
Thanks for clarifying all this. And the helper sounds like a really good idea.
>
> -Jordan
>
> >> + } else {
> >> + min_array_element = irb->mt_layer;
> >> + }
> >> +
> >> lod = irb ? irb->mt_level - irb->mt->first_level : 0;
> >>
> >> BEGIN_BATCH(7);
> >> --
> >> 2.0.1
> >>
> >> _______________________________________________
> >> mesa-dev mailing list
> >> mesa-dev at lists.freedesktop.org
> >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list