Skip to content

Commit d4e3738

Browse files
committed
intial changes
1 parent 0ecda6a commit d4e3738

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "nbl/builtin/hlsl/subgroup/basic.hlsl"
1111
#include "nbl/builtin/hlsl/subgroup/arithmetic_portability_impl.hlsl"
12+
#include "nbl/builtin/hlsl/concepts.hlsl"
1213

1314

1415
namespace nbl
@@ -25,6 +26,29 @@ struct inclusive_scan : impl::inclusive_scan<Binop,device_capabilities_traits<de
2526
template<class Binop, class device_capabilities=void>
2627
struct exclusive_scan : impl::exclusive_scan<Binop,device_capabilities_traits<device_capabilities>::shaderSubgroupArithmetic> {};
2728

29+
}
30+
31+
namespace subgroup2
32+
{
33+
34+
template<typename Config, class BinOp, int32_t ItemsPerInvocation=1, class device_capabilities=void NBL_PRIMARY_REQUIRES(is_configuration_v<Config>)
35+
struct ArithmeticParams
36+
{
37+
using config_t = Config;
38+
using binop_t = BinOp;
39+
using type_t = typename BinOp::type_t;
40+
41+
NBL_CONSTEXPR_STATIC_INLINE int32_t itemsPerInvocation = ItemsPerInvocation;
42+
NBL_CONSTEXPR_STATIC_INLINE bool UseNativeIntrinsics = device_capabilities_traits<device_capabilities>::shaderSubgroupArithmetic /*&& /*some heuristic for when its faster*/;
43+
};
44+
45+
template<typename Params>
46+
struct reduction : impl::reduction<typename Params::binop_t,Params::UseNativeIntrinsics> {};
47+
template<typename Params>
48+
struct inclusive_scan : impl::inclusive_scan<typename Params::binop_t,Params::UseNativeIntrinsics> {};
49+
template<typename Params>
50+
struct exclusive_scan : impl::exclusive_scan<typename Params::binop_t,Params::UseNativeIntrinsics> {};
51+
2852
}
2953
}
3054
}

include/nbl/builtin/hlsl/subgroup/arithmetic_portability_impl.hlsl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,31 @@ struct reduction<Binop, false>
140140
}
141141

142142
}
143+
144+
namespace subgroup2
145+
{
146+
147+
namespace impl
148+
{
149+
150+
template<class Binop, int32_t ItemsPerInvocation, bool native>
151+
struct reduction
152+
{
153+
using type_t = typename Binop::type_t;
154+
using par_type_t = conditional_t<ItemsPerInvocation < 2, type_t, vector<type_t, ItemsPerInvocation> >;
155+
using op_t = subgroup::impl::reduction<Binop, native>;
156+
157+
type_t operator()(NBL_CONST_REF_ARG(type_t) value)
158+
{
159+
// take the last subgroup invocation's value for the reduction
160+
return BroadcastLast<type_t>(inclusive_scan<Binop,false>::__call(value));
161+
}
162+
};
163+
164+
}
165+
166+
}
167+
143168
}
144169
}
145170

include/nbl/builtin/hlsl/subgroup/ballot.hlsl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,23 @@ uint32_t ElectedSubgroupInvocationID() {
3737
return glsl::subgroupBroadcastFirst<uint32_t>(glsl::gl_SubgroupInvocationID());
3838
}
3939

40+
template<uint32_t SubgroupSizeLog2>
41+
struct Configuration
42+
{
43+
using mask_t = conditional_t<SubgroupSizeLog2 < 7, conditional_t<SubgroupSizeLog2 < 6, uint32_t1, uint32_t2>, uint32_t4>;
44+
45+
NBL_CONSTEXPR_STATIC_INLINE uint16_t Size = 0x1u << SubgroupSizeLog2;
46+
};
47+
48+
template<class T>
49+
struct is_configuration : bool_constant<false> {};
50+
51+
template<uint32_t N>
52+
struct is_configuration<Configuration<N> > : bool_constant<true> {};
53+
54+
template<typename T>
55+
NBL_CONSTEXPR bool is_configuration_v = is_configuration<T>::value;
56+
4057
}
4158
}
4259
}

0 commit comments

Comments
 (0)