Skip to content

Commit eccc6e9

Browse files
committed
Fixes
1 parent dcfc25b commit eccc6e9

File tree

2 files changed

+43
-5
lines changed

2 files changed

+43
-5
lines changed

include/nbl/builtin/hlsl/impl/tgmath_impl.hlsl

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,23 @@ AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sqrt_helper, sqrt, T)
8787
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(log_helper, log, T)
8888
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(exp2_helper, exp2, T)
8989
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(exp_helper, exp, T)
90-
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(pow_helper, pow, T)
9190
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(floor_helper, floor, T)
9291
#define ISINF_AND_ISNAN_RETURN_TYPE conditional_t<is_vector_v<T>, vector<bool, vector_traits<T>::Dimension>, bool>
9392
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(isinf_helper, isInf, ISINF_AND_ISNAN_RETURN_TYPE)
9493
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(isnan_helper, isNan, ISINF_AND_ISNAN_RETURN_TYPE)
9594
#undef ISINF_AND_ISNAN_RETURN_TYPE
9695
#undef AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER
9796

97+
template<typename T, typename U> NBL_PARTIAL_REQ_TOP(always_true<decltype(spirv::pow<T>(experimental::declval<T>(), experimental::declval<T>()))>)
98+
struct pow_helper<T, U NBL_PARTIAL_REQ_BOT(always_true<decltype(spirv::pow<T>(experimental::declval<T>(), experimental::declval<T>()))>) >
99+
{
100+
using return_t = T;
101+
static inline return_t __call(const T x, const T y)
102+
{
103+
return spirv::pow<T>(x, y, a);
104+
}
105+
};
106+
98107
template<typename T, typename U> NBL_PARTIAL_REQ_TOP(always_true<decltype(spirv::fMix<T>(experimental::declval<T>(), experimental::declval<T>(), experimental::declval<U>()))>)
99108
struct lerp_helper<T, U NBL_PARTIAL_REQ_BOT(always_true<decltype(spirv::fMix<T>(experimental::declval<T>(), experimental::declval<T>(), experimental::declval<U>()))>) >
100109
{
@@ -127,10 +136,20 @@ AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(abs_helper, concepts::Scalar<T>, abs, T)
127136
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(log_helper, concepts::Scalar<T>, log, T)
128137
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(exp2_helper, concepts::Scalar<T>, exp2, T)
129138
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(exp_helper, concepts::Scalar<T>, exp, T)
130-
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(pow_helper, concepts::FloatingPointScalar<T>, pow, T)
131139
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(floor_helper, concepts::FloatingPointScalar<T>, floor, T)
132140
#undef AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER
133141

142+
template<typename T>
143+
requires concepts::FloatingPointScalar<T>
144+
struct pow_helper<T>
145+
{
146+
using return_t = T;
147+
static inline return_t __call(const T x, const T y)
148+
{
149+
return std::pow(x, y);
150+
}
151+
};
152+
134153
template<typename T>
135154
requires concepts::FloatingPointScalar<T>
136155
struct isinf_helper<T>
@@ -256,8 +275,9 @@ struct HELPER_NAME<T NBL_PARTIAL_REQ_BOT(concepts::Vectorial<T>) >\
256275
static return_t __call(NBL_CONST_REF_ARG(T) vec)\
257276
{\
258277
using traits = hlsl::vector_traits<T>;\
278+
using return_t_traits = hlsl::vector_traits<return_t>;\
259279
array_get<T, typename traits::scalar_type> getter;\
260-
array_set<T, typename traits::scalar_type> setter;\
280+
array_set<return_t, typename return_t_traits::scalar_type> setter;\
261281
\
262282
return_t output;\
263283
for (uint32_t i = 0; i < traits::Dimension; ++i)\
@@ -275,14 +295,32 @@ AUTO_SPECIALIZE_HELPER_FOR_VECTOR(abs_helper, T)
275295
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(log_helper, T)
276296
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(exp2_helper, T)
277297
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(exp_helper, T)
278-
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(pow_helper, T)
279298
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(floor_helper, T)
280299
#define INT_VECTOR_RETURN_TYPE vector<int32_t, vector_traits<T>::Dimension>
281300
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(isinf_helper, INT_VECTOR_RETURN_TYPE)
282301
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(isnan_helper, INT_VECTOR_RETURN_TYPE)
283302
#undef INT_VECTOR_RETURN_TYPE
284303
#undef AUTO_SPECIALIZE_HELPER_FOR_VECTOR
285304

305+
template<typename T>
306+
NBL_PARTIAL_REQ_TOP(concepts::Vectorial<T>)
307+
struct pow_helper<T NBL_PARTIAL_REQ_BOT(concepts::Vectorial<T>) >
308+
{
309+
using return_t = T;
310+
static return_t __call(NBL_CONST_REF_ARG(T) x, NBL_CONST_REF_ARG(T) y)
311+
{
312+
using traits = hlsl::vector_traits<T>;
313+
array_get<T, typename traits::scalar_type> getter;
314+
array_set<T, typename traits::scalar_type> setter;
315+
316+
return_t output;
317+
for (uint32_t i = 0; i < traits::Dimension; ++i)
318+
setter(output, i, pow_helper<typename traits::scalar_type>::__call(getter(x, i), getter(y, i)));
319+
320+
return output;
321+
}
322+
};
323+
286324
}
287325
}
288326
}

0 commit comments

Comments
 (0)