agx: Legalize image MS index

Fix 2D MSAA Array tests in arb_shader_image_load_store-max-size

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26056>
This commit is contained in:
Alyssa Rosenzweig
2023-10-23 08:38:05 -04:00
committed by Marge Bot
parent 019a52fff0
commit b6b01aa1f2
2 changed files with 12 additions and 7 deletions

View File

@@ -890,7 +890,11 @@ agx_emit_image_load(agx_builder *b, agx_index dst, nir_intrinsic_instr *intr)
if (is_array && is_ms) {
agx_index layer = agx_temp(b->shader, AGX_SIZE_16);
agx_subdivide_to(b, layer, coord[coord_comps], 0);
coord[coord_comps++] = agx_vec2(b, ms_index, layer);
assert(ms_index.size == AGX_SIZE_16);
agx_index vec = agx_vec2(b, ms_index, layer);
vec.size = AGX_SIZE_32;
coord[coord_comps++] = vec;
} else if (is_ms) {
agx_index tmp = agx_temp(b->shader, AGX_SIZE_32);
agx_mov_to(b, tmp, ms_index);

View File

@@ -455,7 +455,7 @@ image_texel_address(nir_builder *b, nir_intrinsic_instr *intr,
return libagx_buffer_texel_address(b, meta_ptr, coord, blocksize_B);
} else {
return libagx_image_texel_address(
b, meta_ptr, coord, intr->src[2].ssa, blocksize_B,
b, meta_ptr, coord, nir_u2u32(b, intr->src[2].ssa), blocksize_B,
nir_imm_bool(b, dim == GLSL_SAMPLER_DIM_MS), nir_imm_bool(b, layered),
nir_imm_bool(b, return_index));
}
@@ -515,6 +515,9 @@ lower_images(nir_builder *b, nir_intrinsic_instr *intr, UNUSED void *data)
case nir_intrinsic_image_store:
case nir_intrinsic_bindless_image_load:
case nir_intrinsic_bindless_image_store: {
/* Legalize MSAA index */
nir_src_rewrite(&intr->src[2], nir_u2u16(b, intr->src[2].ssa));
switch (nir_intrinsic_image_dim(intr)) {
case GLSL_SAMPLER_DIM_1D:
lower_1d_image(b, intr);
@@ -525,15 +528,13 @@ lower_images(nir_builder *b, nir_intrinsic_instr *intr, UNUSED void *data)
return true;
case GLSL_SAMPLER_DIM_CUBE:
if (nir_intrinsic_image_array(intr)) {
if (nir_intrinsic_image_array(intr))
lower_cube_array_image(b, intr);
return true;
}
return false;
return true;
default:
return false;
return true;
}
}