Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
df94ffe
changed unormconstant template params to include float
keptsecret Jan 9, 2026
2c1a99d
separate pre and post decode scramble into different structs, no unor…
keptsecret Jan 9, 2026
8894dd1
change quantized sequence to set/get with bitfieldInsert/Extract, als…
keptsecret Jan 9, 2026
639f464
added create functions that should not preserve existing bits
keptsecret Jan 9, 2026
0e95d6f
Merge branch 'master' into changes_to_quantized_sequence
keptsecret Jan 19, 2026
85d169e
make decode a quantized sequence member instead
keptsecret Jan 19, 2026
64fb4d6
added create factory for all quantized sequences, added encode method…
keptsecret Jan 19, 2026
b4982a6
Merge branch 'master' into changes_to_quantized_sequence
keptsecret Jan 20, 2026
1223e88
fixes to removal of core::matrix
keptsecret Jan 20, 2026
cd67d94
removed sequence partial spec data too big, minor fixes
keptsecret Jan 20, 2026
5b83328
fix bitfieldInsert usage, truncate data
keptsecret Jan 28, 2026
57b1b3d
change some type alias names to make more sense
keptsecret Jan 28, 2026
c035063
added option for encode fullwidth or not
keptsecret Jan 28, 2026
0984617
update examples to include tests
keptsecret Jan 28, 2026
5b73aae
partial specs for bitfield insert and extract for 16 bit types
keptsecret Jan 29, 2026
b63fa26
fixes bitfieldInsert, account for sign in bitfieldExtract
keptsecret Jan 29, 2026
e1de225
minor fixes to uint16_t2 dim 4
keptsecret Jan 29, 2026
00c5379
enforce fullwidth if dim == storage dim
keptsecret Jan 29, 2026
ab5e771
latest example
keptsecret Jan 29, 2026
a5f431d
latest example 2
keptsecret Jan 29, 2026
20aa5ab
fixes to bitfield insert/extract requires
keptsecret Jan 30, 2026
36965e1
latest example
keptsecret Jan 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 83 additions & 23 deletions include/nbl/builtin/hlsl/glsl_compat/core.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,33 @@ namespace glsl
#ifndef __HLSL_VERSION

// GLM Aliases
template<typename genIUType>
genIUType bitfieldExtract(genIUType Value, int Offset, int Bits)
namespace impl
{
return glm::bitfieldExtract<genIUType>(Value, Offset, Bits);
}
template<typename T NBL_STRUCT_CONSTRAINABLE>
struct bitfieldInsert;

template<typename genIUType>
genIUType bitfieldInsert(genIUType const& Base, genIUType const& Insert, int Offset, int Bits)
template<typename T>
NBL_PARTIAL_REQ_TOP(concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4)
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) >
{
static T __call( T base, T insert, uint32_t offset, uint32_t bits )
{
return glm::bitfieldInsert<T>(base, insert, offset, bits);
}
};

template<typename T NBL_STRUCT_CONSTRAINABLE>
struct bitfieldExtract;

template<typename T>
NBL_PARTIAL_REQ_TOP(concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4)
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) >
{
return glm::bitfieldInsert<genIUType>(Base, Insert, Offset, Bits);
static T __call( T val, uint32_t offsetBits, uint32_t numBits )
{
return glm::bitfieldExtract<T>(val, offsetBits, numBits);
}
};
}

template<typename genIUType>
Expand Down Expand Up @@ -184,21 +201,25 @@ void memoryBarrierShared() {
namespace impl
{

template<typename T, bool isSigned, bool isIntegral>
struct bitfieldExtract {};
template<typename T NBL_STRUCT_CONSTRAINABLE>
struct bitfieldInsert;

template<typename T, bool isSigned>
struct bitfieldExtract<T, isSigned, false>
template<typename T>
NBL_PARTIAL_REQ_TOP(concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4)
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) >
{
static T __call( T val, uint32_t offsetBits, uint32_t numBits )
static T __call( T base, T insert, uint32_t offset, uint32_t bits )
{
static_assert( is_integral<T>::value, "T is not an integral type!" );
return val;
return spirv::bitFieldInsert<T>(base, insert, offset, bits);
}
};

template<typename T NBL_STRUCT_CONSTRAINABLE>
struct bitfieldExtract;

template<typename T>
struct bitfieldExtract<T, true, true>
NBL_PARTIAL_REQ_TOP(concepts::SignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4)
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) >
{
static T __call( T val, uint32_t offsetBits, uint32_t numBits )
{
Expand All @@ -207,7 +228,8 @@ struct bitfieldExtract<T, true, true>
};

template<typename T>
struct bitfieldExtract<T, false, true>
NBL_PARTIAL_REQ_TOP(concepts::UnsignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> >= 4)
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) >
{
static T __call( T val, uint32_t offsetBits, uint32_t numBits )
{
Expand All @@ -218,25 +240,63 @@ struct bitfieldExtract<T, false, true>
} //namespace impl

template<typename T>
T bitfieldExtract( T val, uint32_t offsetBits, uint32_t numBits )
T bitfieldReverse(T value)
{
return spirv::bitReverse<T>(value);
}

#endif

namespace impl
{
template<typename T>
NBL_PARTIAL_REQ_TOP(concepts::Integral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2)
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) >
{
static T __call( T base, T insert, uint32_t offset, uint32_t bits )
{
const T mask = (T(1u) << bits) - T(1u);
const T shifted_mask = mask << offset;
return (base & ~shifted_mask) | ((insert & mask) << T(offset));
}
};

template<typename T>
NBL_PARTIAL_REQ_TOP(concepts::SignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2)
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) >
{
static T __call( T val, uint32_t offsetBits, uint32_t numBits )
{
const T ret = (val >> T(offsetBits)) & T((T(1u) << numBits) - T(1u));
if (ret & (T(1u) << (numBits-1u)))
ret |= T(~0ull) << numBits;
return ret;
}
};

