Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3170dee
hlsl type_traits
atkurtul Sep 19, 2023
b5c1c28
move basic macros to builtins/hlsl/macros
atkurtul Sep 20, 2023
b41c728
type_traits checklist
atkurtul Sep 20, 2023
3d72142
fix ifdef
atkurtul Sep 20, 2023
ba42fbd
fix is_compound typo
atkurtul Sep 20, 2023
989e2c7
qualify vectors & matricies is_floating_point etc.
atkurtul Sep 20, 2023
690a7a3
Merge branch 'master' into type_traits
atkurtul Oct 4, 2023
6720e39
fix gauss_legendre builtin path in cmakelists
atkurtul Oct 4, 2023
529fd13
rename meta_math -> mpl & add consteval log2 + clz
atkurtul Oct 4, 2023
07a87f1
add extra constant impls
atkurtul Oct 4, 2023
be7d796
compiling workaround for clz
atkurtul Oct 4, 2023
b9c4777
typeid & decltype
atkurtul Oct 4, 2023
cf51f49
add mpl to builtin resources
atkurtul Oct 4, 2023
6a2fb98
update submodule
atkurtul Oct 4, 2023
660af38
Merge branch 'master' into type_traits
atkurtul Oct 4, 2023
a9ee791
rename mpl::log2 & define decltype for all scalars
atkurtul Oct 4, 2023
ef1b9db
Merge branch 'master' into type_traits
atkurtul Oct 4, 2023
d40d913
update master merged examples_tests
atkurtul Oct 4, 2023
5bb0f08
decltype for vectors and matricies as well
atkurtul Oct 4, 2023
7198ff9
register all builtin types
atkurtul Oct 4, 2023
2892202
move typeid_t out of impl
atkurtul Oct 4, 2023
02e7598
wrap namespaces
atkurtul Oct 4, 2023
ffe9a73
add -Wno-c++11-extensions to default dxc args
atkurtul Oct 4, 2023
e2aa56f
move cpp_compat/type_traits.hlsl into type_traits.hlsl & smarter type…
atkurtul Oct 4, 2023
69a1537
update tests
atkurtul Oct 4, 2023
a4f5ecb
is_[un]bounded_array
atkurtul Oct 4, 2023
ae30095
enable_if && type_identity
atkurtul Oct 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples_tests
66 changes: 17 additions & 49 deletions include/nbl/builtin/hlsl/cpp_compat/matrix.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

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


#ifndef __HLSL_VERSION
namespace nbl::hlsl
{
Expand Down Expand Up @@ -58,57 +57,26 @@ struct matrix final : private glm::mat<N,M,T>
};


using bool4x4 = matrix<bool, 4, 4>;
using bool4x3 = matrix<bool, 4, 3>;
using bool4x2 = matrix<bool, 4, 2>;
using bool3x4 = matrix<bool, 3, 4>;
using bool3x3 = matrix<bool, 3, 3>;
using bool3x2 = matrix<bool, 3, 2>;
using bool2x4 = matrix<bool, 2, 4>;
using bool2x3 = matrix<bool, 2, 3>;
using bool2x2 = matrix<bool, 2, 2>;

using int32_t4x4 = matrix<int32_t, 4, 4>;
using int32_t4x3 = matrix<int32_t, 4, 3>;
using int32_t4x2 = matrix<int32_t, 4, 2>;
using int32_t3x4 = matrix<int32_t, 3, 4>;
using int32_t3x3 = matrix<int32_t, 3, 3>;
using int32_t3x2 = matrix<int32_t, 3, 2>;
using int32_t2x4 = matrix<int32_t, 2, 4>;
using int32_t2x3 = matrix<int32_t, 2, 3>;
using int32_t2x2 = matrix<int32_t, 2, 2>;
#define NBL_TYPEDEF_MATRICIES_FOR_ROW(T, R) \
using T ## R ## x4 = matrix<T, R, 4>; \
using T ## R ## x3 = matrix<T, R, 3>; \
using T ## R ## x2 = matrix<T, R, 2>;

