Skip to content

Commit 49b02b6

Browse files
Merge pull request #546 from Devsh-Graphics-Programming/type_traits
HLSL202x type_traits
2 parents d4149ea + ae30095 commit 49b02b6

File tree

9 files changed

+732
-225
lines changed

9 files changed

+732
-225
lines changed

include/nbl/builtin/hlsl/cpp_compat/matrix.hlsl

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
#include <nbl/builtin/hlsl/cpp_compat/vector.hlsl>
55

6-
76
#ifndef __HLSL_VERSION
87
namespace nbl::hlsl
98
{
@@ -58,57 +57,26 @@ struct matrix final : private glm::mat<N,M,T>
5857
};
5958

6059

61-
using bool4x4 = matrix<bool, 4, 4>;
62-
using bool4x3 = matrix<bool, 4, 3>;
63-
using bool4x2 = matrix<bool, 4, 2>;
64-
using bool3x4 = matrix<bool, 3, 4>;
65-
using bool3x3 = matrix<bool, 3, 3>;
66-
using bool3x2 = matrix<bool, 3, 2>;
67-
using bool2x4 = matrix<bool, 2, 4>;
68-
using bool2x3 = matrix<bool, 2, 3>;
69-
using bool2x2 = matrix<bool, 2, 2>;
70-
71-
using int32_t4x4 = matrix<int32_t, 4, 4>;
72-
using int32_t4x3 = matrix<int32_t, 4, 3>;
73-
using int32_t4x2 = matrix<int32_t, 4, 2>;
74-
using int32_t3x4 = matrix<int32_t, 3, 4>;
75-
using int32_t3x3 = matrix<int32_t, 3, 3>;
76-
using int32_t3x2 = matrix<int32_t, 3, 2>;
77-
using int32_t2x4 = matrix<int32_t, 2, 4>;
78-
using int32_t2x3 = matrix<int32_t, 2, 3>;
79-
using int32_t2x2 = matrix<int32_t, 2, 2>;
60+
#define NBL_TYPEDEF_MATRICIES_FOR_ROW(T, R) \
61+
using T ## R ## x4 = matrix<T, R, 4>; \
62+
using T ## R ## x3 = matrix<T, R, 3>; \
63+
using T ## R ## x2 = matrix<T, R, 2>;
8064

81-
using uint32_t4x4 = matrix<uint32_t, 4, 4>;
82-
using uint32_t4x3 = matrix<uint32_t, 4, 3>;
83-
using uint32_t4x2 = matrix<uint32_t, 4, 2>;
84-
using uint32_t3x4 = matrix<uint32_t, 3, 4>;
85-
using uint32_t3x3 = matrix<uint32_t, 3, 3>;
86-
using uint32_t3x2 = matrix<uint32_t, 3, 2>;
87-
using uint32_t2x4 = matrix<uint32_t, 2, 4>;
88-
using uint32_t2x3 = matrix<uint32_t, 2, 3>;
89-
using uint32_t2x2 = matrix<uint32_t, 2, 2>;
65+
#define NBL_TYPEDEF_MATRICIES_FOR_SCALAR(T) \
66+
NBL_TYPEDEF_MATRICIES_FOR_ROW(T, 4) \
67+
NBL_TYPEDEF_MATRICIES_FOR_ROW(T, 3) \
68+
NBL_TYPEDEF_MATRICIES_FOR_ROW(T, 2)
9069

