Skip to content

Commit 0370c13

Browse files
Merge pull request #656 from Eichenherz/Intrinsics
Added bit_field intrisic
2 parents ecc9881 + fefbcdd commit 0370c13

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ inline matrix<T,M,N> transpose(const matrix<T,N,M>& m)
7171
return glm::transpose(reinterpret_cast<typename matrix<T,N,M>::Base const&>(m));
7272
}
7373

74+
template<typename T>
75+
inline T bitfieldExtract( T val, uint32_t offsetBits, uint32_t numBits )
76+
{
77+
return glm::bitfieldExtract( val, int32_t( offsetBits ), int32_t( numBits ) );
78+
}
7479

7580
#undef NBL_BIT_OP_GLM_PASSTHROUGH
7681
#undef NBL_SIMPLE_GLM_PASSTHROUGH

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include "nbl/builtin/hlsl/cpp_compat.hlsl"
88
#include "nbl/builtin/hlsl/spirv_intrinsics/core.hlsl"
9+
#include "nbl/builtin/hlsl/type_traits.hlsl"
910

1011
namespace nbl
1112
{
@@ -83,6 +84,50 @@ void tess_ctrl_barrier() {
8384
void memoryBarrierShared() {
8485
spirv::memoryBarrier(spv::ScopeDevice, spv::MemorySemanticsAcquireReleaseMask | spv::MemorySemanticsWorkgroupMemoryMask);
8586
}
87+
88+
namespace impl
89+
{
90+
91+
template<typename T, bool isSigned, bool isIntegral>
92+
struct bitfieldExtract {};
93+
94+
template<typename T, bool isSigned>
95+
struct bitfieldExtract<T, isSigned, false>
96+
{
97+
T operator()( T val, uint32_t offsetBits, uint32_t numBits )
98+
{
99+
static_assert( is_integral<T>::value, "T is not an integral type!" );
100+
return val;
101+
}
102+
};
103+
104+
template<typename T>
105+
struct bitfieldExtract<T, true, true>
106+
{
107+
T operator()( T val, uint32_t offsetBits, uint32_t numBits )
108+
{
109+
return spirv::bitFieldSExtract<T>( val, offsetBits, numBits );
110+
}
111+
};
112+
113+
template<typename T>
114+
struct bitfieldExtract<T, false, true>
115+
{
116+
T operator()( T val, uint32_t offsetBits, uint32_t numBits )
117+
{
118+
return spirv::bitFieldUExtract<T>( val, offsetBits, numBits );
119+
}
120+
};
121+
122+
}
123+
124+
template<typename T>
125+
T bitfieldExtract( T val, uint32_t offsetBits, uint32_t numBits )
126+
{
127+
return impl::bitfieldExtract<T, is_signed<T>::value, is_integral<T>::value>::template
128+
( val, offsetBits, numBits );
129+
}
130+
86131
#endif
87132

88133
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ void memoryBarrier(uint32_t memoryScope, uint32_t memorySemantics);
129129
template<class T, class U>
130130
[[vk::ext_instruction(spv::OpBitcast)]]
131131
T bitcast(U);
132+
133+
template<typename Unsigned>
134+
[[vk::ext_instruction( spv::OpBitFieldUExtract )]]
135+
Unsigned bitFieldUExtract( Unsigned val, uint32_t offsetBits, uint32_t numBits );
136+
137+
template<typename Signed>
138+
[[vk::ext_instruction( spv::OpBitFieldSExtract )]]
139+
Signed bitFieldSExtract( Signed val, uint32_t offsetBits, uint32_t numBits );
140+
132141
}
133142
#endif
134143
}

0 commit comments

Comments
 (0)