using uint32_t4x4 = matrix<uint32_t, 4, 4>;
using uint32_t4x3 = matrix<uint32_t, 4, 3>;
using uint32_t4x2 = matrix<uint32_t, 4, 2>;
using uint32_t3x4 = matrix<uint32_t, 3, 4>;
using uint32_t3x3 = matrix<uint32_t, 3, 3>;
using uint32_t3x2 = matrix<uint32_t, 3, 2>;
using uint32_t2x4 = matrix<uint32_t, 2, 4>;
using uint32_t2x3 = matrix<uint32_t, 2, 3>;
using uint32_t2x2 = matrix<uint32_t, 2, 2>;
#define NBL_TYPEDEF_MATRICIES_FOR_SCALAR(T) \
NBL_TYPEDEF_MATRICIES_FOR_ROW(T, 4) \
NBL_TYPEDEF_MATRICIES_FOR_ROW(T, 3) \
NBL_TYPEDEF_MATRICIES_FOR_ROW(T, 2)

NBL_TYPEDEF_MATRICIES_FOR_SCALAR(bool);
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(int16_t);
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(int32_t);
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(int64_t);
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(uint16_t);
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(uint32_t);
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(uint64_t);
// TODO: halfMxN with std::float16_t

using float32_t4x4 = matrix<float, 4, 4>;
using float32_t4x3 = matrix<float, 4, 3>;
using float32_t4x2 = matrix<float, 4, 2>;
using float32_t3x4 = matrix<float, 3, 4>;
using float32_t3x3 = matrix<float, 3, 3>;
using float32_t3x2 = matrix<float, 3, 2>;
using float32_t2x4 = matrix<float, 2, 4>;
using float32_t2x3 = matrix<float, 2, 3>;
using float32_t2x2 = matrix<float, 2, 2>;

using float64_t4x4 = matrix<float64_t, 4, 4>;
using float64_t4x3 = matrix<float64_t, 4, 3>;
using float64_t4x2 = matrix<float64_t, 4, 2>;
using float64_t3x4 = matrix<float64_t, 3, 4>;
using float64_t3x3 = matrix<float64_t, 3, 3>;
using float64_t3x2 = matrix<float64_t, 3, 2>;
using float64_t2x4 = matrix<float64_t, 2, 4>;
using float64_t2x3 = matrix<float64_t, 2, 3>;
using float64_t2x2 = matrix<float64_t, 2, 2>;
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(float32_t);
NBL_TYPEDEF_MATRICIES_FOR_SCALAR(float64_t);

}
#endif
Expand Down
31 changes: 0 additions & 31 deletions include/nbl/builtin/hlsl/cpp_compat/type_traits.hlsl

This file was deleted.

150 changes: 150 additions & 0 deletions include/nbl/builtin/hlsl/macros.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
// Copyright (C) 2022 - DevSH Graphics Programming Sp. z O.O.
// This file is part of the "Nabla Engine".
// For conditions of distribution and use, see copyright notice in nabla.h
#ifndef _NBL_BUILTIN_HLSL_MACROS_INCLUDED_
#define _NBL_BUILTIN_HLSL_MACROS_INCLUDED_


// basics
#define NBL_EVAL(...) __VA_ARGS__
#define NBL_CONCAT_IMPL2(X,Y) X ## Y
#define NBL_CONCAT_IMPL(X,Y) NBL_CONCAT_IMPL2(X,Y)
#define NBL_CONCATENATE(X,Y) NBL_CONCAT_IMPL(NBL_EVAL(X) , NBL_EVAL(Y))

// variadics

//
#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
#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))

