nir/lower_atomics: add support for bindless_image_atomic

Initial data is loaded via bindless_image_load, atomic swap via
bindless_image_atomic_swap.

Signed-off-by: Job Noorman <jnoorman@igalia.com>
Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@intel.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39932>
This commit is contained in:
Job Noorman 2026-04-11 14:02:11 +02:00 committed by Marge Bot
parent e0c07c42e0
commit b8437e30bf

View file

@ -67,6 +67,15 @@ build_atomic(nir_builder *b, nir_intrinsic_instr *intr)
load = nir_load_global(b, 1, intr->def.bit_size, intr->src[0].ssa,
.access = ACCESS_ATOMIC | ACCESS_COHERENT);
break;
case nir_intrinsic_bindless_image_atomic:
load = nir_bindless_image_load(
b, 1, intr->def.bit_size, intr->src[0].ssa, intr->src[1].ssa,
nir_imm_zero(b, 1, 32), intr->src[2].ssa,
.access = ACCESS_ATOMIC | ACCESS_COHERENT,
.format = nir_intrinsic_format(intr),
.image_dim = nir_intrinsic_image_dim(intr),
.image_array = nir_intrinsic_image_array(intr));
break;
default:
UNREACHABLE("unsupported atomic type");
}
@ -104,6 +113,15 @@ build_atomic(nir_builder *b, nir_intrinsic_instr *intr)
before, expected,
.atomic_op = nir_atomic_op_cmpxchg);
break;
case nir_intrinsic_bindless_image_atomic:
xchg = nir_bindless_image_atomic_swap(
b, intr->def.bit_size, intr->src[0].ssa, intr->src[1].ssa,
intr->src[2].ssa, before, expected,
.atomic_op = nir_atomic_op_cmpxchg,
.format = nir_intrinsic_format(intr),
.image_dim = nir_intrinsic_image_dim(intr),
.image_array = nir_intrinsic_image_array(intr));
break;
default:
UNREACHABLE("unsupported atomic type");
}
@ -124,7 +142,8 @@ lower_atomics(struct nir_builder *b, nir_intrinsic_instr *intr,
if (intr->intrinsic != nir_intrinsic_ssbo_atomic &&
intr->intrinsic != nir_intrinsic_shared_atomic &&
intr->intrinsic != nir_intrinsic_global_atomic)
intr->intrinsic != nir_intrinsic_global_atomic &&
intr->intrinsic != nir_intrinsic_bindless_image_atomic)
return false;
if (supported_cb(&intr->instr, NULL))
return false;