1
1
#ifndef _NBL_BUILTIN_HLSL_CPP_COMPAT_PROMOTE_INCLUDED_
2
2
#define _NBL_BUILTIN_HLSL_CPP_COMPAT_PROMOTE_INCLUDED_
3
3
4
+ #include "nbl/builtin/hlsl/type_traits.hlsl"
5
+
4
6
namespace nbl
5
7
{
6
8
namespace hlsl
7
9
{
8
10
9
11
namespace impl
10
12
{
13
+
11
14
// partial specialize this for `T=matrix<scalar_t,,>|vector<scalar_t,>` and `U=matrix<scalar_t,,>|vector<scalar_t,>|scalar_t`
12
15
template<typename T, typename U>
13
16
struct Promote
@@ -20,76 +23,43 @@ struct Promote
20
23
21
24
#ifdef __HLSL_VERSION
22
25
23
- // TODO: write this scalar-type agnostic!
24
- template<typename U>
25
- struct Promote<float32_t1,U>
26
- {
27
- float32_t1 operator ()(U v)
28
- {
29
- return float32_t1 (v);
30
- }
31
- };
32
-
33
- template<typename U>
34
- struct Promote<float32_t2, U>
35
- {
36
- float32_t2 operator ()(U v)
37
- {
38
- return float32_t2 (v, v);
39
- }
40
- };
41
-
42
- template<typename U>
43
- struct Promote<float32_t3, U>
44
- {
45
- float32_t3 operator ()(U v)
46
- {
47
- return float32_t3 (v, v, v);
48
- }
49
- };
50
-
51
- template<typename U>
52
- struct Promote<float32_t4, U>
53
- {
54
- float32_t4 operator ()(U v)
55
- {
56
- return float32_t4 (v, v, v, v);
57
- }
58
- };
59
-
60
- template<typename U>
61
- struct Promote<float64_t1,U>
26
+ template<typename Scalar, typename U>
27
+ struct Promote<vector <Scalar, 1 >, U>
62
28
{
63
- float64_t1 operator ()(U v)
29
+ enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 1 > > operator ()(U v)
64
30
{
65
- return float64_t1 (v);
31
+ vector <Scalar, 1 > promoted = {Scalar (v)};
32
+ return promoted;
66
33
}
67
34
};
68
35
69
- template<typename U>
70
- struct Promote<float64_t2 , U>
36
+ template<typename Scalar, typename U>
37
+ struct Promote<vector <Scalar, 2 > , U>
71
38
{
72
- float64_t2 operator ()(U v)
39
+ enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 2 > > operator ()(U v)
73
40
{
74
- return float64_t2 (v, v);
41
+ vector <Scalar, 2 > promoted = {Scalar (v), Scalar (v)};
42
+ return promoted;
75
43
}
76
44
};
77
45
78
- template<typename U>
79
- struct Promote<float64_t3 , U>
46
+ template<typename Scalar, typename U>
47
+ struct Promote<vector <Scalar, 3 > , U>
80
48
{
81
- float64_t3 operator ()(U v)
49
+ enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 3 > > operator ()(U v)
82
50
{
83
- return float64_t3 (v, v, v);
51
+ vector <Scalar, 3 > promoted = {Scalar (v), Scalar (v), Scalar (v)};
52
+ return promoted;
84
53
}
85
54
};
86
55
87
- template<typename U>
88
- struct Promote<float64_t4 , U>
56
+ template<typename Scalar, typename U>
57
+ struct Promote<vector <Scalar, 4 > , U>
89
58
{
90
- float64_t4 operator ()(U v)
59
+ enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 4 > > operator ()(U v)
91
60
{
92
- return float64_t4 (v, v, v, v);
61
+ vector <Scalar, 4 > promoted = {Scalar (v), Scalar (v), Scalar (v), Scalar (v)};
62
+ return promoted;
93
63
}
94
64
};
95
65
0 commit comments