Skip to content

Commit 8bb9685

Browse files
committed
Merge remote-tracking branch 'origin/master' into hazardu-dxc-compile-flags
2 parents ae43860 + c3e51fd commit 8bb9685

File tree

11 files changed

+97
-117
lines changed

11 files changed

+97
-117
lines changed

3rdparty/dxc/dxc

Submodule dxc updated 1614 files

cmake/common.cmake

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,8 +1392,10 @@ execute_process(COMMAND "${GIT_EXECUTABLE}" ${NBL_CONFIG_SETUP_CMD} submodule up
13921392
# NBL_WRAPPER_COMMAND_EXCLUSIVE("" ./ci TRUE "") TODO: enable it once we merge Ditt, etc
13931393

13941394
# examples and their media
1395-
NBL_WRAPPER_COMMAND_EXCLUSIVE("" ./examples_tests FALSE "")
1396-
NBL_WRAPPER_COMMAND_EXCLUSIVE(examples_tests ./media FALSE "")
1395+
if(NBL_BUILD_EXAMPLES)
1396+
NBL_WRAPPER_COMMAND_EXCLUSIVE("" ./examples_tests FALSE "")
1397+
NBL_WRAPPER_COMMAND_EXCLUSIVE(examples_tests ./media FALSE "")
1398+
endif()
13971399
endif()
13981400

13991401
file(WRITE "${_NBL_UPDATE_SUBMODULES_CMD_FILE_}" "${_NBL_UPDATE_SUBMODULES_COMMANDS_}")

include/nbl/builtin/hlsl/cpp_compat.hlsl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ using add_pointer = std::add_pointer<T>;
3131

3232
}
3333

34-
#define NBL_REF_ARG(T) typename nbl::hlsl::add_reference<T>::type
35-
#define NBL_CONST_REF_ARG(T) typename nbl::hlsl::add_reference<std::add_const_t<T>>::type
34+
// We need variadic macro in order to handle multi parameter templates because the
35+
// preprocessor parses the template parameters as different macro parameters.
36+
#define NBL_REF_ARG(...) typename nbl::hlsl::add_reference<__VA_ARGS__>::type
37+
#define NBL_CONST_REF_ARG(...) typename nbl::hlsl::add_reference<std::add_const_t<__VA_ARGS__>>::type
3638

3739
#else
3840

@@ -62,8 +64,8 @@ struct add_pointer
6264
}
6365
}
6466

65-
#define NBL_REF_ARG(T) inout T
66-
#define NBL_CONST_REF_ARG(T) const in T
67+
#define NBL_REF_ARG(...) inout __VA_ARGS__
68+
#define NBL_CONST_REF_ARG(...) const in __VA_ARGS__
6769

6870
#endif
6971

include/nbl/builtin/hlsl/device_capabilities_traits.hlsl

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,44 @@
77
#include <nbl/builtin/hlsl/member_test_macros.hlsl>
88

