Skip to content

Commit 2db1829

Browse files
committed
Refactored the bitReverse function
1 parent 6f74919 commit 2db1829

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

include/nbl/builtin/hlsl/cpp_compat/impl/intrinsics_impl.hlsl

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,42 @@ struct find_msb_return_type<vector<Integer, N> >
293293
template<typename Integer>
294294
using find_lsb_return_type = find_msb_return_type<Integer>;
295295

296+
template<typename T NBL_STRUCT_CONSTRAINABLE>
297+
struct bitReverse_helper;
298+
299+
template<typename Integer>
300+
NBL_PARTIAL_REQ_TOP(hlsl::is_integral_v<Integer> && hlsl::is_scalar_v<Integer>)
301+
struct bitReverse_helper<Integer NBL_PARTIAL_REQ_BOT(hlsl::is_integral_v<Integer>&& hlsl::is_scalar_v<Integer>) >
302+
{
303+
static inline Integer __call(NBL_CONST_REF_ARG(Integer) val)
304+
{
305+
#ifdef __HLSL_VERSION
306+
return spirv::bitReverse(val);
307+
#else
308+
return glm::bitfieldReverse(val);
309+
#endif
310+
}
311+
};
312+
313+
template<typename Vector>
314+
NBL_PARTIAL_REQ_TOP(hlsl::is_vector_v<Vector>)
315+
struct bitReverse_helper<Vector NBL_PARTIAL_REQ_BOT(hlsl::is_integral_v<Vector> && hlsl::is_vector_v<Vector>) >
316+
{
317+
static Vector __call(NBL_CONST_REF_ARG(Vector) vec)
318+
{
319+
#ifdef __HLSL_VERSION
320+
return spirv::bitReverse(vec);
321+
#else
322+
Vector output;
323+
using traits = hlsl::vector_traits<Vector>;
324+
for (uint32_t i = 0; i < traits::Dimension; ++i)
325+
output[i] = bitReverse_helper<scalar_type_t<Vector> >::__call(vec[i]);
326+
return output;
327+
#endif
328+
}
329+
};
330+
331+
296332
template<typename T, typename U NBL_STRUCT_CONSTRAINABLE>
297333
struct lerp_helper;
298334

include/nbl/builtin/hlsl/cpp_compat/intrinsics.hlsl

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,9 @@ inline FloatingPoint rsqrt(FloatingPoint x)
207207
}
208208

209209
template<typename Integer>
210-
inline Integer bitReverse(Integer base)
210+
inline Integer bitReverse(Integer val)
211211
{
212-
#ifdef __HLSL_VERSION
213-
return spirv::bitReverse(base);
214-
#else
215-
return glm::bitfieldReverse(base);
216-
#endif
212+
return cpp_compat_intrinsics_impl::bitReverse_helper<Integer>::__call(val);
217213
}
218214

219215

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ T bitfieldInsert(T base, T insert, uint32_t offset, uint32_t bits)
222222
template<typename T>
223223
T bitfieldReverse(T value)
224224
{
225-
return spirv::bitFieldReverse<T>(value);
225+
return spirv::bitReverse<T>(value);
226226
}
227227

228228
#endif

0 commit comments

Comments
 (0)