From bf5713d73689fa1a7cfefb989d4d793863b726b7 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 19 Aug 2020 14:32:30 -0400 Subject: [PATCH] zink: handle vote intrinsics in ntv these are super simple and straightforward Reviewed-by: Erik Faye-Lund Part-of: --- .../drivers/zink/nir_to_spirv/nir_to_spirv.c | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) 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 99ce26c8243..75b52db8a5d 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 @@ -2462,6 +2462,29 @@ emit_image_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr) handle_atomic_op(ctx, intr, texel, param, param2); } +static void +emit_vote(struct ntv_context *ctx, nir_intrinsic_instr *intr) +{ + SpvOp op; + + switch (intr->intrinsic) { + case nir_intrinsic_vote_all: + op = SpvOpGroupNonUniformAll; + break; + case nir_intrinsic_vote_any: + op = SpvOpGroupNonUniformAny; + break; + case nir_intrinsic_vote_ieq: + case nir_intrinsic_vote_feq: + op = SpvOpGroupNonUniformAllEqual; + break; + default: + unreachable("unknown vote intrinsic"); + } + SpvId result = spirv_builder_emit_vote(&ctx->builder, op, get_src(ctx, &intr->src[0])); + store_dest_raw(ctx, &intr->dest, result); +} + static void emit_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr) { @@ -2806,6 +2829,13 @@ emit_intrinsic(struct ntv_context *ctx, nir_intrinsic_instr *intr) emit_store_shared(ctx, intr); break; + case nir_intrinsic_vote_all: + case nir_intrinsic_vote_any: + case nir_intrinsic_vote_ieq: + case nir_intrinsic_vote_feq: + emit_vote(ctx, intr); + break; + default: fprintf(stderr, "emit_intrinsic: not implemented (%s)\n", nir_intrinsic_infos[intr->intrinsic].name);