From 0cd032e4bb1c8a21e7848a571d8f1ab360955b7d Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 20 Nov 2023 10:26:45 -0400 Subject: [PATCH] asahi: Be robust with arrays of images fixes imageLoad/index bounds test subcase. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/asahi/agx_nir_lower_bindings.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/gallium/drivers/asahi/agx_nir_lower_bindings.c b/src/gallium/drivers/asahi/agx_nir_lower_bindings.c index 877e2df2269..2ba5a7960a8 100644 --- a/src/gallium/drivers/asahi/agx_nir_lower_bindings.c +++ b/src/gallium/drivers/asahi/agx_nir_lower_bindings.c @@ -124,6 +124,16 @@ lower(nir_builder *b, nir_instr *instr, void *data) if (nir_intrinsic_has_atomic_op(intr)) nir_intrinsic_set_atomic_op(intr, op); + /* The driver uploads enough null texture/PBE descriptors for robustness + * given the shader limit, but we still need to clamp since we're lowering + * to bindless so the hardware doesn't know the limit. + * + * The GL spec says out-of-bounds image indexing is undefined, but + * faulting is not acceptable for robustness. + */ + index = + nir_umin(b, index, nir_imm_int(b, b->shader->info.num_images - 1)); + index = nir_iadd_imm(b, nir_imul_imm(b, index, 2), offset); nir_src_rewrite(&intr->src[0], nir_load_texture_handle_agx(b, index)); } else if (instr->type == nir_instr_type_tex) { @@ -153,6 +163,10 @@ lower(nir_builder *b, nir_instr *instr, void *data) if (!index) index = nir_imm_int(b, tex->texture_index); + /* As above */ + index = + nir_umin(b, index, nir_imm_int(b, b->shader->info.num_textures - 1)); + nir_tex_instr_add_src(tex, nir_tex_src_texture_handle, nir_load_texture_handle_agx(b, index)); }