From d92ce8566b015fba5352e1080713f90e2ad1efb0 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Fri, 22 Jul 2022 15:51:50 +0200 Subject: [PATCH] r600/sfn: Fix used of local shared write mask Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_shader.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_shader.cpp b/src/gallium/drivers/r600/sfn/sfn_shader.cpp index f123d2dc929..61fd0849eb7 100644 --- a/src/gallium/drivers/r600/sfn/sfn_shader.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_shader.cpp @@ -982,12 +982,15 @@ bool Shader::emit_local_store(nir_intrinsic_instr *instr) unsigned write_mask = nir_intrinsic_write_mask(instr); auto address = value_factory().src(instr->src[1], 0); - int swizzle_base = (write_mask & 0x3) ? 0 : 2; - write_mask |= write_mask >> 2; + int swizzle_base = 0; + unsigned w = write_mask; + while (!(w & 1)) { + ++swizzle_base; + w >>= 1; + } + write_mask = write_mask >> swizzle_base; if ((write_mask & 3) != 3) { - if (write_mask == 2) - swizzle_base += 1; auto value = value_factory().src(instr->src[0], swizzle_base); emit_instruction(new LDSAtomicInstr(LDS_WRITE, nullptr, address, {value})); } else {