zink: handle global atomic intrinsics

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24859>
This commit is contained in:
Mike Blumenkrantz
2022-10-06 11:55:56 -04:00
committed by Marge Bot
parent ef6725a5f4
commit 2ff560514b

View File

@@ -2784,6 +2784,31 @@ emit_shared_atomic_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
handle_atomic_op(ctx, intr, ptr, param, param2, ret_type);
}
static void
emit_global_atomic_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
{
unsigned bit_size = nir_src_bit_size(intr->src[1]);
SpvId dest_type = get_def_type(ctx, &intr->def, nir_type_uint);
nir_alu_type atype;
nir_alu_type ret_type = nir_atomic_op_type(nir_intrinsic_atomic_op(intr)) == nir_type_float ? nir_type_float : nir_type_uint;
SpvId param = get_src(ctx, &intr->src[1], &atype);
spirv_builder_emit_cap(&ctx->builder, SpvCapabilityPhysicalStorageBufferAddresses);
SpvId pointer_type = spirv_builder_type_pointer(&ctx->builder,
SpvStorageClassPhysicalStorageBuffer,
dest_type);
SpvId ptr = emit_bitcast(ctx, pointer_type, get_src(ctx, &intr->src[0], &atype));
if (bit_size == 64)
spirv_builder_emit_cap(&ctx->builder, SpvCapabilityInt64Atomics);
SpvId param2 = 0;
if (intr->intrinsic == nir_intrinsic_global_atomic_swap)
param2 = get_src(ctx, &intr->src[2], &atype);
handle_atomic_op(ctx, intr, ptr, param, param2, ret_type);
}
static void
emit_get_ssbo_size(struct ntv_context *ctx, nir_intrinsic_instr *intr)
{
@@ -3283,6 +3308,11 @@ emit_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
emit_shared_atomic_intrinsic(ctx, intr);
break;
case nir_intrinsic_global_atomic:
case nir_intrinsic_global_atomic_swap:
emit_global_atomic_intrinsic(ctx, intr);
break;
case nir_intrinsic_begin_invocation_interlock:
case nir_intrinsic_end_invocation_interlock:
spirv_builder_emit_interlock(&ctx->builder, intr->intrinsic == nir_intrinsic_end_invocation_interlock);