99
#ifdef __HLSL_VERSION
10+
11+
NBL_GENERATE_MEMBER_TESTER(shaderFloat64);
12+
NBL_GENERATE_MEMBER_TESTER(shaderDrawParameters);
13+
NBL_GENERATE_MEMBER_TESTER(subgroupArithmetic);
14+
NBL_GENERATE_MEMBER_TESTER(fragmentShaderPixelInterlock);
15+
NBL_GENERATE_MEMBER_TESTER(maxOptimallyResidentWorkgroupInvocations);
16+
17+
#define NBL_GENERATE_GET_OR_DEFAULT(field, ty, default) \
18+
template<typename S, bool = has_member_##field<S>::value> struct get_or_default_##field : integral_constant<ty,S::field> {}; \
19+
template<typename S> struct get_or_default_##field<S,false> : integral_constant<ty,default> {};
20+
1021
namespace nbl
1122
{
1223
namespace hlsl
1324
{
25+
26+
namespace impl
27+
{
28+
NBL_GENERATE_GET_OR_DEFAULT(shaderFloat64, bool, false);
29+
NBL_GENERATE_GET_OR_DEFAULT(shaderDrawParameters, bool, false);
30+
NBL_GENERATE_GET_OR_DEFAULT(subgroupArithmetic, bool, false);
31+
NBL_GENERATE_GET_OR_DEFAULT(fragmentShaderPixelInterlock, bool, false);
32+
NBL_GENERATE_GET_OR_DEFAULT(maxOptimallyResidentWorkgroupInvocations, uint16_t, 0);
33+
}
34+
35+
1436
template<typename device_capabilities>
1537
struct device_capabilities_traits
1638
{
17-
// TODO: check for members and default them to sane things, only do the 5 members in CJITIncludeLoader.cpp struct, we'll do the rest on `vulkan_1_3` branch with Nahim
39+
NBL_CONSTEXPR_STATIC_INLINE bool shaderFloat64 = impl::get_or_default_shaderFloat64<device_capabilities>::value;
40+
NBL_CONSTEXPR_STATIC_INLINE bool shaderDrawParameters = impl::get_or_default_shaderDrawParameters<device_capabilities>::value;
41+
NBL_CONSTEXPR_STATIC_INLINE bool subgroupArithmetic = impl::get_or_default_subgroupArithmetic<device_capabilities>::value;
42+
NBL_CONSTEXPR_STATIC_INLINE bool fragmentShaderPixelInterlock = impl::get_or_default_fragmentShaderPixelInterlock<device_capabilities>::value;
43+
NBL_CONSTEXPR_STATIC_INLINE uint16_t maxOptimallyResidentWorkgroupInvocations = impl::get_or_default_maxOptimallyResidentWorkgroupInvocations<device_capabilities>::value;
1844
};
45+
46+
#undef NBL_GENERATE_GET_OR_DEFAULT
47+
1948
}
2049
}
2150
#endif

include/nbl/builtin/hlsl/glsl_compat/subgroup_shuffle.hlsl

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,13 @@ T subgroupShuffle(T value, uint32_t invocationId)
2121
template<typename T>
2222
T subgroupShuffleUp(T value, uint32_t delta)
2323
{
24-
#ifdef NBL_GL_KHR_shader_subgroup_shuffle_relative
2524
return spirv::groupShuffleUp<T>(spv::ScopeSubgroup, value, delta);
26-
#else
27-
return spirv::groupShuffle<T>(spv::ScopeSubgroup, value, gl_SubgroupInvocationID() - delta);
28-
#endif
2925
}
3026

3127
template<typename T>
3228
T subgroupShuffleDown(T value, uint32_t delta)
3329
{
34-
#ifdef NBL_GL_KHR_shader_subgroup_shuffle_relative
3530
return spirv::groupShuffleDown<T>(spv::ScopeSubgroup, value, delta);
36-
#else
37-
return spirv::groupShuffle<T>(spv::ScopeSubgroup, value, gl_SubgroupInvocationID() + delta);
38-
#endif
3931
}
4032

4133
}

include/nbl/builtin/hlsl/member_test_macros.hlsl

Lines changed: 28 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#define _NBL_BUILTIN_HLSL_MEMBER_TEST_MACROS_INCLUDED_
66

77
#include <nbl/builtin/hlsl/type_traits.hlsl>
8+
#include <boost/preprocessor.hpp>
89

910
#ifdef __HLSL_VERSION
1011