template<typename T>
NBL_PARTIAL_REQ_TOP(concepts::UnsignedIntegral<typename vector_traits<T>::scalar_type> && size_of_v<typename vector_traits<T>::scalar_type> == 2)
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) >
{
return impl::bitfieldExtract<T, is_signed<T>::value, is_integral<T>::value>::__call(val,offsetBits,numBits);
static T __call( T val, uint32_t offsetBits, uint32_t numBits )
{
return (val >> T(offsetBits)) & T((T(1u) << numBits) - T(1u));
}
};
}

template<typename T>
T bitfieldInsert(T base, T insert, uint32_t offset, uint32_t bits)
{
return spirv::bitFieldInsert<T>(base, insert, offset, bits);
return impl::bitfieldInsert<T>::__call(base, insert, offset, bits);
}

template<typename T>
T bitfieldReverse(T value)
T bitfieldExtract( T val, uint32_t offsetBits, uint32_t numBits )
{
return spirv::bitReverse<T>(value);
return impl::bitfieldExtract<T>::__call(val, offsetBits, numBits);
}

#endif

namespace impl
{
template<typename T NBL_STRUCT_CONSTRAINABLE>
Expand Down
4 changes: 2 additions & 2 deletions include/nbl/builtin/hlsl/math/quaternions.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -110,16 +110,16 @@ struct quaternion
uniformScaleSq = traits.uniformScaleSq;

if (dontAssertValidMatrix)
{
if (!valid)
{
this_t retval;
retval.data = hlsl::promote<data_type>(bit_cast<scalar_type>(numeric_limits<scalar_type>::quiet_NaN));
return retval;
}
}
else
{
assert(valid);
}
}
if (uniformScaleSq < numeric_limits<scalar_type>::min)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define _NBL_BUILTIN_HLSL_TRANSFORMATION_MATRIX_UTILS_INCLUDED_

#include <nbl/builtin/hlsl/cpp_compat.hlsl>
#include <nbl/builtin/hlsl/math/quaternions.hlsl>

namespace nbl
{
Expand Down Expand Up @@ -125,30 +126,16 @@ inline matrix<T, 3, 4> buildCameraLookAtMatrixRH(

//! Replaces curent rocation and scale by rotation represented by quaternion `quat`, leaves 4th row and 4th colum unchanged
template<typename T, uint32_t N>
inline void setRotation(matrix<T, N, 4>& outMat, NBL_CONST_REF_ARG(core::quaternion) quat)
inline void setRotation(matrix<T, N, 4>& outMat, NBL_CONST_REF_ARG(math::quaternion<T>) quat)
{
static_assert(N == 3 || N == 4);
matrix<T, 3, 3> mat = _static_cast<matrix<T, 3, 3>>(quat);

outMat[0] = vector<T, 4>(
1 - 2 * (quat.y * quat.y + quat.z * quat.z),
2 * (quat.x * quat.y - quat.z * quat.w),
2 * (quat.x * quat.z + quat.y * quat.w),
outMat[0][3]
);

outMat[1] = vector<T, 4>(
2 * (quat.x * quat.y + quat.z * quat.w),
1 - 2 * (quat.x * quat.x + quat.z * quat.z),
2 * (quat.y * quat.z - quat.x * quat.w),
outMat[1][3]
);

outMat[2] = vector<T, 4>(
2 * (quat.x * quat.z - quat.y * quat.w),
2 * (quat.y * quat.z + quat.x * quat.w),
1 - 2 * (quat.x * quat.x + quat.y * quat.y),
outMat[2][3]
);
outMat[0] = mat[0];

outMat[1] = mat[1];

outMat[2] = mat[2];
}

template<typename T, uint32_t N>
Expand Down
Loading
Loading