summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorTopi Pohjolainen <[email protected]>2016-04-27 12:53:39 +0300
committerTopi Pohjolainen <[email protected]>2016-04-27 19:57:40 +0300
commitaef6a6c382f74a164431257eb09eec269773acb3 (patch)
tree25d13a35c49f18ef2b6244ebda2576eea5e8b0f2 /src/mesa/drivers
parent1d242b688265a405dfd8077ea32ac4ea673b02a2 (diff)
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 <[email protected]> Signed-off-by: Topi Pohjolainen <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/i965/gen8_blorp.c18
1 files 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 720f5244ca2..5cd070fa473 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,