From 5162a1d88428c9a89454c17bc7d12539d7d5714d Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 9 May 2017 16:44:13 -0700 Subject: [PATCH] nir: Add new SPIR-V ballot intrinsics and lowering MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Someone can make the lowering optional later if they want something different for their hardware. Reviewed-by: Lionel Landwerlin Reviewed-by: Samuel Iglesias Gonsálvez Reviewed-by: Iago Toral Quiroga --- src/compiler/nir/nir_intrinsics.h | 12 ++++++++++++ src/compiler/nir/nir_lower_subgroups.c | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/compiler/nir/nir_intrinsics.h b/src/compiler/nir/nir_intrinsics.h index 1a816b46792..46f67a908ed 100644 --- a/src/compiler/nir/nir_intrinsics.h +++ b/src/compiler/nir/nir_intrinsics.h @@ -106,6 +106,18 @@ INTRINSIC(ballot, 1, ARR(1), true, 0, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMIN INTRINSIC(read_invocation, 2, ARR(0, 1), true, 0, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) INTRINSIC(read_first_invocation, 1, ARR(0), true, 0, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE) +/** Additional SPIR-V ballot intrinsics + * + * These correspond to the SPIR-V opcodes + * + * OpGroupUniformElect + * OpSubgroupFirstInvocationKHR + */ +INTRINSIC(elect, 0, ARR(0), true, 1, 0, 0, xx, xx, xx, + NIR_INTRINSIC_CAN_ELIMINATE) +INTRINSIC(first_invocation, 0, ARR(0), true, 1, 0, 0, xx, xx, xx, + NIR_INTRINSIC_CAN_ELIMINATE) + /* * Memory barrier with semantics analogous to the compute shader * groupMemoryBarrier(), memoryBarrierAtomicCounter(), memoryBarrierBuffer(), diff --git a/src/compiler/nir/nir_lower_subgroups.c b/src/compiler/nir/nir_lower_subgroups.c index acc6ed9a36e..e45a7d723ac 100644 --- a/src/compiler/nir/nir_lower_subgroups.c +++ b/src/compiler/nir/nir_lower_subgroups.c @@ -244,6 +244,16 @@ lower_subgroups_intrin(nir_builder *b, nir_intrinsic_instr *intrin, return nir_bit_count(b, nir_iand(b, int_val, mask)); } + case nir_intrinsic_elect: { + nir_intrinsic_instr *first = + nir_intrinsic_instr_create(b->shader, + nir_intrinsic_first_invocation); + nir_ssa_dest_init(&first->instr, &first->dest, 1, 32, NULL); + nir_builder_instr_insert(b, &first->instr); + + return nir_ieq(b, nir_load_subgroup_invocation(b), &first->dest.ssa); + } + default: break; } -- 2.30.2