Module: Mesa
Branch: main
Commit: 99a4a9c6ff09f4a326341432ca75f18ddcdc0bf8
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=99a4a9c6ff09f4a326341432ca75f18ddcdc0bf8

Author: Mike Blumenkrantz <[email protected]>
Date:   Mon Sep 12 13:13:30 2022 -0400

zink: fix atomic ssbo indexing with non-32bit values

this has to adjust using dest size, not hardcoded as uint32

Fixes: 5a95c6b3282 ("zink: rewrite atomic ssbo intrinsics as atomic derefs")

Reviewed-by: Erik Faye-Lund <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18144>

---

 src/gallium/drivers/zink/zink_compiler.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c 
b/src/gallium/drivers/zink/zink_compiler.c
index 180a1905a89..dce7d53d339 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -1061,8 +1061,8 @@ rewrite_bo_access_instr(nir_builder *b, nir_instr *instr, 
void *data)
    case nir_intrinsic_ssbo_atomic_xor:
    case nir_intrinsic_ssbo_atomic_exchange:
    case nir_intrinsic_ssbo_atomic_comp_swap: {
-      /* convert offset to uint[idx] */
-      nir_ssa_def *offset = nir_udiv_imm(b, intr->src[1].ssa, 4);
+      /* convert offset to uintN_t[idx] */
+      nir_ssa_def *offset = nir_udiv_imm(b, intr->src[1].ssa, 
nir_dest_bit_size(intr->dest) / 8);
       nir_instr_rewrite_src_ssa(instr, &intr->src[1], offset);
       return true;
    }
@@ -1251,11 +1251,9 @@ rewrite_atomic_ssbo_instr(nir_builder *b, nir_instr 
*instr, struct bo_vars *bo)
    default:
       unreachable("unknown intrinsic");
    }
-   /* atomic ops are always 32bit */
-   assert(nir_dest_bit_size(intr->dest) == 32);
    nir_ssa_def *offset = intr->src[1].ssa;
    nir_src *src = &intr->src[0];
-   nir_variable *var = get_bo_var(b->shader, bo, true, src, 32);
+   nir_variable *var = get_bo_var(b->shader, bo, true, src, 
nir_dest_bit_size(intr->dest));
    nir_deref_instr *deref_var = nir_build_deref_var(b, var);
    nir_ssa_def *idx = src->ssa;
    if (bo->first_ssbo)
@@ -1269,7 +1267,7 @@ rewrite_atomic_ssbo_instr(nir_builder *b, nir_instr 
*instr, struct bo_vars *bo)
    for (unsigned i = 0; i < num_components; i++) {
       nir_deref_instr *deref_arr = nir_build_deref_array(b, deref_struct, 
offset);
       nir_intrinsic_instr *new_instr = nir_intrinsic_instr_create(b->shader, 
op);
-      nir_ssa_dest_init(&new_instr->instr, &new_instr->dest, 1, 32, "");
+      nir_ssa_dest_init(&new_instr->instr, &new_instr->dest, 1, 
nir_dest_bit_size(intr->dest), "");
       new_instr->src[0] = nir_src_for_ssa(&deref_arr->dest.ssa);
       /* deref ops have no offset src, so copy the srcs after it */
       for (unsigned i = 2; i < nir_intrinsic_infos[intr->intrinsic].num_srcs; 
i++)

Reply via email to