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++)
