Skip to content

Commit 0514f58

Browse files
Use new inline SPIR-V builtin syntax from DXC
1 parent c3e51fd commit 0514f58

File tree

8 files changed

+56
-57
lines changed

8 files changed

+56
-57
lines changed

include/nbl/builtin/hlsl/glsl_compat/core.hlsl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,14 @@ T atomicCompSwap(NBL_REF_ARG(T) ptr, T comparator, T value)
6060
* For Compute Shaders
6161
*/
6262

63-
// TODO (Future): Its annoying we have to forward declare those, but accessing gl_NumSubgroups and other gl_* values is not yet possible due to https://github.com/microsoft/DirectXShaderCompiler/issues/4217
64-
// also https://github.com/microsoft/DirectXShaderCompiler/issues/5280
65-
uint32_t gl_LocalInvocationIndex();
63+
// TODO: Extemely annoying that HLSL doesn't have referencies, so we can't transparently alias the variables as `const&` :(
64+
uint32_t3 gl_NumWorkGroups() {return spirv::NumWorkGroups;}
65+
// TODO: DXC BUG prevents us from defining this!
6666
uint32_t3 gl_WorkGroupSize();
67-
uint32_t3 gl_GlobalInvocationID();
68-
uint32_t3 gl_WorkGroupID();
67+
uint32_t3 gl_WorkGroupID() {return spirv::WorkgroupId;}
68+
uint32_t3 gl_LocalInvocationID() {return spirv::LocalInvocationId;}
69+
uint32_t3 gl_GlobalInvocationID() {return spirv::GlobalInvocationId;}
70+
uint32_t gl_LocalInvocationIndex() {return spirv::LocalInvocationIndex;}
6971