@@ -16,19 +17,11 @@ namespace hlsl
1617
namespace impl
1718
{
1819

19-
template<class T, bool C>
20-
struct is_const_helper : bool_constant<C>
21-
{
22-
using type = T;
23-
NBL_CONSTEXPR_STATIC_INLINE bool is_constant = is_const<T>::value;
24-
};
25-
2620
enum e_member_presence
2721
{
28-
absent = 0,
29-
non_static = 1,
30-
as_static = 2,
31-
static_constexpr = 3,
22+
is_present = 1<<0,
23+
is_static = 1<<1,
24+
is_const = 1<<2,
3225
};
3326

3427
template<class T>
@@ -54,16 +47,17 @@ namespace hlsl \
5447
{ \
5548
namespace impl { \
5649
template<class T, class=void> \
57-
struct is_static_member_##a: false_type {NBL_CONSTEXPR_STATIC_INLINE bool is_constant = false; }; \
50+
struct is_static_member_##a: false_type { }; \
5851
template<class T> \
59-
struct is_static_member_##a<T,typename enable_if<!is_same<decltype(T::a),void>::value,void>::type>: is_const_helper<decltype(T::a), true> {}; \
52+
struct is_static_member_##a<T,typename enable_if<!is_same<decltype(T::a),void>::value,void>::type> : true_type { }; \
6053
template<class T, class=void> \
61-
struct is_member_##a: false_type {NBL_CONSTEXPR_STATIC_INLINE bool is_constant = false;}; \
54+
struct is_member_##a: false_type { using type = void; }; \
6255
template<class T> \
63-
struct is_member_##a<T,typename enable_if<!is_same<decltype(declval<T>().a),void>::value,void>::type> : is_const_helper<decltype(declval<T>().a), true>{}; \
56+
struct is_member_##a<T,typename enable_if<!is_same<decltype(declval<T>().a),void>::value,void>::type> : true_type { using type = decltype(declval<T>().a); }; \
6457
} \
6558
template<class T> \
66-
struct has_member_##a { NBL_CONSTEXPR_STATIC_INLINE e_member_presence value = (e_member_presence)(impl::is_member_##a<T>::value + impl::is_static_member_##a<T>::value + impl::is_static_member_##a<T>::is_constant); }; \
59+
struct has_member_##a { NBL_CONSTEXPR_STATIC_INLINE e_member_presence value = (e_member_presence)(impl::is_member_##a<T>::value + 2*impl::is_static_member_##a<T>::value + 4*is_const<typename impl::is_member_##a<T>::type>::value); }; \
60+
template<class T, class F> struct has_member_##a##_with_type : bool_constant<has_member_##a<T>::value && is_same<typename impl::is_member_##a<T>::type, F>::value> {}; \
6761
} \
6862
}
6963

@@ -74,60 +68,30 @@ NBL_GENERATE_MEMBER_TESTER(z)
7468
NBL_GENERATE_MEMBER_TESTER(w)
7569

7670

77-
// Even though it should work for some reason tests fail
78-
// proof it works : https://godbolt.org/z/EzPWGnTPb
7971

80-
#define CAT(x, y) x##y
81-
#define TYPE_DECLARE(n) typename Arg##n
82-
#define TYPE_DECLARE_DEFAULT(n) TYPE_DECLARE(n)=void
83-
#define TYPE_FWD(n) Arg##n
84-
#define DECLVAL_DECLARE(n) impl::declval<Arg##n>()
85-
86-
#define FOR_EACH0(fn)
87-
#define FOR_EACH1(fn) fn(1)
88-
#define FOR_EACH2(fn) fn(2), FOR_EACH1(fn)
89-
#define FOR_EACH3(fn) fn(3), FOR_EACH2(fn)
90-
#define FOR_EACH4(fn) fn(4), FOR_EACH3(fn)
91-
#define FOR_EACH(fn, n) CAT(FOR_EACH, n)(fn)
92-
93-
#define GENERATE_STATIC_METHOD_TESTER_SPEC0(x) \
94-
template<class T> \
95-
struct has_static_method_##x<T, typename make_void<decltype(T::x())>::type> : true_type \
96-
{ \
97-
using return_type = decltype(T::x()); \
98-
NBL_CONSTEXPR_STATIC_INLINE uint arg_count = 0; \
99-
};
72+
#define NBL_TYPE_DECLARE(z, n, x) BOOST_PP_COMMA_IF(x) typename Arg##n
73+
#define NBL_TYPE_DECLARE_DEFAULT(z, n, x) BOOST_PP_COMMA_IF(x) typename Arg##n=void
74+
#define NBL_TYPE_FWD(z, n, x) BOOST_PP_COMMA_IF(x) Arg##n
75+
#define NBL_DECLVAL_DECLARE(z, n, x) impl::declval<Arg##n>() BOOST_PP_COMMA_IF(BOOST_PP_NOT_EQUAL(BOOST_PP_INC(n), x))
10076

