Skip to content

Commit 237fbc1

Browse files
committed
Added trig functions
1 parent 644c1db commit 237fbc1

File tree

5 files changed

+180
-9
lines changed

5 files changed

+180
-9
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ struct HELPER_NAME<BOOST_PP_SEQ_FOR_EACH_I(WRAP, _, ARG_TYPE_LIST) NBL_PARTIAL_R
100100
using return_t = __VA_ARGS__;\
101101
static inline return_t __call( BOOST_PP_SEQ_FOR_EACH_I(DECL_ARG, _, ARG_TYPE_SET) )\
102102
{\
103-
return spirv::SPIRV_FUNCTION_NAME<T>( BOOST_PP_SEQ_FOR_EACH_I(ARG, _, ARG_TYPE_SET) );\
103+
return spirv::SPIRV_FUNCTION_NAME<BOOST_PP_SEQ_FOR_EACH_I(WRAP, _, ARG_TYPE_LIST)>( BOOST_PP_SEQ_FOR_EACH_I(ARG, _, ARG_TYPE_SET) );\
104104
}\
105105
};
106106

@@ -197,7 +197,7 @@ struct inverse_helper<SquareMatrix NBL_PARTIAL_REQ_BOT(concepts::Matrix<SquareMa
197197
{
198198
static SquareMatrix __call(NBL_CONST_REF_ARG(SquareMatrix) mat)
199199
{
200-
return spirv::matrixInverse(mat);
200+
return spirv::matrixInverse<SquareMatrix>(mat);
201201
}
202202
};
203203

@@ -217,7 +217,7 @@ struct determinant_helper<SquareMatrix NBL_PARTIAL_REQ_BOT(matrix_traits<SquareM
217217
{
218218
static typename matrix_traits<SquareMatrix>::scalar_type __call(NBL_CONST_REF_ARG(SquareMatrix) mat)
219219
{
220-
return spirv::determinant(mat);
220+
return spirv::determinant<SquareMatrix>(mat);
221221
}
222222
};
223223

include/nbl/builtin/hlsl/spirv_intrinsics/glsl.std.450.hlsl

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,13 @@ template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar<T>)
9595
[[vk::ext_instruction(GLSLstd450::GLSLstd450FMix, "GLSL.std.450")]]
9696
T fMix(T x, T y, T a);
9797

98-
template<typename T, int N>
98+
template<typename SquareMatrix NBL_FUNC_REQUIRES(matrix_traits<SquareMatrix>::Square)
9999
[[vk::ext_instruction(GLSLstd450::GLSLstd450Determinant, "GLSL.std.450")]]
100-
T determinant(NBL_CONST_REF_ARG(matrix<T, N, N>) mat);
100+
typename matrix_traits<SquareMatrix>::scalar_type determinant(NBL_CONST_REF_ARG(SquareMatrix) mat);
101101

102-
template<typename T, int N>
102+
template<typename SquareMatrix NBL_FUNC_REQUIRES(matrix_traits<SquareMatrix>::Square)
103103
[[vk::ext_instruction(GLSLstd450MatrixInverse, "GLSL.std.450")]]
104-
matrix<T, N, N> matrixInverse(NBL_CONST_REF_ARG(matrix<T, N, N>) mat);
104+
SquareMatrix matrixInverse(NBL_CONST_REF_ARG(SquareMatrix) mat);
105105

106106
[[vk::ext_instruction(GLSLstd450UnpackSnorm2x16, "GLSL.std.450")]]
107107
float32_t2 unpackSnorm2x16(uint32_t p);
@@ -169,6 +169,46 @@ template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or1
169169
[[vk::ext_instruction(GLSLstd450Acos, "GLSL.std.450")]]
170170
T acos(T val);
171171

172+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
173+
[[vk::ext_instruction(GLSLstd450Tan, "GLSL.std.450")]]
174+
T tan(T val);
175+
176+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
177+
[[vk::ext_instruction(GLSLstd450Asin, "GLSL.std.450")]]
178+
T asin(T val);
179+
180+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
181+
[[vk::ext_instruction(GLSLstd450Atan, "GLSL.std.450")]]
182+
T atan(T val);
183+
184+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
185+
[[vk::ext_instruction(GLSLstd450Sinh, "GLSL.std.450")]]
186+
T sinh(T val);
187+
188+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
189+
[[vk::ext_instruction(GLSLstd450Cosh, "GLSL.std.450")]]
190+
T cosh(T val);
191+
192+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
193+
[[vk::ext_instruction(GLSLstd450Tanh, "GLSL.std.450")]]
194+
T tanh(T val);
195+
196+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
197+
[[vk::ext_instruction(GLSLstd450Asinh, "GLSL.std.450")]]
198+
T asinh(T val);
199+
200+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
201+
[[vk::ext_instruction(GLSLstd450Acosh, "GLSL.std.450")]]
202+
T acosh(T val);
203+
204+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
205+
[[vk::ext_instruction(GLSLstd450Atanh, "GLSL.std.450")]]
206+
T atanh(T val);
207+
208+
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar32or16BitSize<T>)
209+
[[vk::ext_instruction(GLSLstd450Atan2, "GLSL.std.450")]]
210+
T atan2(T y, T x);
211+
172212
template<typename T NBL_FUNC_REQUIRES(concepts::FloatingPointVectorOrScalar<T>)
173213
[[vk::ext_instruction(GLSLstd450Fract, "GLSL.std.450")]]
174214
T fract(T val);

