From: Topi Pohjolainen Date: Wed, 27 Apr 2016 09:53:39 +0000 (+0300) Subject: i965/blorp/gen8: Fix blitting of interleaved msaa surfaces X-Git-Tag: upstream/17.1.0~10526 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aef6a6c382f74a164431257eb09eec269773acb3;p=platform%2Fupstream%2Fmesa.git i965/blorp/gen8: Fix blitting of interleaved msaa surfaces 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. Reviewed-by: Kenneth Graunke Signed-off-by: Topi Pohjolainen --- diff --git a/src/mesa/drivers/dri/i965/gen8_blorp.c b/src/mesa/drivers/dri/i965/gen8_blorp.c index 720f524..5cd070f 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 = ¶ms->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,