101-
#define GENERATE_STATIC_METHOD_TESTER_SPEC(x, n) \
102-
template<class T, FOR_EACH(TYPE_DECLARE, n)> \
103-
struct has_static_method_##x<T, FOR_EACH(TYPE_FWD, n), typename make_void<decltype(T::x(FOR_EACH(DECLVAL_DECLARE, n)))>::type> : true_type \
77+
#define GENERATE_STATIC_METHOD_TESTER_SPEC(z, n, x) \
78+
template<class T BOOST_PP_REPEAT(n, NBL_TYPE_DECLARE, n)> \
79+
struct has_static_method_##x<T BOOST_PP_REPEAT(n, NBL_TYPE_FWD, n), typename make_void<decltype(T::x(BOOST_PP_REPEAT(n, NBL_DECLVAL_DECLARE, n)))>::type> : true_type \
10480
{ \
105-
using return_type = decltype(T::x(FOR_EACH(DECLVAL_DECLARE, n))); \
81+
using return_type = decltype(T::x(BOOST_PP_REPEAT(n, NBL_DECLVAL_DECLARE, n))); \
10682
NBL_CONSTEXPR_STATIC_INLINE uint arg_count = n; \
10783
};
10884

109-
#define GENERATE_STATIC_METHOD_TESTER(x) \
110-
template<typename T, FOR_EACH(TYPE_DECLARE_DEFAULT, 4), class=void> \
85+
#define GENERATE_STATIC_METHOD_TESTER(x, n) \
86+
template<typename T BOOST_PP_REPEAT(n, NBL_TYPE_DECLARE_DEFAULT, n), class=void> \
11187
struct has_static_method_##x : false_type {}; \
112-
GENERATE_STATIC_METHOD_TESTER_SPEC0(x) \
113-
GENERATE_STATIC_METHOD_TESTER_SPEC(x, 1) \
114-
GENERATE_STATIC_METHOD_TESTER_SPEC(x, 2) \
115-
GENERATE_STATIC_METHOD_TESTER_SPEC(x, 3) \
116-
GENERATE_STATIC_METHOD_TESTER_SPEC(x, 4)
117-
118-
#define GENERATE_METHOD_TESTER_SPEC0(x) \
119-
template<class T> \
120-
struct has_method_##x<T, typename make_void<decltype(impl::declval<T>().x())>::type> : impl::if_2_else_1<impl::has_static_method_##x<T>::value> \
121-
{ \
122-
using return_type = decltype(impl::declval<T>().x()); \
123-
NBL_CONSTEXPR_STATIC_INLINE uint arg_count = 0; \
124-
};
88+
BOOST_PP_REPEAT(n, GENERATE_STATIC_METHOD_TESTER_SPEC, x)
12589

126-
#define GENERATE_METHOD_TESTER_SPEC(x, n) \
127-
template<class T, FOR_EACH(TYPE_DECLARE, n)> \
128-
struct has_method_##x<T, FOR_EACH(TYPE_FWD, n), typename make_void<decltype(impl::declval<T>().x(FOR_EACH(DECLVAL_DECLARE, n)))>::type> : impl::if_2_else_1<impl::has_static_method_##x<T,FOR_EACH(TYPE_FWD, n)>::value> \
90+
#define GENERATE_METHOD_TESTER_SPEC(z, n, x) \
91+
template<class T BOOST_PP_REPEAT(n, NBL_TYPE_DECLARE, n)> \
92+
struct has_method_##x<T BOOST_PP_REPEAT(n, NBL_TYPE_FWD, n), typename make_void<decltype(impl::declval<T>().x(BOOST_PP_REPEAT(n, NBL_DECLVAL_DECLARE, n)))>::type> : impl::if_2_else_1<impl::has_static_method_##x<T BOOST_PP_REPEAT(n, NBL_TYPE_FWD, n)>::value> \
12993
{ \
130-
using return_type = decltype(impl::declval<T>().x(FOR_EACH(DECLVAL_DECLARE, n))); \
94+
using return_type = decltype(impl::declval<T>().x(BOOST_PP_REPEAT(n, NBL_DECLVAL_DECLARE, n))); \
13195
NBL_CONSTEXPR_STATIC_INLINE uint arg_count = n; \
13296
};
13397

