aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBilly Laws <[email protected]>2023-01-05 19:10:35 +0000
committerBilly Laws <[email protected]>2023-01-05 19:10:39 +0000
commit86a720d2cf0c81c5f9dc501bef2e4210431c5317 (patch)
tree78656c40b0a92ac941ffd9b672794cb53615d89e
parentd7ad93a88864bda94e282e95028f90b5784e4d20 (diff)
downloadsirit-86a720d2cf0c81c5f9dc501bef2e4210431c5317.tar.gz
sirit-86a720d2cf0c81c5f9dc501bef2e4210431c5317.zip
Add OpGroupNonUniformElect, OpGroupNonUniformBroadcastFirst
-rw-r--r--include/sirit/sirit.h8
-rw-r--r--src/instructions/group.cpp11
2 files changed, 19 insertions, 0 deletions
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