@@ -80,30 +80,161 @@ T subgroupExclusiveXor(T value) {
80
80
return spirv::groupNonUniformBitwiseXor_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
81
81
}
82
82
83
+ namespace impl
84
+ {
85
+
86
+ template<typename T, bool isSigned>
87
+ struct subgroupMin {};
88
+
89
+ template<typename T>
90
+ struct subgroupMin<T, true >
91
+ {
92
+ static T __call (T val)
93
+ {
94
+ return spirv::groupNonUniformSMin_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationReduce, val);
95
+ }
96
+ };
97
+
98
+ template<typename T>
99
+ struct subgroupMin<T, false >
100
+ {
101
+ static T __call (T val)
102
+ {
103
+ return spirv::groupNonUniformUMin_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationReduce, val);
104
+ }
105
+ };
106
+
107
+ template<typename T, bool isSigned>
108
+ struct subgroupInclusiveMin {};
109
+
110
+ template<typename T>
111
+ struct subgroupInclusiveMin<T, true >
112
+ {
113
+ static T __call (T val)
114
+ {
115
+ return spirv::groupNonUniformSMin_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, val);
116
+ }
117
+ };
118
+
119
+ template<typename T>
120
+ struct subgroupInclusiveMin<T, false >
121
+ {
122
+ static T __call (T val)
123
+ {
124
+ return spirv::groupNonUniformUMin_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, val);
125
+ }
126
+ };
127
+
128
+ template<typename T, bool isSigned>
129
+ struct subgroupExclusiveMin {};
130
+
131
+ template<typename T>
132
+ struct subgroupExclusiveMin<T, true >
133
+ {
134
+ static T __call (T val)
135
+ {
136
+ return spirv::groupNonUniformSMin_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, val);
137
+ }
138
+ };
139
+
140
+ template<typename T>
141
+ struct subgroupExclusiveMin<T, false >
142
+ {
143
+ static T __call (T val)
144
+ {
145
+ return spirv::groupNonUniformUMin_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, val);
146
+ }
147
+ };
148
+
149
+ template<typename T, bool isSigned>
150
+ struct subgroupMax {};
151
+
152
+ template<typename T>
153
+ struct subgroupMax<T, true >
154
+ {
155
+ static T __call (T val)
156
+ {
157
+ return spirv::groupNonUniformSMax_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationReduce, val);
158
+ }
159
+ };
160
+
161
+ template<typename T>
162
+ struct subgroupMax<T, false >
163
+ {
164
+ static T __call (T val)
165
+ {
166
+ return spirv::groupNonUniformUMax_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationReduce, val);
167
+ }
168
+ };
169
+
170
+ template<typename T, bool isSigned>
171
+ struct subgroupInclusiveMax {};
172
+
173
+ template<typename T>
174
+ struct subgroupInclusiveMax<T, true >
175
+ {
176
+ static T __call (T val)
177
+ {
178
+ return spirv::groupNonUniformSMax_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, val);
179
+ }
180
+ };
181
+
182
+ template<typename T>
183
+ struct subgroupInclusiveMax<T, false >
184
+ {
185
+ static T __call (T val)
186
+ {
187
+ return spirv::groupNonUniformUMax_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, val);
188
+ }
189
+ };
190
+
191
+ template<typename T, bool isSigned>
192
+ struct subgroupExclusiveMax {};
193
+
194
+ template<typename T>
195
+ struct subgroupExclusiveMax<T, true >
196
+ {
197
+ static T __call (T val)
198
+ {
199
+ return spirv::groupNonUniformSMax_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, val);
200
+ }
201
+ };
202
+
203
+ template<typename T>
204
+ struct subgroupExclusiveMax<T, false >
205
+ {
206
+ static T __call (T val)
207
+ {
208
+ return spirv::groupNonUniformUMax_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, val);
209
+ }
210
+ };
211
+
212
+ }
213
+
83
214
template<typename T>
84
- T subgroupMin (T value ) {
85
- return spirv:: groupNonUniformMin_GroupNonUniformArithmetic (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
215
+ T subgroupMin (T val ) {
216
+ return impl::subgroupMin<T, is_signed<T>:: value>:: __call (val );
86
217
}
87
218
template<typename T>
88
- T subgroupInclusiveMin (T value ) {
89
- return spirv:: groupNonUniformMin_GroupNonUniformArithmetic (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, value);
219
+ T subgroupInclusiveMin (T val ) {
220
+ return impl::subgroupInclusiveMin<T, is_signed<T>:: value>:: __call (val );
90
221
}
91
222
template<typename T>
92
- T subgroupExclusiveMin (T value ) {
93
- return spirv:: groupNonUniformMin_GroupNonUniformArithmetic (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
223
+ T subgroupExclusiveMin (T val ) {
224
+ return impl::subgroupExclusiveMin<T, is_signed<T>:: value>:: __call (val );
94
225
}
95
226
96
227
template<typename T>
97
- T subgroupMax (T value ) {
98
- return spirv:: groupNonUniformMax_GroupNonUniformArithmetic (spv::ScopeSubgroup, spv::GroupOperationReduce, value);
228
+ T subgroupMax (T val ) {
229
+ return impl::subgroupMax<T, is_signed<T>:: value>:: __call (val );
99
230
}
100
231
template<typename T>
101
- T subgroupInclusiveMax (T value ) {
102
- return spirv:: groupNonUniformMax_GroupNonUniformArithmetic (spv::ScopeSubgroup, spv::GroupOperationInclusiveScan, value);
232
+ T subgroupInclusiveMax (T val ) {
233
+ return impl::subgroupInclusiveMax<T, is_signed<T>:: value>:: __call (val );
103
234
}
104
235
template<typename T>
105
- T subgroupExclusiveMax (T value ) {
106
- return spirv:: groupNonUniformMax_GroupNonUniformArithmetic (spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
236
+ T subgroupExclusiveMax (T val ) {
237
+ return impl::subgroupExclusiveMax<T, is_signed<T>:: value>:: __call (val );
107
238
}
108
239
109
240
}
0 commit comments