//
#define NBL_FOREACH_0(WHAT)
#define NBL_FOREACH_1(WHAT, X) NBL_EVAL(WHAT(X))
#define NBL_FOREACH_2(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_1(WHAT, __VA_ARGS__))
#define NBL_FOREACH_3(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_2(WHAT, __VA_ARGS__))
#define NBL_FOREACH_4(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_3(WHAT, __VA_ARGS__))
#define NBL_FOREACH_5(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_4(WHAT, __VA_ARGS__))
#define NBL_FOREACH_6(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_5(WHAT, __VA_ARGS__))
#define NBL_FOREACH_7(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_6(WHAT, __VA_ARGS__))
#define NBL_FOREACH_8(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_7(WHAT, __VA_ARGS__))
#define NBL_FOREACH_9(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_8(WHAT, __VA_ARGS__))
#define NBL_FOREACH_10(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_9(WHAT, __VA_ARGS__))
#define NBL_FOREACH_11(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_10(WHAT, __VA_ARGS__))
#define NBL_FOREACH_12(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_11(WHAT, __VA_ARGS__))
#define NBL_FOREACH_13(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_12(WHAT, __VA_ARGS__))
#define NBL_FOREACH_14(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_13(WHAT, __VA_ARGS__))
#define NBL_FOREACH_15(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_14(WHAT, __VA_ARGS__))
#define NBL_FOREACH_16(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_15(WHAT, __VA_ARGS__))
#define NBL_FOREACH_17(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_16(WHAT, __VA_ARGS__))
#define NBL_FOREACH_18(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_17(WHAT, __VA_ARGS__))
#define NBL_FOREACH_19(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_18(WHAT, __VA_ARGS__))
#define NBL_FOREACH_20(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_19(WHAT, __VA_ARGS__))
#define NBL_FOREACH_21(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_20(WHAT, __VA_ARGS__))
#define NBL_FOREACH_22(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_21(WHAT, __VA_ARGS__))
#define NBL_FOREACH_23(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_22(WHAT, __VA_ARGS__))
#define NBL_FOREACH_24(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_23(WHAT, __VA_ARGS__))
#define NBL_FOREACH_25(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_24(WHAT, __VA_ARGS__))
#define NBL_FOREACH_26(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_25(WHAT, __VA_ARGS__))
#define NBL_FOREACH_27(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_26(WHAT, __VA_ARGS__))
#define NBL_FOREACH_28(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_27(WHAT, __VA_ARGS__))
#define NBL_FOREACH_29(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_28(WHAT, __VA_ARGS__))
#define NBL_FOREACH_30(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_29(WHAT, __VA_ARGS__))
#define NBL_FOREACH_31(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_30(WHAT, __VA_ARGS__))
#define NBL_FOREACH_32(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_31(WHAT, __VA_ARGS__))
#define NBL_FOREACH_33(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_32(WHAT, __VA_ARGS__))
#define NBL_FOREACH_34(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_33(WHAT, __VA_ARGS__))
#define NBL_FOREACH_35(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_34(WHAT, __VA_ARGS__))
#define NBL_FOREACH_36(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_35(WHAT, __VA_ARGS__))
#define NBL_FOREACH_37(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_36(WHAT, __VA_ARGS__))
#define NBL_FOREACH_38(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_37(WHAT, __VA_ARGS__))
#define NBL_FOREACH_39(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_38(WHAT, __VA_ARGS__))
#define NBL_FOREACH_40(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_39(WHAT, __VA_ARGS__))
#define NBL_FOREACH_41(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_40(WHAT, __VA_ARGS__))
#define NBL_FOREACH_42(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_41(WHAT, __VA_ARGS__))
#define NBL_FOREACH_43(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_42(WHAT, __VA_ARGS__))
#define NBL_FOREACH_44(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_43(WHAT, __VA_ARGS__))
#define NBL_FOREACH_45(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_44(WHAT, __VA_ARGS__))
#define NBL_FOREACH_46(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_45(WHAT, __VA_ARGS__))
#define NBL_FOREACH_47(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_46(WHAT, __VA_ARGS__))
#define NBL_FOREACH_48(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_47(WHAT, __VA_ARGS__))
#define NBL_FOREACH_49(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_48(WHAT, __VA_ARGS__))
#define NBL_FOREACH_50(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_49(WHAT, __VA_ARGS__))
#define NBL_FOREACH_51(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_50(WHAT, __VA_ARGS__))
#define NBL_FOREACH_52(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_51(WHAT, __VA_ARGS__))
#define NBL_FOREACH_53(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_52(WHAT, __VA_ARGS__))
#define NBL_FOREACH_54(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_53(WHAT, __VA_ARGS__))
#define NBL_FOREACH_55(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_54(WHAT, __VA_ARGS__))
#define NBL_FOREACH_56(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_55(WHAT, __VA_ARGS__))
#define NBL_FOREACH_57(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_56(WHAT, __VA_ARGS__))
#define NBL_FOREACH_58(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_57(WHAT, __VA_ARGS__))
#define NBL_FOREACH_59(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_58(WHAT, __VA_ARGS__))
#define NBL_FOREACH_60(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_59(WHAT, __VA_ARGS__))
#define NBL_FOREACH_61(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_60(WHAT, __VA_ARGS__))
#define NBL_FOREACH_62(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_61(WHAT, __VA_ARGS__))
#define NBL_FOREACH_63(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_62(WHAT, __VA_ARGS__))
#define NBL_FOREACH_64(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_63(WHAT, __VA_ARGS__))
#define NBL_FOREACH_65(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_64(WHAT, __VA_ARGS__))
#define NBL_FOREACH_66(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_65(WHAT, __VA_ARGS__))
#define NBL_FOREACH_67(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_66(WHAT, __VA_ARGS__))
#define NBL_FOREACH_68(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_67(WHAT, __VA_ARGS__))
#define NBL_FOREACH_69(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_68(WHAT, __VA_ARGS__))
#define NBL_FOREACH_70(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_69(WHAT, __VA_ARGS__))
#define NBL_FOREACH_71(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_70(WHAT, __VA_ARGS__))
#define NBL_FOREACH_72(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_71(WHAT, __VA_ARGS__))
#define NBL_FOREACH_73(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_72(WHAT, __VA_ARGS__))
#define NBL_FOREACH_74(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_73(WHAT, __VA_ARGS__))
#define NBL_FOREACH_75(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_74(WHAT, __VA_ARGS__))
#define NBL_FOREACH_76(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_75(WHAT, __VA_ARGS__))
#define NBL_FOREACH_77(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_76(WHAT, __VA_ARGS__))
#define NBL_FOREACH_78(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_77(WHAT, __VA_ARGS__))
#define NBL_FOREACH_79(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_78(WHAT, __VA_ARGS__))
#define NBL_FOREACH_80(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_79(WHAT, __VA_ARGS__))
#define NBL_FOREACH_81(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_80(WHAT, __VA_ARGS__))
#define NBL_FOREACH_82(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_81(WHAT, __VA_ARGS__))
#define NBL_FOREACH_83(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_82(WHAT, __VA_ARGS__))
#define NBL_FOREACH_84(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_83(WHAT, __VA_ARGS__))
#define NBL_FOREACH_85(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_84(WHAT, __VA_ARGS__))
#define NBL_FOREACH_86(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_85(WHAT, __VA_ARGS__))
#define NBL_FOREACH_87(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_86(WHAT, __VA_ARGS__))
#define NBL_FOREACH_88(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_87(WHAT, __VA_ARGS__))
#define NBL_FOREACH_89(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_88(WHAT, __VA_ARGS__))
#define NBL_FOREACH_90(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_89(WHAT, __VA_ARGS__))
#define NBL_FOREACH_91(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_90(WHAT, __VA_ARGS__))
#define NBL_FOREACH_92(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_91(WHAT, __VA_ARGS__))
#define NBL_FOREACH_93(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_92(WHAT, __VA_ARGS__))
#define NBL_FOREACH_94(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_93(WHAT, __VA_ARGS__))
#define NBL_FOREACH_95(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_94(WHAT, __VA_ARGS__))
#define NBL_FOREACH_96(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_95(WHAT, __VA_ARGS__))
#define NBL_FOREACH_97(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_96(WHAT, __VA_ARGS__))
#define NBL_FOREACH_98(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_97(WHAT, __VA_ARGS__))
#define NBL_FOREACH_99(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_98(WHAT, __VA_ARGS__))
#define NBL_FOREACH_100(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_99(WHAT, __VA_ARGS__))
#define NBL_FOREACH_101(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_100(WHAT, __VA_ARGS__))
#define NBL_FOREACH_102(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_101(WHAT, __VA_ARGS__))
#define NBL_FOREACH_103(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_102(WHAT, __VA_ARGS__))
#define NBL_FOREACH_104(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_103(WHAT, __VA_ARGS__))
#define NBL_FOREACH_105(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_104(WHAT, __VA_ARGS__))
#define NBL_FOREACH_106(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_105(WHAT, __VA_ARGS__))
#define NBL_FOREACH_107(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_106(WHAT, __VA_ARGS__))
#define NBL_FOREACH_108(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_107(WHAT, __VA_ARGS__))
#define NBL_FOREACH_109(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_108(WHAT, __VA_ARGS__))
#define NBL_FOREACH_110(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_109(WHAT, __VA_ARGS__))
#define NBL_FOREACH_111(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_110(WHAT, __VA_ARGS__))
#define NBL_FOREACH_112(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_111(WHAT, __VA_ARGS__))
#define NBL_FOREACH_113(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_112(WHAT, __VA_ARGS__))
#define NBL_FOREACH_114(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_113(WHAT, __VA_ARGS__))
#define NBL_FOREACH_115(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_114(WHAT, __VA_ARGS__))
#define NBL_FOREACH_116(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_115(WHAT, __VA_ARGS__))
#define NBL_FOREACH_117(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_116(WHAT, __VA_ARGS__))
#define NBL_FOREACH_118(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_117(WHAT, __VA_ARGS__))
#define NBL_FOREACH_119(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_118(WHAT, __VA_ARGS__))
#define NBL_FOREACH_120(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_119(WHAT, __VA_ARGS__))
#define NBL_FOREACH_121(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_120(WHAT, __VA_ARGS__))
#define NBL_FOREACH_122(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_121(WHAT, __VA_ARGS__))
#define NBL_FOREACH_123(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_122(WHAT, __VA_ARGS__))
#define NBL_FOREACH_124(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_123(WHAT, __VA_ARGS__))
#define NBL_FOREACH_125(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_124(WHAT, __VA_ARGS__))

