Skip to content

Commit cdb6ad7

Browse files
author
kevyuu
committed
Unify all Truncate specializaton for vector type
1 parent 6683cd5 commit cdb6ad7

File tree

1 file changed

+16
-34
lines changed

1 file changed

+16
-34
lines changed

include/nbl/builtin/hlsl/cpp_compat/truncate.hlsl

Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ namespace nbl
99
namespace hlsl
1010
{
1111

12+
namespace concepts
13+
{
14+
template<typename To, typename From>
15+
NBL_BOOL_CONCEPT can_truncate_vector = concepts::Vectorial<To> && concepts::Vectorial<From> && concepts::same_as<typename vector_traits<To>::scalar_type, typename vector_traits<From>::scalar_type > && vector_traits<To>::Dimension <= vector_traits<From>::Dimension;
16+
}
17+
1218
namespace impl
1319
{
1420

@@ -21,44 +27,20 @@ struct Truncate
2127
}
2228
};
2329

24-
template<typename Scalar, int32_t N> NBL_PARTIAL_REQ_TOP(concepts::Scalar<Scalar>)
25-
struct Truncate<vector<Scalar, 1>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concepts::Scalar<Scalar>) >
30+
template<typename To, typename From> NBL_PARTIAL_REQ_TOP(concepts::can_truncate_vector<To, From>)
31+
struct Truncate<To, From NBL_PARTIAL_REQ_BOT(concepts::can_truncate_vector<To, From>) >
2632
{
27-
NBL_CONSTEXPR_FUNC vector<Scalar, 1> operator()(const vector<Scalar, N> v)
33+
NBL_CONSTEXPR_FUNC To operator()(const From v)
2834
{
29-
vector<Scalar, 1> truncated = { v[0] };
30-
return truncated;
35+
array_get<From, typename vector_traits<From>::scalar_type> getter;
36+
array_set<To, typename vector_traits<To>::scalar_type> setter;
37+
To output;
38+
[[unroll]]
39+
for (int i = 0; i < vector_traits<To>::Dimension; ++i)
40+
setter(output, i, getter(v, i));
41+
return output;
3142
}
32-
};
33-
34-
template<typename Scalar, int32_t N> NBL_PARTIAL_REQ_TOP(concepts::Scalar<Scalar> && N >= 2)
35-
struct Truncate<vector<Scalar, 2>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concepts::Scalar<Scalar> && N >= 2) >
36-
{
37-
NBL_CONSTEXPR_FUNC vector<Scalar, 2> operator()(const vector<Scalar, N> v)
38-
{
39-
vector<Scalar, 2> truncated = { v[0], v[1]};
40-
return truncated;
41-
}
42-
};
4343

44-
template<typename Scalar, int32_t N> NBL_PARTIAL_REQ_TOP(concepts::Scalar<Scalar>&& N >= 3)
45-
struct Truncate<vector<Scalar, 3>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concepts::Scalar<Scalar>&& N >= 3) >
46-
{
47-
NBL_CONSTEXPR_FUNC vector<Scalar, 3> operator()(const vector<Scalar, N> v)
48-
{
49-
vector<Scalar, 3> truncated = { v[0], v[1], v[2] };
50-
return truncated;
51-
}
52-
};
53-
54-
template<typename Scalar, int32_t N> NBL_PARTIAL_REQ_TOP(concepts::Scalar<Scalar>&& N >= 4)
55-
struct Truncate<vector<Scalar, 4>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concepts::Scalar<Scalar>&& N >= 4) >
56-
{
57-
NBL_CONSTEXPR_FUNC vector<Scalar, 4> operator()(const vector<Scalar, N> v)
58-
{
59-
vector<Scalar, 4> truncated = { v[0], v[1], v[2], v[3] };
60-
return truncated;
61-
}
6244
};
6345

6446
} //namespace impl

0 commit comments

Comments
 (0)