@@ -22,16 +22,33 @@ namespace glsl
2222#ifndef __HLSL_VERSION
2323
2424// GLM Aliases
25- template<typename genIUType>
26- genIUType bitfieldExtract (genIUType Value, int Offset, int Bits)
25+ namespace impl
2726{
28- return glm::bitfieldExtract<genIUType>(Value, Offset, Bits);
29- }
27+ template<typename T NBL_STRUCT_CONSTRAINABLE>
28+ struct bitfieldInsert;
3029
31- template<typename genIUType>
32- genIUType bitfieldInsert (genIUType const & Base, genIUType const & Insert, int Offset, int Bits)
30+ template<typename T>
31+ NBL_PARTIAL_REQ_TOP (concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 )
32+ struct bitfieldInsert<T NBL_PARTIAL_REQ_BOT (concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 ) >
33+ {
34+ static T __call ( T base, T insert, uint32_t offset, uint32_t bits )
35+ {
36+ return glm::bitfieldInsert<T>(base, insert, offset, bits);
37+ }
38+ };
39+
40+ template<typename T NBL_STRUCT_CONSTRAINABLE>
41+ struct bitfieldExtract;
42+
43+ template<typename T>
44+ NBL_PARTIAL_REQ_TOP (concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 )
45+ struct bitfieldExtract<T NBL_PARTIAL_REQ_BOT (concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 ) >
3346{
34- return glm::bitfieldInsert<genIUType>(Base, Insert, Offset, Bits);
47+ static T __call ( T val, uint32_t offsetBits, uint32_t numBits )
48+ {
49+ return glm::bitfieldExtract<T>(val, offsetBits, numBits);
50+ }
51+ };
3552}
3653
3754template<typename genIUType>
@@ -184,21 +201,25 @@ void memoryBarrierShared() {
184201namespace impl
185202{
186203
187- template<typename T, bool isSigned, bool isIntegral >
188- struct bitfieldExtract {} ;
204+ template<typename T NBL_STRUCT_CONSTRAINABLE >
205+ struct bitfieldInsert ;
189206
190- template<typename T, bool isSigned>
191- struct bitfieldExtract<T, isSigned, false >
207+ template<typename T>
208+ NBL_PARTIAL_REQ_TOP (concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 )
209+ struct bitfieldInsert<T NBL_PARTIAL_REQ_BOT (concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 ) >
192210{
193- static T __call ( T val, uint32_t offsetBits , uint32_t numBits )
211+ static T __call ( T base, T insert, uint32_t offset , uint32_t bits )
194212 {
195- static_assert ( is_integral<T>::value, "T is not an integral type!" );
196- return val;
213+ return spirv::bitFieldInsert<T>(base, insert, offset, bits);
197214 }
198215};
199216
217+ template<typename T NBL_STRUCT_CONSTRAINABLE>
218+ struct bitfieldExtract;
219+
200220template<typename T>
201- struct bitfieldExtract<T, true , true >
221+ NBL_PARTIAL_REQ_TOP (concepts::SignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 )
222+ struct bitfieldExtract<T NBL_PARTIAL_REQ_BOT (concepts::SignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 ) >
202223{
203224 static T __call ( T val, uint32_t offsetBits, uint32_t numBits )
204225 {
@@ -207,7 +228,8 @@ struct bitfieldExtract<T, true, true>
207228};
208229
209230template<typename T>
210- struct bitfieldExtract<T, false , true >
231+ NBL_PARTIAL_REQ_TOP (concepts::UnsignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 )
232+ struct bitfieldExtract<T NBL_PARTIAL_REQ_BOT (concepts::UnsignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4 ) >
211233{
212234 static T __call ( T val, uint32_t offsetBits, uint32_t numBits )
213235 {
@@ -218,25 +240,63 @@ struct bitfieldExtract<T, false, true>
218240} //namespace impl
219241
220242template<typename T>
221- T bitfieldExtract ( T val, uint32_t offsetBits, uint32_t numBits )
243+ T bitfieldReverse (T value)
244+ {
245+ return spirv::bitReverse<T>(value);
246+ }
247+
248+ #endif
249+
250+ namespace impl
251+ {
252+ template<typename T>
253+ NBL_PARTIAL_REQ_TOP (concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2 )
254+ struct bitfieldInsert<T NBL_PARTIAL_REQ_BOT (concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2 ) >
255+ {
256+ static T __call ( T base, T insert, uint32_t offset, uint32_t bits )
257+ {
258+ const T mask = (T (1u) << bits) - T (1u);
259+ const T shifted_mask = mask << offset;
260+ return (base & ~shifted_mask) | ((insert & mask) << T (offset));
261+ }
262+ };
263+
264+ template<typename T>
265+ NBL_PARTIAL_REQ_TOP (concepts::SignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2 )
266+ struct bitfieldExtract<T NBL_PARTIAL_REQ_BOT (concepts::SignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2 ) >
267+ {
268+ static T __call ( T val, uint32_t offsetBits, uint32_t numBits )
269+ {
270+ const T ret = (val >> T (offsetBits)) & T ((T (1u) << numBits) - T (1u));
271+ if (ret & (T (1u) << (numBits-1u)))
272+ ret |= T (~0ull) << numBits;
273+ return ret;
274+ }
275+ };
276+
277+ template<typename T>
278+ NBL_PARTIAL_REQ_TOP (concepts::UnsignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2 )
279+ struct bitfieldExtract<T NBL_PARTIAL_REQ_BOT (concepts::UnsignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2 ) >
222280{
223- return impl::bitfieldExtract<T, is_signed<T>::value, is_integral<T>::value>::__call (val,offsetBits,numBits);
281+ static T __call ( T val, uint32_t offsetBits, uint32_t numBits )
282+ {
283+ return (val >> T (offsetBits)) & T ((T (1u) << numBits) - T (1u));
284+ }
285+ };
224286}
225287
226288template<typename T>
227289T bitfieldInsert (T base, T insert, uint32_t offset, uint32_t bits)
228290{
229- return spirv::bitFieldInsert <T>(base, insert, offset, bits);
291+ return impl::bitfieldInsert <T>:: __call (base, insert, offset, bits);
230292}
231293
232294template<typename T>
233- T bitfieldReverse (T value )
295+ T bitfieldExtract ( T val, uint32_t offsetBits, uint32_t numBits )
234296{
235- return spirv::bitReverse <T>(value );
297+ return impl::bitfieldExtract <T>:: __call (val, offsetBits, numBits );
236298}
237299
238- #endif
239-
240300namespace impl
241301{
242302template<typename T NBL_STRUCT_CONSTRAINABLE>
0 commit comments