From d4353d5def09127c976d3b7e5191d997d44ca81b Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Fri, 5 Sep 2025 17:27:53 +0200 Subject: [PATCH] r600: fix emit_ssbo_atomic_op when ssbo_image_offset is non-zero The value read was incorrect. This change was tested on palm, barts and cayman, it fixes all the variants of the advanced-sso-simple test: khr-gl4[56]/es_31_compatibility/shader_image_load_store/advanced-sso-simple: fail pass khr-gles31/core/shader_image_load_store/advanced-sso-simple: fail pass Cc: mesa-stable Signed-off-by: Patrick Lerda Part-of: (cherry picked from commit 06da0e7310ce9e73f30091e733f3eb96406abbfb) --- .pick_status.json | 2 +- src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp | 16 ++++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 6b6708c1c82..ec1b59df217 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -4144,7 +4144,7 @@ "description": "r600: fix emit_ssbo_atomic_op when ssbo_image_offset is non-zero", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp index 9eb5de701a0..0779fdafab8 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp @@ -717,8 +717,7 @@ RatInstr::emit_ssbo_atomic_op(nir_intrinsic_instr *intr, Shader& shader) { auto& vf = shader.value_factory(); auto [imageid, image_offset] = shader.evaluate_resource_offset(intr, 0); - { - } + const unsigned res_id = imageid + shader.ssbo_image_offset(); bool read_result = !list_is_empty(&intr->def.uses); auto opcode = read_result ? get_rat_opcode(nir_intrinsic_atomic_op(intr)) @@ -750,15 +749,8 @@ RatInstr::emit_ssbo_atomic_op(nir_intrinsic_instr *intr, Shader& shader) RegisterVec4 out_vec(coord, coord, coord, coord, pin_chgr); - auto atomic = new RatInstr(cf_mem_rat, - opcode, - data_vec4, - out_vec, - imageid + shader.ssbo_image_offset(), - image_offset, - 1, - 0xf, - 0); + auto atomic = + new RatInstr(cf_mem_rat, opcode, data_vec4, out_vec, res_id, image_offset, 1, 0xf, 0); shader.emit_instruction(atomic); atomic->set_ack(); @@ -775,7 +767,7 @@ RatInstr::emit_ssbo_atomic_op(nir_intrinsic_instr *intr, Shader& shader) fmt_32, vtx_nf_int, vtx_es_none, - R600_IMAGE_IMMED_RESOURCE_OFFSET + imageid, + R600_IMAGE_IMMED_RESOURCE_OFFSET + res_id, image_offset); fetch->set_mfc(15); fetch->set_fetch_flag(FetchInstr::srf_mode);