include/nbl/builtin/hlsl/tgmath.hlsl

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,67 @@ inline T acos(NBL_CONST_REF_ARG(T) val)
113113
return tgmath_impl::acos_helper<T>::__call(val);
114114
}
115115

116+
template<typename T>
117+
inline T tan(NBL_CONST_REF_ARG(T) val)
118+
{
119+
return tgmath_impl::tan_helper<T>::__call(val);
120+
}
121+
122+
template<typename T>
123+
inline T asin(NBL_CONST_REF_ARG(T) val)
124+
{
125+
return tgmath_impl::asin_helper<T>::__call(val);
126+
}
127+
128+
template<typename T>
129+
inline T atan(NBL_CONST_REF_ARG(T) val)
130+
{
131+
return tgmath_impl::atan_helper<T>::__call(val);
132+
}
133+
134+
template<typename T>
135+
inline T sinh(NBL_CONST_REF_ARG(T) val)
136+
{
137+
return tgmath_impl::sinh_helper<T>::__call(val);
138+
}
139+
140+
template<typename T>
141+
inline T cosh(NBL_CONST_REF_ARG(T) val)
142+
{
143+
return tgmath_impl::cosh_helper<T>::__call(val);
144+
}
145+
146+
template<typename T>
147+
inline T tanh(NBL_CONST_REF_ARG(T) val)
148+
{
149+
return tgmath_impl::tanh_helper<T>::__call(val);
150+
}
151+
152+
template<typename T>
153+
inline T asinh(NBL_CONST_REF_ARG(T) val)
154+
{
155+
return tgmath_impl::asinh_helper<T>::__call(val);
156+
}
157+
158+
template<typename T>
159+
inline T acosh(NBL_CONST_REF_ARG(T) val)
160+
{
161+
return tgmath_impl::acosh_helper<T>::__call(val);
162+
}
163+
164+
template<typename T>
165+
inline T atanh(NBL_CONST_REF_ARG(T) val)
166+
{
167+
return tgmath_impl::atanh_helper<T>::__call(val);
168+
}
169+
170+
template<typename T>
171+
inline T atan2(NBL_CONST_REF_ARG(T) y, NBL_CONST_REF_ARG(T) x)
172+
{
173+
return tgmath_impl::atan2_helper<T>::__call(y, x);
174+
}
175+
176+
116177
/**
117178
* @brief Returns fractional part of given floating-point value.
118179
*

include/nbl/builtin/hlsl/tgmath/impl.hlsl

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,27 @@ template<typename T NBL_STRUCT_CONSTRAINABLE>
6464
struct sin_helper;
6565
template<typename T NBL_STRUCT_CONSTRAINABLE>
6666
struct acos_helper;
67+
template<typename T NBL_STRUCT_CONSTRAINABLE>
68+
struct tan_helper;
69+
template<typename T NBL_STRUCT_CONSTRAINABLE>
70+
struct asin_helper;
71+
template<typename T NBL_STRUCT_CONSTRAINABLE>
72+
struct atan_helper;
73+
template<typename T NBL_STRUCT_CONSTRAINABLE>
74+
struct sinh_helper;
75+
template<typename T NBL_STRUCT_CONSTRAINABLE>
76+
struct cosh_helper;
77+
template<typename T NBL_STRUCT_CONSTRAINABLE>
78+
struct tanh_helper;
79+
template<typename T NBL_STRUCT_CONSTRAINABLE>
80+
struct asinh_helper;
81+
template<typename T NBL_STRUCT_CONSTRAINABLE>
82+
struct acosh_helper;
83+
template<typename T NBL_STRUCT_CONSTRAINABLE>
84+
struct atanh_helper;
85+
template<typename T NBL_STRUCT_CONSTRAINABLE>
86+
struct atan2_helper;
87+
6788
template<typename T NBL_STRUCT_CONSTRAINABLE>
6889
struct sqrt_helper;
6990
template<typename T NBL_STRUCT_CONSTRAINABLE>
@@ -108,6 +129,16 @@ struct HELPER_NAME<BOOST_PP_SEQ_FOR_EACH_I(WRAP, _, ARG_TYPE_LIST) NBL_PARTIAL_R
108129
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sin_helper, sin, (T), (T), T)
109130
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(cos_helper, cos, (T), (T), T)
110131
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(acos_helper, acos, (T), (T), T)
132+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(tan_helper, tan, (T), (T), T)
133+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(asin_helper, asin, (T), (T), T)
134+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(atan_helper, atan, (T), (T), T)
135+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sinh_helper, sinh, (T), (T), T)
136+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(cosh_helper, cosh, (T), (T), T)
137+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(tanh_helper, tanh, (T), (T), T)
138+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(asinh_helper, asinh, (T), (T), T)
139+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(acosh_helper, acosh, (T), (T), T)
140+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(atanh_helper, atanh, (T), (T), T)
141+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(atan2_helper, atan2, (T), (T)(T), T)
111142
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(abs_helper, sAbs, (T), (T), T)
112143
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(abs_helper, fAbs, (T), (T), T)
113144
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sqrt_helper, sqrt, (T), (T), T)
@@ -213,7 +244,17 @@ struct HELPER_NAME<BOOST_PP_SEQ_FOR_EACH_I(WRAP, _, ARG_TYPE_LIST)>\
213244

214245
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(cos_helper, cos, concepts::FloatingPointScalar<T>, (T), (T), T)
215246
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sin_helper, sin, concepts::FloatingPointScalar<T>, (T), (T), T)
216-
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(acos_helper, acos, concepts::FloatingPointScalar<T>, (T), (T), T)
247+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(tan_helper, tan, concepts::FloatingPointScalar<T>, (T), (T), T)
248+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(asin_helper, asin, concepts::FloatingPointScalar<T>, (T), (T), T)
249+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(acos_helper, acos, concepts::FloatingPointScalar<T>, (T), (T), T)
250+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(atan_helper, atan, concepts::FloatingPointScalar<T>, (T), (T), T)
251+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sinh_helper, sinh, concepts::FloatingPointScalar<T>, (T), (T), T)
252+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(cosh_helper, cosh, concepts::FloatingPointScalar<T>, (T), (T), T)
253+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(tanh_helper, tanh, concepts::FloatingPointScalar<T>, (T), (T), T)
254+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(asinh_helper, asinh, concepts::FloatingPointScalar<T>, (T), (T), T)
255+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(acosh_helper, acosh, concepts::FloatingPointScalar<T>, (T), (T), T)
256+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(atanh_helper, atanh, concepts::FloatingPointScalar<T>, (T), (T), T)
257+
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(atan2_helper, atan2, concepts::FloatingPointScalar<T>, (T), (T)(T), T)
217258
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(sqrt_helper, sqrt, concepts::FloatingPointScalar<T>, (T), (T), T)
218259
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(abs_helper, abs, concepts::Scalar<T>, (T), (T), T)
219260
template<typename T> AUTO_SPECIALIZE_TRIVIAL_CASE_HELPER(log_helper, log, concepts::Scalar<T>, (T), (T), T)
@@ -447,6 +488,16 @@ AUTO_SPECIALIZE_HELPER_FOR_VECTOR(isnan_helper, INT_VECTOR_RETURN_TYPE)
447488
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(cos_helper, T)
448489
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(sin_helper, T)
449490
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(acos_helper, T)
491+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(tan_helper, T)
492+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(asin_helper, T)
493+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(atan_helper, T)
494+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(sinh_helper, T)
495+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(cosh_helper, T)
496+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(tanh_helper, T)
497+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(asinh_helper, T)
498+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(acosh_helper, T)
499+
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(atanh_helper, T)
500+
450501
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(modf_helper, T)
451502
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(round_helper, T)
452503
AUTO_SPECIALIZE_HELPER_FOR_VECTOR(roundEven_helper, T)
@@ -576,6 +627,25 @@ struct frexpStruct_helper<T NBL_PARTIAL_REQ_BOT(VECTOR_SPECIALIZATION_CONCEPT) >
576627
}
577628
};
578629

630+
template<typename T>
631+
NBL_PARTIAL_REQ_TOP(VECTOR_SPECIALIZATION_CONCEPT)
632+
struct atan2_helper<T NBL_PARTIAL_REQ_BOT(VECTOR_SPECIALIZATION_CONCEPT) >
633+
{
634+
using return_t = T;
635+
static return_t __call(NBL_CONST_REF_ARG(T) y, NBL_CONST_REF_ARG(T) x)
636+
{
637+
using traits = hlsl::vector_traits<T>;
638+
array_get<T, typename traits::scalar_type> getter;
639+
array_set<T, typename traits::scalar_type> setter;
640+
641+
return_t output;
642+
for (uint32_t i = 0; i < traits::Dimension; ++i)
643+
setter(output, i, atan2_helper<typename traits::scalar_type>::__call(getter(y, i), getter(x, i)));
644+
645+
return output;
646+
}
647+
};
648+
579649
#undef VECTOR_SPECIALIZATION_CONCEPT
580650

581651
}

0 commit comments

Comments
 (0)