Skip to content

Commit ca1ae43

Browse files
committed
builtin: update glsl_compat layer to represent new spirv_intrisics
1 parent 76c1617 commit ca1ae43

File tree

2 files changed

+145
-14
lines changed

2 files changed

+145
-14
lines changed

include/nbl/builtin/hlsl/glsl_compat/core.hlsl

+2-2
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ struct bitfieldExtract<T, true, true>
187187
{
188188
static T __call( T val, uint32_t offsetBits, uint32_t numBits )
189189
{
190-
return spirv::bitFieldExtract( val, offsetBits, numBits );
190+
return spirv::bitFieldSExtract( val, offsetBits, numBits );
191191
}
192192
};
193193

@@ -196,7 +196,7 @@ struct bitfieldExtract<T, false, true>
196196
{
197197
static T __call( T val, uint32_t offsetBits, uint32_t numBits )
198198
{
199-
return spirv::bitFieldExtract( val, offsetBits, numBits );
199+
return spirv::bitFieldUExtract( val, offsetBits, numBits );
200200
}
201201
};
202202

include/nbl/builtin/hlsl/glsl_compat/subgroup_arithmetic.hlsl

+143-12
Original file line numberDiff line numberDiff line change
@@ -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+
83214
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);
86217
}
87218
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);
90221
}
91222
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);
94225
}
95226

96227
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);
99230
}
100231
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);
103234
}
104235
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);
107238
}
108239

109240
}

0 commit comments

Comments
 (0)