[Mesa-dev] [PATCH v3 10/19] i965/gen6 depth surface: calculate minimum array element being rendered

Jordan Justen jljusten at gmail.com
Fri Aug 1 12:43:38 PDT 2014


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?

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

-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