From 86a720d2cf0c81c5f9dc501bef2e4210431c5317 Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Thu, 5 Jan 2023 19:10:35 +0000 Subject: [PATCH] Add OpGroupNonUniformElect, OpGroupNonUniformBroadcastFirst --- include/sirit/sirit.h | 8 ++++++++ src/instructions/group.cpp | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/sirit/sirit.h b/include/sirit/sirit.h index 6ced1a8..aea4468 100644 --- a/include/sirit/sirit.h +++ b/include/sirit/sirit.h @@ -1160,6 +1160,14 @@ public: /// TBD Id OpSubgroupAllEqualKHR(Id result_type, Id predicate); + // Result is true only in the active invocation with the lowest id in the group, otherwise + // result is false. + Id OpGroupNonUniformElect(Id result_type, Id scope); + + // Result is the Value of the invocation from the active invocation with the lowest id in the + // group to all active invocations in the group. + Id OpGroupNonUniformBroadcastFirst(Id result_type, Id scope, Id value); + // Result is the Value of the invocation identified by the id Id to all active invocations in // the group. Id OpGroupNonUniformBroadcast(Id result_type, Id scope, Id value, Id id); diff --git a/src/instructions/group.cpp b/src/instructions/group.cpp index 3b6f71a..b853284 100644 --- a/src/instructions/group.cpp +++ b/src/instructions/group.cpp @@ -36,6 +36,17 @@ Id Module::OpSubgroupAllEqualKHR(Id result_type, Id predicate) { return *code << OpId{spv::Op::OpSubgroupAllEqualKHR, result_type} << predicate << EndOp{}; } +Id Module::OpGroupNonUniformElect(Id result_type, Id scope) { + code->Reserve(4); + return *code << OpId{spv::Op::OpGroupNonUniformElect, result_type} << scope << EndOp{}; +} + +Id Module::OpGroupNonUniformBroadcastFirst(Id result_type, Id scope, Id value) { + code->Reserve(5); + return *code << OpId{spv::Op::OpGroupNonUniformBroadcastFirst, result_type} << scope << value + << EndOp{}; +} + Id Module::OpGroupNonUniformBroadcast(Id result_type, Id scope, Id value, Id id) { code->Reserve(6); return *code << OpId{spv::Op::OpGroupNonUniformBroadcast, result_type} << scope << value