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