Skip to content

Commit 9254e55

Browse files
Merge pull request #572 from Devsh-Graphics-Programming/merge_kpentaris_hlsl
Merged `glsl_compat`, `spirv_intrinsics` and `subgroup` files from ht…
2 parents b2b2ebc + ba45638 commit 9254e55

File tree

13 files changed

+1053
-0
lines changed

13 files changed

+1053
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (C) 2023 - 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_GLSL_COMPAT_CORE_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_GLSL_COMPAT_CORE_INCLUDED_
6+
7+
#include "nbl/builtin/hlsl/cpp_compat.hlsl"
8+
#include "nbl/builtin/hlsl/spirv_intrinsics/core.hlsl"
9+
10+
namespace nbl
11+
{
12+
namespace hlsl
13+
{
14+
namespace glsl
15+
{
16+
17+
template<typename T>
18+
T atomicAdd(NBL_REF_ARG(T) ptr, T value)
19+
{
20+
return spirv::atomicAdd<T>(ptr, 1, 0, value);
21+
}
22+
template<typename T>
23+
T atomicAnd(NBL_REF_ARG(T) ptr, T value)
24+
{
25+
return spirv::atomicAnd<T>(ptr, 1, 0, value);
26+
}
27+
template<typename T>
28+
T atomicOr(NBL_REF_ARG(T) ptr, T value)
29+
{
30+
return spirv::atomicOr<T>(ptr, 1, 0, value);
31+
}
32+
template<typename T>
33+
T atomicXor(NBL_REF_ARG(T) ptr, T value)
34+
{
35+
return spirv::atomicXor<T>(ptr, 1, 0, value);
36+
}
37+
template<typename T>
38+
T atomicMin(NBL_REF_ARG(T) ptr, T value)
39+
{
40+
return spirv::atomicMin<T>(ptr, 1, 0, value);
41+
}
42+
template<typename T>
43+
T atomicMax(NBL_REF_ARG(T) ptr, T value)
44+
{
45+
return spirv::atomicMax<T>(ptr, 1, 0, value);
46+
}
47+
template<typename T>
48+
T atomicExchange(NBL_REF_ARG(T) ptr, T value)
49+
{
50+
return spirv::atomicExchange<T>(ptr, 1, 0, value);
51+
}
52+
template<typename T>
53+
T atomicCompSwap(NBL_REF_ARG(T) ptr, T comparator, T value)
54+
{
55+
return spirv::atomicCompSwap<T>(ptr, 1, 0, 0, value, comparator);
56+
}
57+
58+
void barrier() {
59+
spirv::controlBarrier(2, 2, 0x8 | 0x100);
60+
}
61+
62+
void memoryBarrierShared() {
63+
spirv::memoryBarrier(1, 0x8 | 0x100);
64+
}
65+
66+
}
67+
}
68+
}
69+
70+
#endif
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// Copyright (C) 2023 - 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_GLSL_COMPAT_SUBGROUP_ARITHMETIC_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_GLSL_COMPAT_SUBGROUP_ARITHMETIC_INCLUDED_
6+
7+
#include "nbl/builtin/hlsl/spirv_intrinsics/arithmetic.hlsl"
8+
9+
namespace nbl
10+
{
11+
namespace hlsl
12+
{
13+
namespace glsl
14+
{
15+
16+
template<typename T>
17+
T subgroupAdd(T value) {
18+
return spirv::groupAdd(3, 0, value);
19+
}
20+
template<typename T>
21+
T subgroupInclusiveAdd(T value) {
22+
return spirv::groupAdd(3, 1, value);
23+
}
24+
template<typename T>
25+
T subgroupExclusiveAdd(T value) {
26+
return spirv::groupAdd(3, 2, value);
27+
}
28+
29+
template<typename T>
30+
T subgroupMul(T value) {
31+
return spirv::groupMul(3, 0, value);
32+
}
33+
template<typename T>
34+
T subgroupInclusiveMul(T value) {
35+
return spirv::groupMul(3, 1, value);
36+
}
37+
template<typename T>
38+
T subgroupExclusiveMul(T value) {
39+
return spirv::groupMul(3, 2, value);
40+
}
41+
42+
template<typename T>
43+
T subgroupAnd(T value) {
44+
return spirv::groupBitwiseAnd(3, 0, value);
45+
}
46+
template<typename T>
47+
T subgroupInclusiveAnd(T value) {
48+
return spirv::groupBitwiseAnd(3, 1, value);
49+
}
50+
template<typename T>
51+
T subgroupExclusiveAnd(T value) {
52+
return spirv::groupBitwiseAnd(3, 2, value);
53+
}
54+
55+
template<typename T>
56+
T subgroupOr(T value) {
57+
return spirv::groupBitwiseOr(3, 0, value);
58+
}
59+
template<typename T>
60+
T subgroupInclusiveOr(T value) {
61+
return spirv::groupBitwiseOr(3, 1, value);
62+
}
63+
template<typename T>
64+
T subgroupExclusiveOr(T value) {
65+
return spirv::groupBitwiseOr(3, 2, value);
66+
}
67+
68+
template<typename T>
69+
T subgroupXor(T value) {
70+
return spirv::groupBitwiseXor(3, 0, value);
71+
}
72+
template<typename T>
73+
T subgroupInclusiveXor(T value) {
74+
return spirv::groupBitwiseXor(3, 1, value);
75+
}
76+
template<typename T>
77+
T subgroupExclusiveXor(T value) {
78+
return spirv::groupBitwiseXor(3, 2, value);
79+
}
80+
81+
template<typename T>
82+
T subgroupMin(T value) {
83+
return spirv::groupBitwiseMin(3, 0, value);
84+
}
85+
template<typename T>
86+
T subgroupInclusiveMin(T value) {
87+
return spirv::groupBitwiseMin(3, 1, value);
88+
}
89+
template<typename T>
90+
T subgroupExclusiveMin(T value) {
91+
return spirv::groupBitwiseMin(3, 2, value);
92+
}
93+
94+
template<typename T>
95+
T subgroupMax(T value) {
96+
return spirv::groupBitwiseMax(3, 0, value);
97+
}
98+
template<typename T>
99+
T subgroupInclusiveMax(T value) {
100+
return spirv::groupBitwiseMax(3, 1, value);
101+
}
102+
template<typename T>
103+
T subgroupExclusiveMax(T value) {
104+
return spirv::groupBitwiseMax(3, 2, value);
105+
}
106+
107+
}
108+
}
109+
}
110+
111+
#endif
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (C) 2023 - 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_GLSL_COMPAT_SUBGROUP_BALLOT_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_GLSL_COMPAT_SUBGROUP_BALLOT_INCLUDED_
6+
7+
#include "nbl/builtin/hlsl/spirv_intrinsics/ballot.hlsl"
8+
9+
namespace nbl
10+
{
11+
namespace hlsl
12+
{
13+
namespace glsl
14+
{
15+
16+
template<typename T>
17+
T subgroupBroadcastFirst(T value)
18+
{
19+
return spirv::subgroupBroadcastFirst<T>(/* Subgroup Scope */ 3, value);
20+
}
21+
22+
template<typename T>
23+
T subgroupBroadcast(T value, uint invocationId)
24+
{
25+
return spirv::subgroupBroadcast<T>(/* Subgroup Scope */ 3, value, invocationId);
26+
}
27+
28+
}
29+
}
30+
}
31+
32+
#endif
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright (C) 2023 - 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_GLSL_COMPAT_SUBGROUP_BASIC_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_GLSL_COMPAT_SUBGROUP_BASIC_INCLUDED_
6+
7+
#include "nbl/builtin/hlsl/spirv_intrinsics/core.hlsl"
8+
9+
namespace nbl
10+
{
11+
namespace hlsl
12+
{
13+
namespace glsl
14+
{
15+
16+
// TODO (Future): Accessing gl_SubgroupSize and other gl_* values is not yet possible due to https://github.com/microsoft/DirectXShaderCompiler/issues/4217
17+
18+
uint gl_SubgroupSize() {
19+
return WaveGetLaneCount();
20+
}
21+
22+
uint gl_SubgroupSizeLog2() {
23+
return firstbithigh(gl_SubgroupSize());
24+
}
25+
26+
uint gl_SubgroupInvocationID() {
27+
return WaveGetLaneIndex();
28+
}
29+
30+
uint gl_SubgroupID() {
31+
// TODO (PentaKon): This is not always correct (subgroup IDs aren't always aligned with invocation index per the spec)
32+
return gl_LocalInvocationIndex >> gl_SubgroupSizeLog2();
33+
}
34+
35+
uint4 gl_SubgroupEqMask() {
36+
return uint4(0,0,0,1) << gl_SubgroupInvocationID();
37+
}
38+
39+
uint4 gl_SubgroupGeMask() {
40+
return uint4(0xffffffffu, 0xffffffffu, 0xffffffffu, 0xffffffffu) << gl_SubgroupInvocationID();
41+
}
42+
43+
uint4 gl_SubgroupGtMask() {
44+
return gl_SubgroupGeMask() << 1;
45+
}
46+
47+
uint4 gl_SubgroupLeMask() {
48+
return ~gl_SubgroupGtMask();
49+
}
50+
51+
uint4 gl_SubgroupLtMask() {
52+
return ~gl_SubgroupGeMask();
53+
}
54+
55+
bool subgroupElect() {
56+
return spirv::subgroupElect(/*subgroup execution scope*/ 3);
57+
}
58+
59+
// Memory Semantics: AcquireRelease, UniformMemory, WorkgroupMemory, AtomicCounterMemory, ImageMemory
60+
void subgroupBarrier() {
61+
// REVIEW-519: barrier with subgroup scope is not supported so leave commented out for now
62+
//spirv::controlBarrier(3, 3, 0x800 | 0x400 | 0x100 | 0x40 | 0x8);
63+
}
64+
65+
void subgroupMemoryBarrierShared() {
66+
spirv::memoryBarrier(3, 0x800 | 0x400 | 0x100 | 0x40 | 0x8);
67+
}
68+
69+
}
70+
}
71+
}
72+
73+
#endif
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright (C) 2023 - 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_GLSL_COMPAT_SUBGROUP_SHUFFLE_INCLUDED_
5+
#define _NBL_BUILTIN_HLSL_GLSL_COMPAT_SUBGROUP_SHUFFLE_INCLUDED_
6+
7+
#include "nbl/builtin/hlsl/spirv_intrinsics/shuffle.hlsl"
8+
9+
namespace nbl
10+
{
11+
namespace hlsl
12+
{
13+
namespace glsl
14+
{
15+
template<typename T>
16+
T subgroupShuffle(T value, uint invocationId)
17+
{
18+
return spirv::groupShuffle<T>(3, value, invocationId);
19+
}
20+
21+
template<typename T>
22+
T subgroupShuffleUp(T value, uint delta)
23+
{
24+
#ifdef NBL_GL_KHR_shader_subgroup_shuffle_relative
25+
return spirv::groupShuffleUp<T>(3, value, delta);
26+
#else
27+
return spirv::groupShuffle<T>(3, value, gl_SubgroupInvocationID() - delta);
28+
#endif
29+
}
30+
31+
template<typename T>
32+
T subgroupShuffleDown(T value, uint delta)
33+
{
34+
#ifdef NBL_GL_KHR_shader_subgroup_shuffle_relative
35+
return spirv::groupShuffleDown<T>(3, value, delta);
36+
#else
37+
return spirv::groupShuffle<T>(3, value, gl_SubgroupInvocationID() + delta);
38+
#endif
39+
}
40+
41+
}
42+
}
43+
}
44+
45+
#endif

0 commit comments

Comments
 (0)