#define NBL_FOREACH(WHAT, ... ) NBL_EVAL(NBL_CONCATENATE(NBL_FOREACH_,NBL_VA_ARGS_COUNT(__VA_ARGS__))(WHAT, __VA_ARGS__))

#endif
64 changes: 64 additions & 0 deletions include/nbl/builtin/hlsl/mpl.hlsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// Copyright (C) 2022 - DevSH Graphics Programming Sp. z O.O.
// This file is part of the "Nabla Engine".
// For conditions of distribution and use, see copyright notice in nabla.h
#ifndef _NBL_BUILTIN_HLSL_MPL_INCLUDED_
#define _NBL_BUILTIN_HLSL_MPL_INCLUDED_

#ifdef __HLSL_VERSION
#include <nbl/builtin/hlsl/type_traits.hlsl>
#endif

namespace nbl
{
namespace hlsl
{
namespace mpl
{

#ifdef __HLSL_VERSION
namespace impl
{

template<uint16_t bits_log2>
struct clz_masks
{
static const uint16_t SHIFT = uint16_t(1)<<(bits_log2-1);
static const uint64_t LO_MASK = (1ull<<SHIFT)-1;
};

template<>
struct clz_masks<0>
{
static const uint16_t SHIFT = 0;
static const uint64_t LO_MASK = 0;
};

template<uint64_t N, uint16_t bits_log2>
struct clz
{
static const bool CHOOSE_HIGH = N&(clz_masks<bits_log2>::LO_MASK<<clz_masks<bits_log2>::SHIFT);
static const uint64_t NEXT_N = (CHOOSE_HIGH ? (N>>clz_masks<bits_log2>::SHIFT):N)&clz_masks<bits_log2>::LO_MASK;
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);
};

}

template<uint64_t N>
struct clz
{
static const uint16_t value = impl::clz<N, 6>::value;
};

template<uint64_t X>
struct log2
{
static const uint16_t value = X ? (1ull<<6)-clz<X>::value-1 : -1ull;
};

#endif

}
}
}

#endif
Loading