@@ -21,50 +21,21 @@ struct Promote
2121 }
2222};
2323
24- #ifdef __HLSL_VERSION
25-
26- template<typename Scalar, typename U>
27- struct Promote<vector <Scalar, 1 >, U>
24+ // TODO(kevinyu): Should we enable truncation from uint64_t to emulated_vector<emulated_uint64_t, N>?
25+ template<typename To, typename From> NBL_PARTIAL_REQ_TOP (concepts::Vectorial<To> && is_scalar_v<From> && is_same_v<typename vector_traits<To>::scalar_type, From>)
26+ struct Promote<To, From NBL_PARTIAL_REQ_BOT (concepts::Vectorial<To> && is_scalar_v<From> && is_same_v<typename vector_traits<To>::scalar_type, From>) >
2827{
29- NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 1 > > operator ()(const U v)
28+ NBL_CONSTEXPR_FUNC To operator ()(const From v)
3029 {
31- vector <Scalar, 1 > promoted = {Scalar (v)};
32- return promoted;
30+ array_set<To, From> setter;
31+ To output;
32+ [[unroll]]
33+ for (int i = 0 ; i < vector_traits<To>::Dimension; ++i)
34+ setter (output, i, v);
35+ return output;
3336 }
3437};
3538
36- template<typename Scalar, typename U>
37- struct Promote<vector <Scalar, 2 >, U>
38- {
39- NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 2 > > operator ()(const U v)
40- {
41- vector <Scalar, 2 > promoted = {Scalar (v), Scalar (v)};
42- return promoted;
43- }
44- };
45-
46- template<typename Scalar, typename U>
47- struct Promote<vector <Scalar, 3 >, U>
48- {
49- NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 3 > > operator ()(const U v)
50- {
51- vector <Scalar, 3 > promoted = {Scalar (v), Scalar (v), Scalar (v)};
52- return promoted;
53- }
54- };
55-
56- template<typename Scalar, typename U>
57- struct Promote<vector <Scalar, 4 >, U>
58- {
59- NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 4 > > operator ()(const U v)
60- {
61- vector <Scalar, 4 > promoted = {Scalar (v), Scalar (v), Scalar (v), Scalar (v)};
62- return promoted;
63- }
64- };
65-
66- #endif
67-
6839}
6940
7041template<typename T, typename U>
0 commit comments