70+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(bool);
71+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(int16_t);
72+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(int32_t);
73+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(int64_t);
74+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(uint16_t);
75+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(uint32_t);
76+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(uint64_t);
9177
// TODO: halfMxN with std::float16_t
92-
93-
using float32_t4x4 = matrix<float, 4, 4>;
94-
using float32_t4x3 = matrix<float, 4, 3>;
95-
using float32_t4x2 = matrix<float, 4, 2>;
96-
using float32_t3x4 = matrix<float, 3, 4>;
97-
using float32_t3x3 = matrix<float, 3, 3>;
98-
using float32_t3x2 = matrix<float, 3, 2>;
99-
using float32_t2x4 = matrix<float, 2, 4>;
100-
using float32_t2x3 = matrix<float, 2, 3>;
101-
using float32_t2x2 = matrix<float, 2, 2>;
102-
103-
using float64_t4x4 = matrix<float64_t, 4, 4>;
104-
using float64_t4x3 = matrix<float64_t, 4, 3>;
105-
using float64_t4x2 = matrix<float64_t, 4, 2>;
106-
using float64_t3x4 = matrix<float64_t, 3, 4>;
107-
using float64_t3x3 = matrix<float64_t, 3, 3>;
108-
using float64_t3x2 = matrix<float64_t, 3, 2>;
109-
using float64_t2x4 = matrix<float64_t, 2, 4>;
110-
using float64_t2x3 = matrix<float64_t, 2, 3>;
111-
using float64_t2x2 = matrix<float64_t, 2, 2>;
78+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(float32_t);
79+
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(float64_t);
11280

11381
}
11482
#endif

include/nbl/builtin/hlsl/cpp_compat/type_traits.hlsl

Lines changed: 0 additions & 31 deletions
This file was deleted.

