From 37cd2b2c41337ab85c779bb50a8b8aebe2004d6d Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Mon, 15 Dec 2025 15:01:14 +0100 Subject: [PATCH] r600: fix cayman address bound tests This change updates r600_legalize_image_load_store() to fix these issues. This change fixes on cayman the tests below which were failing: spec/arb_shader_image_load_store/invalid/imageload/address bounds test/image2d/.*: fail pass Fixes: 27f515777741 ("r600/sfn: Add lowering pass to legalize image access") Signed-off-by: Patrick Lerda --- .../sfn/sfn_nir_legalize_image_load_store.cpp | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp b/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp index e8ca9667fac..d4306486c86 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp @@ -22,15 +22,36 @@ r600_legalize_image_load_store_impl(nir_builder *b, b->cursor = nir_before_instr(instr); auto ir = nir_instr_as_intrinsic(instr); - nir_def *default_value = nir_imm_vec4(b, 0.0, 0.0, 0.0, 0.0); + nir_def *default_value, *zero_value; nir_def *result = NIR_LOWER_INSTR_PROGRESS_REPLACE; bool load_value = ir->intrinsic != nir_intrinsic_image_store; - if (load_value) - default_value = - nir_imm_zero(b, ir->def.num_components, ir->def.bit_size); + if (load_value) { + const enum pipe_format format = nir_intrinsic_format(ir); + + zero_value = nir_imm_zero(b, ir->def.num_components, ir->def.bit_size); + + if (ir->def.num_components == 4 && !util_format_has_alpha(format)) { + const nir_alu_type type = + nir_alu_type_get_base_type(nir_intrinsic_dest_type(ir)); + + switch (type) { + case nir_type_int: + case nir_type_uint: + default_value = nir_imm_ivec4_intN(b, 0, 0, 0, 1, ir->def.bit_size); + break; + case nir_type_float: + default: + default_value = nir_imm_vec4(b, 0.0, 0.0, 0.0, 1.0); + } + } else { + default_value = zero_value; + } + } else { + default_value = zero_value = nir_imm_vec4(b, 0.0, 0.0, 0.0, 0.0); + } auto image_exists = nir_ult_imm(b, ir->src[0].ssa, b->shader->info.num_images); @@ -140,7 +161,7 @@ r600_legalize_image_load_store_impl(nir_builder *b, nir_pop_if(b, else_exists); if (load_value) - result = nir_if_phi(b, result, default_value); + result = nir_if_phi(b, result, zero_value); { nir_cf_list cf_list;