Skip to content

Commit dbbe7c6

Browse files
authored
Merge pull request #806 from Devsh-Graphics-Programming/bitreverse_intrinsic
Bitreverse intrinsic
2 parents c7bdd2a + 2db1829 commit dbbe7c6

File tree

4 files changed

+45
-2
lines changed

4 files changed

+45
-2
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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,13 @@ inline FloatingPoint rsqrt(FloatingPoint x)
206206
#endif
207207
}
208208

209+
template<typename Integer>
210+
inline Integer bitReverse(Integer val)
211+
{
212+
return cpp_compat_intrinsics_impl::bitReverse_helper<Integer>::__call(val);
213+
}
214+
215+
209216
}
210217
}
211218

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

include/nbl/builtin/hlsl/spirv_intrinsics/core.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ enable_if_t<is_integral_v<Integral>, Integral> bitFieldInsert( Integral base, In
232232

233233
template<typename Integral>
234234
[[vk::ext_instruction( spv::OpBitReverse )]]
235-
enable_if_t<is_integral_v<Integral>, Integral> bitFieldReverse( Integral base );
235+
enable_if_t<is_integral_v<Integral>, Integral> bitReverse( Integral base );
236236

237237
template<typename FloatingPoint>
238238
[[vk::ext_instruction( spv::OpIsNan )]]

0 commit comments

Comments
 (0)