include/nbl/builtin/hlsl/macros.h

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
// Copyright (C) 2022 - DevSH Graphics Programming Sp. z O.O.
2+
// This file is part of the "Nabla Engine".
3+
// For conditions of distribution and use, see copyright notice in nabla.h
4+
#ifndef _NBL_BUILTIN_HLSL_MACROS_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_MACROS_INCLUDED_
6+
7+
8+
// basics
9+
#define NBL_EVAL(...) __VA_ARGS__
10+
#define NBL_CONCAT_IMPL2(X,Y) X ## Y
11+
#define NBL_CONCAT_IMPL(X,Y) NBL_CONCAT_IMPL2(X,Y)
12+
#define NBL_CONCATENATE(X,Y) NBL_CONCAT_IMPL(NBL_EVAL(X) , NBL_EVAL(Y))
13+
14+
// variadics
15+
16+
//
17+
#define NBL_ARG_125(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100,a101,a102,a103,a104,a105,a106,a107,a108,a109,a110,a111,a112,a113,a114,a115,a116,a117,a118,a119,a120,a121,a122,a123,a124,a125, ... ) a125
18+
#define NBL_VA_ARGS_COUNT( ... ) NBL_EVAL(NBL_ARG_125(__VA_ARGS__,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0))
19+
20+
//
21+
#define NBL_FOREACH_0(WHAT)
22+
#define NBL_FOREACH_1(WHAT, X) NBL_EVAL(WHAT(X))
23+
#define NBL_FOREACH_2(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_1(WHAT, __VA_ARGS__))
24+
#define NBL_FOREACH_3(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_2(WHAT, __VA_ARGS__))
25+
#define NBL_FOREACH_4(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_3(WHAT, __VA_ARGS__))
26+
#define NBL_FOREACH_5(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_4(WHAT, __VA_ARGS__))
27+
#define NBL_FOREACH_6(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_5(WHAT, __VA_ARGS__))
28+
#define NBL_FOREACH_7(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_6(WHAT, __VA_ARGS__))
29+
#define NBL_FOREACH_8(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_7(WHAT, __VA_ARGS__))
30+
#define NBL_FOREACH_9(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_8(WHAT, __VA_ARGS__))
31+
#define NBL_FOREACH_10(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_9(WHAT, __VA_ARGS__))
32+
#define NBL_FOREACH_11(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_10(WHAT, __VA_ARGS__))
33+
#define NBL_FOREACH_12(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_11(WHAT, __VA_ARGS__))
34+
#define NBL_FOREACH_13(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_12(WHAT, __VA_ARGS__))
35+
#define NBL_FOREACH_14(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_13(WHAT, __VA_ARGS__))
36+
#define NBL_FOREACH_15(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_14(WHAT, __VA_ARGS__))
37+
#define NBL_FOREACH_16(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_15(WHAT, __VA_ARGS__))
38+
#define NBL_FOREACH_17(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_16(WHAT, __VA_ARGS__))
39+
#define NBL_FOREACH_18(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_17(WHAT, __VA_ARGS__))
40+
#define NBL_FOREACH_19(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_18(WHAT, __VA_ARGS__))
41+
#define NBL_FOREACH_20(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_19(WHAT, __VA_ARGS__))
42+
#define NBL_FOREACH_21(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_20(WHAT, __VA_ARGS__))
43+
#define NBL_FOREACH_22(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_21(WHAT, __VA_ARGS__))
44+
#define NBL_FOREACH_23(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_22(WHAT, __VA_ARGS__))
45+
#define NBL_FOREACH_24(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_23(WHAT, __VA_ARGS__))
46+
#define NBL_FOREACH_25(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_24(WHAT, __VA_ARGS__))
47+
#define NBL_FOREACH_26(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_25(WHAT, __VA_ARGS__))
48+
#define NBL_FOREACH_27(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_26(WHAT, __VA_ARGS__))
49+
#define NBL_FOREACH_28(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_27(WHAT, __VA_ARGS__))
50+
#define NBL_FOREACH_29(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_28(WHAT, __VA_ARGS__))
51+
#define NBL_FOREACH_30(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_29(WHAT, __VA_ARGS__))
52+
#define NBL_FOREACH_31(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_30(WHAT, __VA_ARGS__))
53+
#define NBL_FOREACH_32(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_31(WHAT, __VA_ARGS__))
54+
#define NBL_FOREACH_33(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_32(WHAT, __VA_ARGS__))
55+
#define NBL_FOREACH_34(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_33(WHAT, __VA_ARGS__))
56+
#define NBL_FOREACH_35(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_34(WHAT, __VA_ARGS__))
57+
#define NBL_FOREACH_36(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_35(WHAT, __VA_ARGS__))
58+
#define NBL_FOREACH_37(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_36(WHAT, __VA_ARGS__))
59+
#define NBL_FOREACH_38(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_37(WHAT, __VA_ARGS__))
60+
#define NBL_FOREACH_39(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_38(WHAT, __VA_ARGS__))
61+
#define NBL_FOREACH_40(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_39(WHAT, __VA_ARGS__))
62+
#define NBL_FOREACH_41(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_40(WHAT, __VA_ARGS__))
63+
#define NBL_FOREACH_42(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_41(WHAT, __VA_ARGS__))
64+
#define NBL_FOREACH_43(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_42(WHAT, __VA_ARGS__))
65+
#define NBL_FOREACH_44(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_43(WHAT, __VA_ARGS__))
66+
#define NBL_FOREACH_45(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_44(WHAT, __VA_ARGS__))
67+
#define NBL_FOREACH_46(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_45(WHAT, __VA_ARGS__))
68+
#define NBL_FOREACH_47(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_46(WHAT, __VA_ARGS__))
69+
#define NBL_FOREACH_48(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_47(WHAT, __VA_ARGS__))
70+
#define NBL_FOREACH_49(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_48(WHAT, __VA_ARGS__))
71+
#define NBL_FOREACH_50(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_49(WHAT, __VA_ARGS__))
72+
#define NBL_FOREACH_51(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_50(WHAT, __VA_ARGS__))
73+
#define NBL_FOREACH_52(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_51(WHAT, __VA_ARGS__))
74+
#define NBL_FOREACH_53(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_52(WHAT, __VA_ARGS__))
75+
#define NBL_FOREACH_54(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_53(WHAT, __VA_ARGS__))
76+
#define NBL_FOREACH_55(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_54(WHAT, __VA_ARGS__))
77+
#define NBL_FOREACH_56(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_55(WHAT, __VA_ARGS__))
78+
#define NBL_FOREACH_57(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_56(WHAT, __VA_ARGS__))
79+
#define NBL_FOREACH_58(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_57(WHAT, __VA_ARGS__))
80+
#define NBL_FOREACH_59(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_58(WHAT, __VA_ARGS__))
81+
#define NBL_FOREACH_60(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_59(WHAT, __VA_ARGS__))
82+
#define NBL_FOREACH_61(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_60(WHAT, __VA_ARGS__))
83+
#define NBL_FOREACH_62(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_61(WHAT, __VA_ARGS__))
84+
#define NBL_FOREACH_63(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_62(WHAT, __VA_ARGS__))
85+
#define NBL_FOREACH_64(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_63(WHAT, __VA_ARGS__))
86+
#define NBL_FOREACH_65(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_64(WHAT, __VA_ARGS__))
87+
#define NBL_FOREACH_66(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_65(WHAT, __VA_ARGS__))
88+
#define NBL_FOREACH_67(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_66(WHAT, __VA_ARGS__))
89+
#define NBL_FOREACH_68(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_67(WHAT, __VA_ARGS__))
90+
#define NBL_FOREACH_69(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_68(WHAT, __VA_ARGS__))
91+
#define NBL_FOREACH_70(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_69(WHAT, __VA_ARGS__))
92+
#define NBL_FOREACH_71(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_70(WHAT, __VA_ARGS__))
93+
#define NBL_FOREACH_72(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_71(WHAT, __VA_ARGS__))
94+
#define NBL_FOREACH_73(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_72(WHAT, __VA_ARGS__))
95+
#define NBL_FOREACH_74(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_73(WHAT, __VA_ARGS__))
96+
#define NBL_FOREACH_75(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_74(WHAT, __VA_ARGS__))
97+
#define NBL_FOREACH_76(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_75(WHAT, __VA_ARGS__))
98+
#define NBL_FOREACH_77(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_76(WHAT, __VA_ARGS__))
99+
#define NBL_FOREACH_78(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_77(WHAT, __VA_ARGS__))
100+
#define NBL_FOREACH_79(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_78(WHAT, __VA_ARGS__))
101+
#define NBL_FOREACH_80(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_79(WHAT, __VA_ARGS__))
102+
#define NBL_FOREACH_81(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_80(WHAT, __VA_ARGS__))
103+
#define NBL_FOREACH_82(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_81(WHAT, __VA_ARGS__))
104+
#define NBL_FOREACH_83(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_82(WHAT, __VA_ARGS__))
105+
#define NBL_FOREACH_84(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_83(WHAT, __VA_ARGS__))
106+
#define NBL_FOREACH_85(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_84(WHAT, __VA_ARGS__))
107+
#define NBL_FOREACH_86(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_85(WHAT, __VA_ARGS__))
108+
#define NBL_FOREACH_87(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_86(WHAT, __VA_ARGS__))
109+
#define NBL_FOREACH_88(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_87(WHAT, __VA_ARGS__))
110+
#define NBL_FOREACH_89(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_88(WHAT, __VA_ARGS__))
111+
#define NBL_FOREACH_90(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_89(WHAT, __VA_ARGS__))
112+
#define NBL_FOREACH_91(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_90(WHAT, __VA_ARGS__))
113+
#define NBL_FOREACH_92(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_91(WHAT, __VA_ARGS__))
114+
#define NBL_FOREACH_93(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_92(WHAT, __VA_ARGS__))
115+
#define NBL_FOREACH_94(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_93(WHAT, __VA_ARGS__))
116+
#define NBL_FOREACH_95(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_94(WHAT, __VA_ARGS__))
117+
#define NBL_FOREACH_96(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_95(WHAT, __VA_ARGS__))
118+
#define NBL_FOREACH_97(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_96(WHAT, __VA_ARGS__))
119+
#define NBL_FOREACH_98(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_97(WHAT, __VA_ARGS__))
120+
#define NBL_FOREACH_99(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_98(WHAT, __VA_ARGS__))
121+
#define NBL_FOREACH_100(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_99(WHAT, __VA_ARGS__))
122+
#define NBL_FOREACH_101(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_100(WHAT, __VA_ARGS__))
123+
#define NBL_FOREACH_102(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_101(WHAT, __VA_ARGS__))
124+
#define NBL_FOREACH_103(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_102(WHAT, __VA_ARGS__))
125+
#define NBL_FOREACH_104(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_103(WHAT, __VA_ARGS__))
126+
#define NBL_FOREACH_105(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_104(WHAT, __VA_ARGS__))
127+
#define NBL_FOREACH_106(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_105(WHAT, __VA_ARGS__))
128+
#define NBL_FOREACH_107(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_106(WHAT, __VA_ARGS__))
129+
#define NBL_FOREACH_108(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_107(WHAT, __VA_ARGS__))
130+
#define NBL_FOREACH_109(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_108(WHAT, __VA_ARGS__))
131+
#define NBL_FOREACH_110(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_109(WHAT, __VA_ARGS__))
132+
#define NBL_FOREACH_111(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_110(WHAT, __VA_ARGS__))
133+
#define NBL_FOREACH_112(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_111(WHAT, __VA_ARGS__))
134+
#define NBL_FOREACH_113(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_112(WHAT, __VA_ARGS__))
135+
#define NBL_FOREACH_114(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_113(WHAT, __VA_ARGS__))
136+
#define NBL_FOREACH_115(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_114(WHAT, __VA_ARGS__))
137+
#define NBL_FOREACH_116(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_115(WHAT, __VA_ARGS__))
138+
#define NBL_FOREACH_117(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_116(WHAT, __VA_ARGS__))
139+
#define NBL_FOREACH_118(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_117(WHAT, __VA_ARGS__))
140+
#define NBL_FOREACH_119(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_118(WHAT, __VA_ARGS__))
141+
#define NBL_FOREACH_120(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_119(WHAT, __VA_ARGS__))
142+
#define NBL_FOREACH_121(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_120(WHAT, __VA_ARGS__))
143+
#define NBL_FOREACH_122(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_121(WHAT, __VA_ARGS__))
144+
#define NBL_FOREACH_123(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_122(WHAT, __VA_ARGS__))
145+
#define NBL_FOREACH_124(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_123(WHAT, __VA_ARGS__))
146+
#define NBL_FOREACH_125(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_124(WHAT, __VA_ARGS__))
147+
148+
#define NBL_FOREACH(WHAT, ... ) NBL_EVAL(NBL_CONCATENATE(NBL_FOREACH_,NBL_VA_ARGS_COUNT(__VA_ARGS__))(WHAT, __VA_ARGS__))
149+
150+
#endif

