Mesa (master): zink: handle more ssbo ops in ntv
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jan 28 14:41:40 UTC 2021
Module: Mesa
Branch: master
Commit: deeafe47b6d46a72404133e1ef3dd9819bc07687
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=deeafe47b6d46a72404133e1ef3dd9819bc07687
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Aug 7 19:14:01 2020 -0400
zink: handle more ssbo ops in ntv
this is easiest with a macro since it's already implemented for images
Reviewed-by: Adam Jackson <ajax at redhat.com>
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8628>
---
.../drivers/zink/nir_to_spirv/nir_to_spirv.c | 44 +++++++++++++++-------
1 file changed, 31 insertions(+), 13 deletions(-)
diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 396932acbe9..4ea5d0ec80c 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -163,33 +163,36 @@ static SpvOp
get_atomic_op(nir_intrinsic_op op)
{
switch (op) {
- case nir_intrinsic_ssbo_atomic_add:
- case nir_intrinsic_image_deref_atomic_add:
+#define CASE_ATOMIC_OP(type) \
+ case nir_intrinsic_ssbo_atomic_##type: \
+ case nir_intrinsic_image_deref_atomic_##type
+
+ CASE_ATOMIC_OP(add):
return SpvOpAtomicIAdd;
- case nir_intrinsic_image_deref_atomic_umin:
+ CASE_ATOMIC_OP(umin):
return SpvOpAtomicUMin;
- case nir_intrinsic_image_deref_atomic_imin:
+ CASE_ATOMIC_OP(imin):
return SpvOpAtomicSMin;
- case nir_intrinsic_image_deref_atomic_umax:
+ CASE_ATOMIC_OP(umax):
return SpvOpAtomicUMax;
- case nir_intrinsic_image_deref_atomic_imax:
+ CASE_ATOMIC_OP(imax):
return SpvOpAtomicSMax;
- case nir_intrinsic_image_deref_atomic_and:
+ CASE_ATOMIC_OP(and):
return SpvOpAtomicAnd;
- case nir_intrinsic_image_deref_atomic_or:
+ CASE_ATOMIC_OP(or):
return SpvOpAtomicOr;
- case nir_intrinsic_image_deref_atomic_xor:
+ CASE_ATOMIC_OP(xor):
return SpvOpAtomicXor;
- case nir_intrinsic_image_deref_atomic_exchange:
+ CASE_ATOMIC_OP(exchange):
return SpvOpAtomicExchange;
- case nir_intrinsic_image_deref_atomic_comp_swap:
+ CASE_ATOMIC_OP(comp_swap):
return SpvOpAtomicCompareExchange;
default:
unreachable("unhandled atomic op");
}
return 0;
}
-
+#undef CASE_ATOMIC_OP
static SpvId
emit_float_const(struct ntv_context *ctx, int bit_size, double value)
{
@@ -2271,7 +2274,13 @@ emit_atomic_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
SpvId ptr = spirv_builder_emit_access_chain(&ctx->builder, pointer_type,
ssbo, indices,
ARRAY_SIZE(indices));
- handle_atomic_op(ctx, intr, ptr, param, 0);
+
+ SpvId param2 = 0;
+
+ if (intr->intrinsic == nir_intrinsic_ssbo_atomic_comp_swap)
+ param2 = get_src(ctx, &intr->src[3]);
+
+ handle_atomic_op(ctx, intr, ptr, param, param2);
}
static inline nir_variable *
@@ -2436,6 +2445,15 @@ emit_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr)
break;
case nir_intrinsic_ssbo_atomic_add:
+ case nir_intrinsic_ssbo_atomic_umin:
+ case nir_intrinsic_ssbo_atomic_imin:
+ case nir_intrinsic_ssbo_atomic_umax:
+ case nir_intrinsic_ssbo_atomic_imax:
+ case nir_intrinsic_ssbo_atomic_and:
+ case nir_intrinsic_ssbo_atomic_or:
+ case nir_intrinsic_ssbo_atomic_xor:
+ case nir_intrinsic_ssbo_atomic_exchange:
+ case nir_intrinsic_ssbo_atomic_comp_swap:
emit_atomic_intrinsic(ctx, intr);
break;
More information about the mesa-commit
mailing list