@@ -87,14 +87,23 @@ AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sqrt_helper, sqrt, T)
8787AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (log_helper, log, T)
8888AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (exp2_helper, exp2, T)
8989AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (exp_helper, exp, T)
90- AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (pow_helper, pow, T)
9190AUTO_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 >
9392AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (isinf_helper, isInf, ISINF_AND_ISNAN_RETURN_TYPE)
9493AUTO_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+
98107template<typename T, typename U> NBL_PARTIAL_REQ_TOP (always_true<decltype (spirv::fMix<T>(experimental::declval<T>(), experimental::declval<T>(), experimental::declval<U>()))>)
99108struct 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)
127136AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (log_helper, concepts::Scalar<T>, log, T)
128137AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (exp2_helper, concepts::Scalar<T>, exp2, T)
129138AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (exp_helper, concepts::Scalar<T>, exp, T)
130- AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (pow_helper, concepts::FloatingPointScalar<T>, pow, T)
131139AUTO_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+
134153template<typename T>
135154requires concepts::FloatingPointScalar<T>
136155struct 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)
275295AUTO_SPECIALIZE_HELPER_FOR_VECTOR (log_helper, T)
276296AUTO_SPECIALIZE_HELPER_FOR_VECTOR (exp2_helper, T)
277297AUTO_SPECIALIZE_HELPER_FOR_VECTOR (exp_helper, T)
278- AUTO_SPECIALIZE_HELPER_FOR_VECTOR (pow_helper, T)
279298AUTO_SPECIALIZE_HELPER_FOR_VECTOR (floor_helper, T)
280299#define INT_VECTOR_RETURN_TYPE vector <int32_t, vector_traits<T>::Dimension>
281300AUTO_SPECIALIZE_HELPER_FOR_VECTOR (isinf_helper, INT_VECTOR_RETURN_TYPE)
282301AUTO_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