@@ -147,14 +111,10 @@ struct has_method_##x<T, FOR_EACH(TYPE_FWD, n), typename make_void<decltype(impl
147111
#define GENERATE_METHOD_TESTER(x) \
148112
namespace nbl { \
149113
namespace hlsl { \
150-
namespace impl { GENERATE_STATIC_METHOD_TESTER(x) } \
151-
template<typename T, FOR_EACH(TYPE_DECLARE_DEFAULT, 4), class=void> \
114+
namespace impl { GENERATE_STATIC_METHOD_TESTER(x, 4) } \
115+
template<typename T BOOST_PP_REPEAT(4, NBL_TYPE_DECLARE_DEFAULT, 4), class=void> \
152116
struct has_method_##x : false_type {}; \
153-
GENERATE_METHOD_TESTER_SPEC0(x) \
154-
GENERATE_METHOD_TESTER_SPEC(x, 1) \
155-
GENERATE_METHOD_TESTER_SPEC(x, 2) \
156-
GENERATE_METHOD_TESTER_SPEC(x, 3) \
157-
GENERATE_METHOD_TESTER_SPEC(x, 4) \
117+
BOOST_PP_REPEAT(4, GENERATE_METHOD_TESTER_SPEC, x) \
158118
}}
159119

160120

include/nbl/builtin/hlsl/spirv_intrinsics/subgroup_shuffle.hlsl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ template<typename T>
1818
[[vk::ext_instruction( spv::OpGroupNonUniformShuffle )]]
1919
T groupShuffle(uint32_t executionScope, T value, uint32_t invocationId);
2020

21-
#ifdef NBL_GL_KHR_shader_subgroup_shuffle_relative
2221
template<typename T>
2322
[[vk::ext_capability( spv::CapabilityGroupNonUniformShuffleRelative )]]
2423
[[vk::ext_instruction( spv::OpGroupNonUniformShuffleUp )]]
@@ -28,7 +27,7 @@ template<typename T>
2827
[[vk::ext_capability( spv::CapabilityGroupNonUniformShuffleRelative )]]
2928
[[vk::ext_instruction( spv::OpGroupNonUniformShuffleDown )]]
3029
T groupShuffleDown(uint32_t executionScope, T value, uint32_t delta);
31-
#endif
30+
3231
}
3332
}
3433
}

include/nbl/builtin/hlsl/subgroup/arithmetic_portability.hlsl

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
#define _NBL_BUILTIN_HLSL_SUBGROUP_ARITHMETIC_PORTABILITY_INCLUDED_
66

77

8-
#include "nbl/builtin/hlsl/subgroup/basic.hlsl"
8+
#include "nbl/builtin/hlsl/device_capabilities_traits.hlsl"
99

10+
#include "nbl/builtin/hlsl/subgroup/basic.hlsl"
1011
#include "nbl/builtin/hlsl/subgroup/arithmetic_portability_impl.hlsl"
11-
#include "nbl/builtin/hlsl/jit/device_capabilities.hlsl"
1212

1313

1414
namespace nbl
@@ -18,16 +18,12 @@ namespace hlsl
1818
namespace subgroup
1919
{
2020

21-
// TODO: change to alias using template when DXC finally fixes SPIR-V codegen impartity
22-
//template<class Binop, class device_capability_traits/*=TODO: Atil give us the traits so we can default with `void`!*/>
23-
//struct reduction : impl::reduction<Binop,device_capability_traits::subgroupArithmetic> {};
24-
25-
template<class Binop>
26-
struct reduction : impl::reduction<Binop,nbl::hlsl::jit::device_capabilities::subgroupArithmetic> {};
27-
template<class Binop>
28-
struct inclusive_scan : impl::inclusive_scan<Binop,nbl::hlsl::jit::device_capabilities::subgroupArithmetic> {};
29-
template<class Binop>
30-
struct exclusive_scan : impl::exclusive_scan<Binop,nbl::hlsl::jit::device_capabilities::subgroupArithmetic> {};
21+
template<class Binop, class device_capabilities=void>
22+
struct reduction : impl::reduction<Binop,device_capabilities_traits<device_capabilities>::subgroupArithmetic> {};
23+
template<class Binop, class device_capabilities=void>
24+
struct inclusive_scan : impl::inclusive_scan<Binop,device_capabilities_traits<device_capabilities>::subgroupArithmetic> {};
25+
template<class Binop, class device_capabilities=void>
26+
struct exclusive_scan : impl::exclusive_scan<Binop,device_capabilities_traits<device_capabilities>::subgroupArithmetic> {};
3127

3228
}
3329
}

0 commit comments

Comments
 (0)