@@ -80,30 +80,161 @@ T subgroupExclusiveXor(T value) {
8080 return spirv::groupNonUniformBitwiseXor_GroupNonUniformArithmetic<T>(spv::ScopeSubgroup, spv::GroupOperationExclusiveScan, value);
8181}
8282
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+
83214template<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 );
86217}
87218template<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 );
90221}
91222template<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 );
94225}
95226
96227template<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 );
99230}
100231template<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 );
103234}
104235template<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 );
107238}
108239
109240}
0 commit comments