[Mesa-dev] [PATCH] i965/blorp/gen8: Fix blitting of interleaved msaa surfaces

Kenneth Graunke kenneth at whitecape.org
Wed Apr 27 16:17:32 UTC 2016


On Wednesday, April 27, 2016 3:14:23 PM PDT Topi Pohjolainen wrote:
> Fixes ES31-CTS.gtf.GL31Tests.texture_stencil8.texture_stencil8_multisample.
> 
> Current logic divides given layer of one by number of samples (four)
> trashing the layer to zero. Layer adjustment is only to be used with
> non-interleaved msaa surfaces where samples for particular layer are
> in multiple slices.
> 
> I copy-pasted a bit of documentation from
> brw_blorp.c::brw_blorp_compute_tile_offsets().
> 
> Also took the opportunity to fix the comment regarding sampling
> as 2D, cube textures are the only exception.
> 
> CC: Kenneth Graunke <kenneth at whitecape.org>
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
>  src/mesa/drivers/dri/i965/gen8_blorp.c | 18 ++++++++++++++++--
>  1 file changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/gen8_blorp.c b/src/mesa/drivers/dri/
i965/gen8_blorp.c
> index 43eb4a7..c5aeea4 100644
> --- a/src/mesa/drivers/dri/i965/gen8_blorp.c
> +++ b/src/mesa/drivers/dri/i965/gen8_blorp.c
> @@ -601,14 +601,28 @@ gen8_blorp_emit_surface_states(struct brw_context 
*brw,
>        const struct brw_blorp_surface_info *surface = &params->src;
>        struct intel_mipmap_tree *mt = surface->mt;
>  
> -      /* Textures are always sampled as 2D. */
> +      /* If src is a 2D multisample array texture on Gen7+ using
> +       * INTEL_MSAA_LAYOUT_UMS or INTEL_MSAA_LAYOUT_CMS, src layer is the
> +       * physical layer holding sample 0.  So, for example, if mt-
>num_samples
> +       * == 4, then logical layer n corresponds to layer == 4*n.
> +       *
> +       * Multisampled depth and stencil surfaces have the samples 
interleaved
> +       * (INTEL_MSAA_LAYOUT_IMS) and therefore the layer doesn't need
> +       * adjustment.
> +       */
> +      const unsigned layer_divider =
> +         (mt->msaa_layout == INTEL_MSAA_LAYOUT_UMS ||
> +          mt->msaa_layout == INTEL_MSAA_LAYOUT_CMS) ?
> +         MAX2(mt->num_samples, 1) : 1;
> +
> +      /* Cube textures are sampled as 2D array. */
>        const bool is_cube = mt->target == GL_TEXTURE_CUBE_MAP_ARRAY ||
>                             mt->target == GL_TEXTURE_CUBE_MAP;
>        const unsigned depth = (is_cube ? 6 : 1) * mt->logical_depth0;
>        const GLenum target = is_cube ? GL_TEXTURE_2D_ARRAY : mt->target;
>        const unsigned max_level = surface->level + mt->last_level + 1;
>        const unsigned layer = mt->target != GL_TEXTURE_3D ?
> -                                surface->layer / MAX2(mt->num_samples, 1) : 
0;
> +                                surface->layer / layer_divider : 0;
>  
>        brw->vtbl.emit_texture_surface_state(brw, mt, target,
>                                             layer, layer + depth,
> 

Topi, you rock!  I spent all day looking for this bug.  Once you see it,
it becomes obvious :)

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

It looks like Gen7 is still using tile_x/tile_y to access levels/layers;
otherwise it would need the equivalent fix, too.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160427/37680a7f/attachment-0001.sig>


More information about the mesa-dev mailing list