From 9e5d11bff3abb8dee8f1cdce8ce301b6289ef730 Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Fri, 27 Jun 2025 12:58:13 +0200 Subject: [PATCH] r600: fix emit_ssbo_store() wrmask compatibility This issue was generating unwanted write accesses that could overwrite previous operations. Note: This functionality could also be tested with nir_lower_wrmasks. This problem seems to only affect the ssbos. This change was tested on cypress, barts and cayman. Here are the tests fixed: khr-gl4[3-6]/compute_shader/pipeline-pre-vs: fail pass khr-gl4[5-6]/direct_state_access/queries_functional: fail pass khr-gl4[5-6]/es_31_compatibility/shader_image_load_store/advanced-cast-cs: fail pass khr-gl4[5-6]/es_31_compatibility/shader_image_load_store/advanced-cast-fs: fail pass khr-gl4[5-6]/es_31_compatibility/shader_storage_buffer_object/advanced-switchbuffers-cs: fail pass khr-gl4[5-6]/es_31_compatibility/shader_storage_buffer_object/advanced-switchprograms-cs: fail pass khr-gl4[5-6]/es_31_compatibility/shader_storage_buffer_object/basic-operations-case1-cs: fail pass khr-gl4[3-6]/shader_storage_buffer_object/advanced-switchbuffers-cs: fail pass khr-gl4[3-6]/shader_storage_buffer_object/advanced-switchprograms-cs: fail pass khr-gl4[3-6]/shader_storage_buffer_object/basic-operations-case1-cs: fail pass khr-gl4[4-6]/texture_buffer/texture_buffer_max_size: fail pass khr-gles31/core/compute_shader/pipeline-pre-vs: fail pass khr-gles31/core/shader_image_load_store/advanced-cast-cs: fail pass khr-gles31/core/shader_image_load_store/advanced-cast-fs: fail pass khr-gles31/core/shader_storage_buffer_object/advanced-switchbuffers-cs: fail pass khr-gles31/core/shader_storage_buffer_object/advanced-switchprograms-cs: fail pass khr-gles31/core/shader_storage_buffer_object/basic-operations-case1-cs: fail pass khr-gles31/core/texture_buffer/texture_buffer_max_size: fail pass khr-glesext/texture_buffer/texture_buffer_max_size: fail pass Cc: mesa-stable Signed-off-by: Patrick Lerda Reviewed-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp index e3b0554118b..7e558b83111 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_mem.cpp @@ -618,11 +618,15 @@ RatInstr::emit_ssbo_store(nir_intrinsic_instr *instr, Shader& shader) auto addr_base = vf.temp_register(); auto [offset, rat_id] = shader.evaluate_resource_offset(instr, 1); + const unsigned wrmask = nir_intrinsic_write_mask(instr); shader.emit_instruction( new AluInstr(op2_lshr_int, addr_base, orig_addr, vf.literal(2), AluInstr::write)); for (unsigned i = 0; i < nir_src_num_components(instr->src[0]); ++i) { + if (!(BITFIELD_BIT(i) & wrmask)) + continue; + auto addr_vec = vf.temp_vec4(pin_group, {0, 1, 2, 7}); if (i == 0) { shader.emit_instruction(