include/nbl/builtin/hlsl/mpl.hlsl

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Copyright (C) 2022 - DevSH Graphics Programming Sp. z O.O.
2+
// This file is part of the "Nabla Engine".
3+
// For conditions of distribution and use, see copyright notice in nabla.h
4+
#ifndef _NBL_BUILTIN_HLSL_MPL_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_MPL_INCLUDED_
6+
7+
#ifdef __HLSL_VERSION
8+
#include <nbl/builtin/hlsl/type_traits.hlsl>
9+
#endif
10+
11+
namespace nbl
12+
{
13+
namespace hlsl
14+
{
15+
namespace mpl
16+
{
17+
18+
#ifdef __HLSL_VERSION
19+
namespace impl
20+
{
21+
22+
template<uint16_t bits_log2>
23+
struct clz_masks
24+
{
25+
static const uint16_t SHIFT = uint16_t(1)<<(bits_log2-1);
26+
static const uint64_t LO_MASK = (1ull<<SHIFT)-1;
27+
};
28+
29+
template<>
30+
struct clz_masks<0>
31+
{
32+
static const uint16_t SHIFT = 0;
33+
static const uint64_t LO_MASK = 0;
34+
};
35+
36+
template<uint64_t N, uint16_t bits_log2>
37+
struct clz
38+
{
39+
static const bool CHOOSE_HIGH = N&(clz_masks<bits_log2>::LO_MASK<<clz_masks<bits_log2>::SHIFT);
40+
static const uint64_t NEXT_N = (CHOOSE_HIGH ? (N>>clz_masks<bits_log2>::SHIFT):N)&clz_masks<bits_log2>::LO_MASK;
41+
static const uint16_t value = type_traits::conditional<bits_log2,clz<NEXT_N,bits_log2-1>,type_traits::integral_constant<uint16_t,0> >::type::value + (CHOOSE_HIGH ? 0ull:clz_masks<bits_log2>::SHIFT);
42+
};
43+
44+
}
45+
46+
template<uint64_t N>
47+
struct clz
48+
{
49+
static const uint16_t value = impl::clz<N, 6>::value;
50+
};
51+
52+
template<uint64_t X>
53+
struct log2
54+
{
55+
static const uint16_t value = X ? (1ull<<6)-clz<X>::value-1 : -1ull;
56+
};
57+
58+
#endif
59+
60+
}
61+
}
62+
}
63+
64+
#endif

0 commit comments

Comments
 (0)