zink: fix atomic ssbo indexing with non-32bit values
this has to adjust using dest size, not hardcoded as uint32
Fixes: 5a95c6b328
("zink: rewrite atomic ssbo intrinsics as atomic derefs")
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18144>
This commit is contained in:

committed by
Marge Bot

parent
9016943185
commit
99a4a9c6ff
@@ -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++)
|
||||
|
Reference in New Issue
Block a user