7072
void barrier() {
7173
spirv::controlBarrier(spv::ScopeWorkgroup, spv::ScopeWorkgroup, spv::MemorySemanticsAcquireReleaseMask | spv::MemorySemanticsWorkgroupMemoryMask);

include/nbl/builtin/hlsl/glsl_compat/subgroup_ballot.hlsl

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,38 +14,12 @@ namespace hlsl
1414
namespace glsl
1515
{
1616

17-
uint32_t4 gl_SubgroupEqMask()
18-
{
19-
const uint32_t comp = gl_SubgroupInvocationID()>>5;
20-
uint32_t4 retval = uint32_t4(0,0,0,0);
21-
retval[comp] = 0x1u<<(gl_SubgroupInvocationID()&31u);
22-
return retval;
23-
}
24-
25-
uint32_t4 gl_SubgroupGeMask()
26-
{
27-
const uint32_t FullBits = 0xffffffffu;
28-
const uint32_t comp = gl_SubgroupInvocationID()>>5;
29-
uint32_t4 retval = uint32_t4(comp>0 ? 0u:FullBits,comp>1 ? 0u:FullBits,comp>2 ? 0u:FullBits,0u);
30-
retval[comp] = FullBits<<(gl_SubgroupInvocationID()&31u);
31-
return retval;
32-
}
33-
34-
uint32_t4 gl_SubgroupGtMask()
35-
{
36-
uint32_t4 retval = gl_SubgroupGeMask();
37-
const uint32_t comp = gl_SubgroupInvocationID()>>5;
38-
retval[comp] = 0xfffffffeu<<(gl_SubgroupInvocationID()&31u);
39-
return retval;
40-
}
41-
42-
uint32_t4 gl_SubgroupLeMask() {
43-
return ~gl_SubgroupGtMask();
44-
}
45-
46-
uint32_t4 gl_SubgroupLtMask() {
47-
return ~gl_SubgroupGeMask();
48-
}
17+
// TODO: Extemely annoying that HLSL doesn't have referencies, so we can't transparently alias the variables as `const&` :(
18+
uint32_t4 gl_SubgroupEqMask() {return spirv::BuiltInSubgroupEqMask;}
19+
uint32_t4 gl_SubgroupGeMask() {return spirv::BuiltInSubgroupGeMask;}
20+
uint32_t4 gl_SubgroupGtMask() {return spirv::BuiltInSubgroupGtMask;}
21+
uint32_t4 gl_SubgroupLeMask() {return spirv::BuiltInSubgroupLeMask;}
22+
uint32_t4 gl_SubgroupLtMask() {return spirv::BuiltInSubgroupLtMask;}
4923

5024
template<typename T>
5125
T subgroupBroadcastFirst(T value)

include/nbl/builtin/hlsl/glsl_compat/subgroup_basic.hlsl

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,15 @@ namespace hlsl
1313
{
1414
namespace glsl
1515
{
16-
1716
#ifdef __HLSL_VERSION
18-
uint32_t gl_SubgroupSize() {
19-
return WaveGetLaneCount();
20-
}
21-
22-
uint32_t gl_SubgroupSizeLog2() {
23-
return firstbithigh(gl_SubgroupSize());
24-
}
25-
26-
uint32_t gl_SubgroupInvocationID() {
27-
return WaveGetLaneIndex();
28-
}
17+
// TODO: Extemely annoying that HLSL doesn't have referencies, so we can't transparently alias the variables as `const&` :(
18+
uint32_t gl_SubgroupSize() {return spirv::SubgroupSize;}
19+
uint32_t gl_SubgroupSizeLog2() {return firstbithigh(spirv::SubgroupSize);}
20+
uint32_t gl_SubgroupInvocationID() {return spirv::SubgroupLocalInvocationId;}
2921

3022
// only available in compute
31-
uint32_t gl_SubgroupID() {
32-
// TODO (PentaKon): This is not always correct (subgroup IDs aren't always aligned with invocation index per the spec)
33-
return gl_LocalInvocationIndex() >> gl_SubgroupSizeLog2();
34-
}
23+
uint32_t gl_NumSubgroups() {return spirv::NumSubgroups;}
24+
uint32_t gl_SubgroupID() {return spirv::SubgroupId;}
3525

3626
bool subgroupElect() {
3727
return spirv::subgroupElect(spv::ScopeSubgroup);
@@ -57,7 +47,6 @@ void subgroupMemoryBarrierImage() {
5747
spirv::memoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsAcquireReleaseMask | spv::MemorySemanticsImageMemoryMask);
5848
}
5949
#endif
60-
6150
}
6251
}
6352
}

include/nbl/builtin/hlsl/macros.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
#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
3030
#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))
3131

32-
//
32+
// TODO: Use BOOST_PP!
3333
#define NBL_FOREACH_0(WHAT)
3434
#define NBL_FOREACH_1(WHAT, X) NBL_EVAL(WHAT(X))
3535
#define NBL_FOREACH_2(WHAT, X, ...) NBL_EVAL(WHAT(X)NBL_FOREACH_1(WHAT, __VA_ARGS__))

include/nbl/builtin/hlsl/spirv_intrinsics/core.hlsl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,22 @@ namespace hlsl
1818
#ifdef __HLSL_VERSION
1919
namespace spirv
2020
{
21+
[[vk::ext_builtin_input(spv::BuiltInHelperInvocation)]]
22+
static const bool HelperInvocation;
23+
24+
[[vk::ext_builtin_input(spv::BuiltInNumWorkgroups)]]
25+
static const uint32_t3 NumWorkGroups;
26+
// TODO: Doesn't work, find out why and file issue on DXC!
27+
//[[vk::ext_builtin_input(spv::BuiltInWorkgroupSize)]]
28+
//static const uint32_t3 WorkgroupSize;
29+
[[vk::ext_builtin_input(spv::BuiltInWorkgroupId)]]
30+
static const uint32_t3 WorkgroupId;
31+
[[vk::ext_builtin_input(spv::BuiltInLocalInvocationId)]]
32+
static const uint32_t3 LocalInvocationId;
33+
[[vk::ext_builtin_input(spv::BuiltInGlobalInvocationId)]]
34+
static const uint32_t3 GlobalInvocationId;
35+
[[vk::ext_builtin_input(spv::BuiltInLocalInvocationIndex)]]
36+
static const uint32_t LocalInvocationIndex;
2137

2238
template<typename T>
2339
T atomicAdd([[vk::ext_reference]] T ptr, uint32_t memoryScope, uint32_t memorySemantics, T value);

include/nbl/builtin/hlsl/spirv_intrinsics/subgroup_ballot.hlsl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@ namespace hlsl
1515
{
1616
namespace spirv
1717
{
18+
[[vk::ext_builtin_input(spv::BuiltInSubgroupEqMask)]]
19+
static const uint32_t4 BuiltInSubgroupEqMask;
20+
[[vk::ext_builtin_input(spv::BuiltInSubgroupGeMask)]]
21+
static const uint32_t4 BuiltInSubgroupGeMask;
22+
[[vk::ext_builtin_input(spv::BuiltInSubgroupGtMask)]]
23+
static const uint32_t4 BuiltInSubgroupGtMask;
24+
[[vk::ext_builtin_input(spv::BuiltInSubgroupLeMask)]]
25+
static const uint32_t4 BuiltInSubgroupLeMask;
26+
[[vk::ext_builtin_input(spv::BuiltInSubgroupLtMask)]]
27+
static const uint32_t4 BuiltInSubgroupLtMask;
28+
1829
template<typename T>
1930
[[vk::ext_capability( spv::CapabilityGroupNonUniformBallot )]]
2031
[[vk::ext_instruction( spv::OpGroupNonUniformBroadcastFirst )]]

include/nbl/builtin/hlsl/spirv_intrinsics/subgroup_basic.hlsl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,17 @@ namespace hlsl
1414
{
1515
namespace spirv
1616
{
17+
[[vk::ext_builtin_input(spv::BuiltInSubgroupSize)]]
18+
static const uint32_t SubgroupSize;
19+
[[vk::ext_builtin_input(spv::BuiltInNumSubgroups)]]
20+
static const uint32_t NumSubgroups;
21+
[[vk::ext_builtin_input(spv::BuiltInSubgroupId)]]
22+
static const uint32_t SubgroupId;
23+
[[vk::ext_builtin_input(spv::BuiltInSubgroupLocalInvocationId)]]
24+
static const uint32_t SubgroupLocalInvocationId;
1725

1826
[[vk::ext_instruction( spv::OpGroupNonUniformElect )]]
1927
bool subgroupElect(uint32_t executionScope);
20-
2128
}
2229
}
2330
}

0 commit comments

Comments
 (0)