@@ -87,14 +87,23 @@ AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sqrt_helper, sqrt, T)
87
87
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (log_helper, log, T)
88
88
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (exp2_helper, exp2, T)
89
89
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (exp_helper, exp, T)
90
- AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (pow_helper, pow, T)
91
90
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (floor_helper, floor, T)
92
91
#define ISINF_AND_ISNAN_RETURN_TYPE conditional_t<is_vector_v<T>, vector <bool , vector_traits<T>::Dimension>, bool >
93
92
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (isinf_helper, isInf, ISINF_AND_ISNAN_RETURN_TYPE)
94
93
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (isnan_helper, isNan, ISINF_AND_ISNAN_RETURN_TYPE)
95
94
#undef ISINF_AND_ISNAN_RETURN_TYPE
96
95
#undef AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER
97
96
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
+
98
107
template<typename T, typename U> NBL_PARTIAL_REQ_TOP (always_true<decltype (spirv::fMix<T>(experimental::declval<T>(), experimental::declval<T>(), experimental::declval<U>()))>)
99
108
struct lerp_helper<T, U NBL_PARTIAL_REQ_BOT (always_true<decltype (spirv::fMix<T>(experimental::declval<T>(), experimental::declval<T>(), experimental::declval<U>()))>) >
100
109
{
@@ -127,10 +136,20 @@ AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(abs_helper, concepts::Scalar<T>, abs, T)
127
136
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (log_helper, concepts::Scalar<T>, log, T)
128
137
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (exp2_helper, concepts::Scalar<T>, exp2, T)
129
138
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)
131
139
AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER (floor_helper, concepts::FloatingPointScalar<T>, floor, T)
132
140
#undef AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER
133
141
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
+
134
153
template<typename T>
135
154
requires concepts::FloatingPointScalar<T>
136
155
struct isinf_helper<T>
@@ -256,8 +275,9 @@ struct HELPER_NAME<T NBL_PARTIAL_REQ_BOT(concepts::Vectorial<T>) >\
256
275
static return_t __call (NBL_CONST_REF_ARG (T) vec)\
257
276
{\
258
277
using traits = hlsl::vector_traits<T>;\
278
+ using return_t_traits = hlsl::vector_traits<return_t>;\
259
279
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;\
261
281
\
262
282
return_t output;\
263
283
for (uint32_t i = 0 ; i < traits::Dimension; ++i)\
@@ -275,14 +295,32 @@ AUTO_SPECIALIZE_HELPER_FOR_VECTOR(abs_helper, T)
275
295
AUTO_SPECIALIZE_HELPER_FOR_VECTOR (log_helper, T)
276
296
AUTO_SPECIALIZE_HELPER_FOR_VECTOR (exp2_helper, T)
277
297
AUTO_SPECIALIZE_HELPER_FOR_VECTOR (exp_helper, T)
278
- AUTO_SPECIALIZE_HELPER_FOR_VECTOR (pow_helper, T)
279
298
AUTO_SPECIALIZE_HELPER_FOR_VECTOR (floor_helper, T)
280
299
#define INT_VECTOR_RETURN_TYPE vector <int32_t, vector_traits<T>::Dimension>
281
300
AUTO_SPECIALIZE_HELPER_FOR_VECTOR (isinf_helper, INT_VECTOR_RETURN_TYPE)
282
301
AUTO_SPECIALIZE_HELPER_FOR_VECTOR (isnan_helper, INT_VECTOR_RETURN_TYPE)
283
302
#undef INT_VECTOR_RETURN_TYPE
284
303
#undef AUTO_SPECIALIZE_HELPER_FOR_VECTOR
285
304
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
+
286
324
}
287
325
}
288
326
}
0 commit comments