Skip to content

Commit ae281be

Browse files
authored
Merge pull request #841 from Devsh-Graphics-Programming/new_tgmath
New tgmath
2 parents a099fa1 + ab16769 commit ae281be

File tree

5 files changed

+33
-33
lines changed

5 files changed

+33
-33
lines changed

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,22 @@ namespace hlsl
2323
namespace cpp_compat_intrinsics_impl
2424
{
2525

26+
template<typename UnsignedInteger NBL_FUNC_REQUIRES(hlsl::is_integral_v<UnsignedInteger>&& hlsl::is_unsigned_v<UnsignedInteger>)
27+
inline bool isnan_uint_impl(UnsignedInteger val)
28+
{
29+
using AsFloat = typename float_of_size<sizeof(UnsignedInteger)>::type;
30+
NBL_CONSTEXPR UnsignedInteger Mask = (UnsignedInteger(0) - 1) >> 1;
31+
UnsignedInteger absVal = val & Mask;
32+
return absVal > (ieee754::traits<AsFloat>::specialValueExp << ieee754::traits<AsFloat>::mantissaBitCnt);
33+
}
34+
35+
template<typename UnsignedInteger NBL_FUNC_REQUIRES(hlsl::is_integral_v<UnsignedInteger>&& hlsl::is_unsigned_v<UnsignedInteger>)
36+
inline bool isinf_uint_impl(UnsignedInteger val)
37+
{
38+
using AsFloat = typename float_of_size<sizeof(UnsignedInteger)>::type;
39+
return (val & (~ieee754::traits<AsFloat>::signMask)) == ieee754::traits<AsFloat>::inf;
40+
}
41+
2642
template<typename T NBL_STRUCT_CONSTRAINABLE>
2743
struct dot_helper;
2844
template<typename T NBL_STRUCT_CONSTRAINABLE>
@@ -252,22 +268,6 @@ struct cross_helper<T NBL_PARTIAL_REQ_BOT(concepts::FloatingPointVector<T> && (v
252268

253269
#else // C++ only specializations
254270

255-
template<typename UnsignedInteger NBL_FUNC_REQUIRES(hlsl::is_integral_v<UnsignedInteger>&& hlsl::is_unsigned_v<UnsignedInteger>)
256-
inline bool isnan_uint_impl(UnsignedInteger val)
257-
{
258-
using AsFloat = typename float_of_size<sizeof(UnsignedInteger)>::type;
259-
constexpr UnsignedInteger Mask = (static_cast<UnsignedInteger>(0) - 1) >> 1;
260-
UnsignedInteger absVal = val & Mask;
261-
return absVal > (ieee754::traits<AsFloat>::specialValueExp << ieee754::traits<AsFloat>::mantissaBitCnt);
262-
}
263-
264-
template<typename UnsignedInteger NBL_FUNC_REQUIRES(hlsl::is_integral_v<UnsignedInteger>&& hlsl::is_unsigned_v<UnsignedInteger>)
265-
inline bool isinf_uint_impl(UnsignedInteger val)
266-
{
267-
using AsFloat = typename float_of_size<sizeof(UnsignedInteger)>::type;
268-
return (val & (~ieee754::traits<AsFloat>::signMask)) == ieee754::traits<AsFloat>::inf;
269-
}
270-
271271
#define DECL_ARG(r,data,i,_T) BOOST_PP_COMMA_IF(BOOST_PP_NOT_EQUAL(i,0)) const _T arg##i
272272
#define WRAP(r,data,i,_T) BOOST_PP_COMMA_IF(BOOST_PP_NOT_EQUAL(i,0)) _T
273273
#define ARG(r,data,i,_T) BOOST_PP_COMMA_IF(BOOST_PP_NOT_EQUAL(i,0)) arg##i

include/nbl/builtin/hlsl/emulated/float64_t.hlsl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ namespace hlsl
9797
{
9898
if(!FastMath)
9999
{
100-
const bool isRhsInf = tgmath_impl::isinf_uint_impl(rhs.data);
101-
if (tgmath_impl::isinf_uint_impl(data))
100+
const bool isRhsInf = cpp_compat_intrinsics_impl::isinf_uint_impl(rhs.data);
101+
if (cpp_compat_intrinsics_impl::isinf_uint_impl(data))
102102
{
103103
if (isRhsInf && ((data ^ rhs.data) & ieee754::traits<float64_t>::signMask))
104104
return bit_cast<this_t>(ieee754::traits<float64_t>::quietNaN | ieee754::traits<float64_t>::signMask);
@@ -116,7 +116,7 @@ namespace hlsl
116116

117117
if(!FastMath)
118118
{
119-
if (tgmath_impl::isinf_uint_impl(data))
119+
if (cpp_compat_intrinsics_impl::isinf_uint_impl(data))
120120
return bit_cast<this_t>(ieee754::traits<float64_t>::inf | ieee754::extractSignPreserveBitPattern(max(data, rhs.data)));
121121
}
122122

@@ -226,9 +226,9 @@ namespace hlsl
226226
uint64_t sign = (data ^ rhs.data) & ieee754::traits<float64_t>::signMask;
227227
if (!FastMath)
228228
{
229-
if (tgmath_impl::isnan_uint_impl(data) || tgmath_impl::isnan_uint_impl(rhs.data))
229+
if (cpp_compat_intrinsics_impl::isnan_uint_impl(data) || cpp_compat_intrinsics_impl::isnan_uint_impl(rhs.data))
230230
return bit_cast<this_t>(ieee754::traits<float64_t>::quietNaN | sign);
231-
if (tgmath_impl::isinf_uint_impl(data) || tgmath_impl::isinf_uint_impl(rhs.data))
231+
if (cpp_compat_intrinsics_impl::isinf_uint_impl(data) || cpp_compat_intrinsics_impl::isinf_uint_impl(rhs.data))
232232
return bit_cast<this_t>(ieee754::traits<float64_t>::inf | sign);
233233
if (emulated_float64_t_impl::isZero(data) || emulated_float64_t_impl::isZero(rhs.data))
234234
return bit_cast<this_t>(sign);
@@ -289,17 +289,17 @@ namespace hlsl
289289

290290
if(!FastMath)
291291
{
292-
if (tgmath_impl::isnan_uint_impl<uint64_t>(data) || tgmath_impl::isnan_uint_impl<uint64_t>(rhs.data))
292+
if (cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(data) || cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(rhs.data))
293293
return bit_cast<this_t>(ieee754::traits<float64_t>::quietNaN);
294294
if (emulated_float64_t_impl::areBothZero(data, rhs.data))
295295
return bit_cast<this_t>(ieee754::traits<float64_t>::quietNaN | sign);
296296
if (emulated_float64_t_impl::isZero(rhs.data))
297297
return bit_cast<this_t>(ieee754::traits<float64_t>::inf | sign);
298298
if (emulated_float64_t_impl::areBothInfinity(data, rhs.data))
299299
return bit_cast<this_t>(ieee754::traits<float64_t>::quietNaN | ieee754::traits<float64_t>::signMask);
300-
if (tgmath_impl::isinf_uint_impl(data))
300+
if (cpp_compat_intrinsics_impl::isinf_uint_impl(data))
301301
return bit_cast<this_t>(ieee754::traits<float64_t>::inf | sign);
302-
if (tgmath_impl::isinf_uint_impl(rhs.data))
302+
if (cpp_compat_intrinsics_impl::isinf_uint_impl(rhs.data))
303303
return bit_cast<this_t>(sign);
304304
}
305305

@@ -346,7 +346,7 @@ namespace hlsl
346346
{
347347
if (!FastMath)
348348
{
349-
if (tgmath_impl::isnan_uint_impl<uint64_t>(data) || tgmath_impl::isnan_uint_impl<uint64_t>(rhs.data))
349+
if (cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(data) || cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(rhs.data))
350350
return false;
351351
if (emulated_float64_t_impl::areBothZero(data, rhs.data))
352352
return true;
@@ -356,7 +356,7 @@ namespace hlsl
356356
}
357357
bool operator!=(this_t rhs) NBL_CONST_MEMBER_FUNC
358358
{
359-
if (!FastMath && (tgmath_impl::isnan_uint_impl<uint64_t>(data) || tgmath_impl::isnan_uint_impl<uint64_t>(rhs.data)))
359+
if (!FastMath && (cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(data) || cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(rhs.data)))
360360
return false;
361361

362362
return !(bit_cast<this_t>(data) == rhs);
@@ -371,14 +371,14 @@ namespace hlsl
371371
}
372372
bool operator<=(this_t rhs) NBL_CONST_MEMBER_FUNC
373373
{
374-
if (!FastMath && (tgmath_impl::isnan_uint_impl<uint64_t>(data) || tgmath_impl::isnan_uint_impl<uint64_t>(rhs.data)))
374+
if (!FastMath && (cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(data) || cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(rhs.data)))
375375
return false;
376376

377377
return !(bit_cast<this_t>(data) > bit_cast<this_t>(rhs.data));
378378
}
379379
bool operator>=(this_t rhs)
380380
{
381-
if (!FastMath && (tgmath_impl::isnan_uint_impl<uint64_t>(data) || tgmath_impl::isnan_uint_impl<uint64_t>(rhs.data)))
381+
if (!FastMath && (cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(data) || cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(rhs.data)))
382382
return false;
383383

384384
return !(bit_cast<this_t>(data) < bit_cast<this_t>(rhs.data));
@@ -498,7 +498,7 @@ struct static_cast_helper<To,emulated_float64_t<FastMath,FlushDenormToZero>,void
498498
return bit_cast<To>(ieee754::traits<ToAsFloat>::inf);
499499
if (exponent < ieee754::traits<ToAsFloat>::exponentMin)
500500
return bit_cast<To>(-ieee754::traits<ToAsFloat>::inf);
501-
if (tgmath_impl::isnan_uint_impl(v.data))
501+
if (cpp_compat_intrinsics_impl::isinf_uint_impl(v.data))
502502
return bit_cast<To>(ieee754::traits<ToAsFloat>::quietNaN);
503503
}
504504

include/nbl/builtin/hlsl/emulated/float64_t_impl.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ NBL_CONSTEXPR_INLINE_FUNC bool operatorLessAndGreaterCommonImplementation(uint64
171171
{
172172
if (!FastMath)
173173
{
174-
if (tgmath_impl::isnan_uint_impl<uint64_t>(lhs) || tgmath_impl::isnan_uint_impl<uint64_t>(rhs))
174+
if (cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(lhs) || cpp_compat_intrinsics_impl::isnan_uint_impl<uint64_t>(rhs))
175175
return false;
176176
if (emulated_float64_t_impl::areBothZero(lhs, rhs))
177177
return false;

include/nbl/builtin/hlsl/workgroup/fft.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,14 @@ struct FFTIndexingUtils
129129
// This is because Cooley-Tukey + subgroup operations end up spewing out the outputs in a weird order
130130
static uint32_t getDFTIndex(uint32_t outputIdx)
131131
{
132-
return impl::circularBitShiftRightHigher<FFTSizeLog2, FFTSizeLog2 - ElementsPerInvocationLog2 + 1>(hlsl::bitReverseAs<uint32_t, FFTSizeLog2>(outputIdx));
132+
return impl::circularBitShiftRightHigher<FFTSizeLog2, FFTSizeLog2 - ElementsPerInvocationLog2 + 1>(hlsl::bitReverseAs<uint32_t>(outputIdx, FFTSizeLog2));
133133
}
134134

135135
// This function maps the index `freqIdx` in the DFT to the index `idx` in the output array of a Nabla FFT such that `DFT[freqIdx] = NablaFFT[idx]`
136136
// It is essentially the inverse of `getDFTIndex`
137137
static uint32_t getNablaIndex(uint32_t freqIdx)
138138
{
139-
return hlsl::bitReverseAs<uint32_t, FFTSizeLog2>(impl::circularBitShiftLeftHigher<FFTSizeLog2, FFTSizeLog2 - ElementsPerInvocationLog2 + 1>(freqIdx));
139+
return hlsl::bitReverseAs<uint32_t>(impl::circularBitShiftLeftHigher<FFTSizeLog2, FFTSizeLog2 - ElementsPerInvocationLog2 + 1>(freqIdx), FFTSizeLog2);
140140
}
141141

142142
// Mirrors an index about the Nyquist frequency in the DFT order

0 commit comments

Comments
 (0)