Skip to content

Commit f24654d

Browse files
Merge pull request #1143 from KhronosGroup/interlock
Merge SPV_EXT_fragment_shader_interlock with fixes
2 parents a06997a + 0286442 commit f24654d

50 files changed

Lines changed: 2618 additions & 13 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
RWByteAddressBuffer _9 : register(u6, space0);
2+
globallycoherent RasterizerOrderedByteAddressBuffer _42 : register(u3, space0);
3+
RasterizerOrderedByteAddressBuffer _52 : register(u4, space0);
4+
RWTexture2D<unorm float4> img4 : register(u5, space0);
5+
RasterizerOrderedTexture2D<unorm float4> img : register(u0, space0);
6+
RasterizerOrderedTexture2D<unorm float4> img3 : register(u2, space0);
7+
RasterizerOrderedTexture2D<uint> img2 : register(u1, space0);
8+
9+
void frag_main()
10+
{
11+
_9.Store(0, uint(0));
12+
img4[int2(1, 1)] = float4(1.0f, 0.0f, 0.0f, 1.0f);
13+
img[int2(0, 0)] = img3[int2(0, 0)];
14+
uint _39;
15+
InterlockedAdd(img2[int2(0, 0)], 1u, _39);
16+
_42.Store(0, uint(int(_42.Load(0)) + 42));
17+
uint _55;
18+
_42.InterlockedAnd(4, _52.Load(0), _55);
19+
}
20+
21+
void main()
22+
{
23+
frag_main();
24+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#pragma clang diagnostic ignored "-Wunused-variable"
2+
3+
#include <metal_stdlib>
4+
#include <simd/simd.h>
5+
#include <metal_atomic>
6+
7+
using namespace metal;
8+
9+
struct Buffer3
10+
{
11+
int baz;
12+
};
13+
14+
struct Buffer
15+
{
16+
int foo;
17+
uint bar;
18+
};
19+
20+
struct Buffer2
21+
{
22+
uint quux;
23+
};
24+
25+
struct spvDescriptorSetBuffer0
26+
{
27+
device Buffer3* m_9 [[id(0)]];
28+
texture2d<float, access::write> img4 [[id(1)]];
29+
texture2d<float, access::write> img [[id(2), raster_order_group(0)]];
30+
texture2d<float> img3 [[id(3), raster_order_group(0)]];
31+
volatile device Buffer* m_34 [[id(4), raster_order_group(0)]];
32+
device Buffer2* m_44 [[id(5), raster_order_group(0)]];
33+
};
34+
35+
fragment void main0(constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
36+
{
37+
(*spvDescriptorSet0.m_9).baz = 0;
38+
spvDescriptorSet0.img4.write(float4(1.0, 0.0, 0.0, 1.0), uint2(int2(1)));
39+
spvDescriptorSet0.img.write(spvDescriptorSet0.img3.read(uint2(int2(0))), uint2(int2(0)));
40+
(*spvDescriptorSet0.m_34).foo += 42;
41+
uint _49 = atomic_fetch_and_explicit((volatile device atomic_uint*)&(*spvDescriptorSet0.m_34).bar, (*spvDescriptorSet0.m_44).quux, memory_order_relaxed);
42+
}
43+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma clang diagnostic ignored "-Wunused-variable"
2+
3+
#include <metal_stdlib>
4+
#include <simd/simd.h>
5+
#include <metal_atomic>
6+
7+
using namespace metal;
8+
9+
struct Buffer3
10+
{
11+
int baz;
12+
};
13+
14+
struct Buffer
15+
{
16+
int foo;
17+
uint bar;
18+
};
19+
20+
struct Buffer2
21+
{
22+
uint quux;
23+
};
24+
25+
fragment void main0(device Buffer3& _9 [[buffer(0)]], volatile device Buffer& _34 [[buffer(1), raster_order_group(0)]], device Buffer2& _44 [[buffer(2), raster_order_group(0)]], texture2d<float, access::write> img4 [[texture(0)]], texture2d<float, access::write> img [[texture(1), raster_order_group(0)]], texture2d<float> img3 [[texture(2), raster_order_group(0)]])
26+
{
27+
_9.baz = 0;
28+
img4.write(float4(1.0, 0.0, 0.0, 1.0), uint2(int2(1)));
29+
img.write(img3.read(uint2(int2(0))), uint2(int2(0)));
30+
_34.foo += 42;
31+
uint _49 = atomic_fetch_and_explicit((volatile device atomic_uint*)&_34.bar, _44.quux, memory_order_relaxed);
32+
}
33+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#version 450
2+
#extension GL_ARB_fragment_shader_interlock : require
3+
layout(pixel_interlock_ordered) in;
4+
5+
layout(binding = 2, std430) coherent buffer Buffer
6+
{
7+
int foo;
8+
uint bar;
9+
} _30;
10+
11+
layout(binding = 0, rgba8) uniform writeonly image2D img;
12+
layout(binding = 1, r32ui) uniform uimage2D img2;
13+
14+
void main()
15+
{
16+
beginInvocationInterlockARB();
17+
imageStore(img, ivec2(0), vec4(1.0, 0.0, 0.0, 1.0));
18+
uint _27 = imageAtomicAdd(img2, ivec2(0), 1u);
19+
_30.foo += 42;
20+
uint _41 = atomicAnd(_30.bar, 255u);
21+
endInvocationInterlockARB();
22+
}
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#version 450
2+
#extension GL_ARB_fragment_shader_interlock : require
3+
layout(pixel_interlock_unordered) in;
4+
5+
layout(binding = 2, std430) coherent buffer Buffer
6+
{
7+
int foo;
8+
uint bar;
9+
} _30;
10+
11+
layout(binding = 0, rgba8) uniform writeonly image2D img;
12+
layout(binding = 1, r32ui) uniform uimage2D img2;
13+
14+
void main()
15+
{
16+
beginInvocationInterlockARB();
17+
imageStore(img, ivec2(0), vec4(1.0, 0.0, 0.0, 1.0));
18+
uint _27 = imageAtomicAdd(img2, ivec2(0), 1u);
19+
_30.foo += 42;
20+
uint _41 = atomicAnd(_30.bar, 255u);
21+
endInvocationInterlockARB();
22+
}
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#version 450
2+
#extension GL_ARB_fragment_shader_interlock : require
3+
layout(sample_interlock_ordered) in;
4+
5+
layout(binding = 2, std430) coherent buffer Buffer
6+
{
7+
int foo;
8+
uint bar;
9+
} _30;
10+
11+
layout(binding = 0, rgba8) uniform writeonly image2D img;
12+
layout(binding = 1, r32ui) uniform uimage2D img2;
13+
14+
void main()
15+
{
16+
beginInvocationInterlockARB();
17+
imageStore(img, ivec2(0), vec4(1.0, 0.0, 0.0, 1.0));
18+
uint _27 = imageAtomicAdd(img2, ivec2(0), 1u);
19+
_30.foo += 42;
20+
uint _47 = atomicAnd(_30.bar, uint(gl_SampleMaskIn[0]));
21+
endInvocationInterlockARB();
22+
}
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#version 450
2+
#extension GL_ARB_fragment_shader_interlock : require
3+
layout(sample_interlock_unordered) in;
4+
5+
layout(binding = 2, std430) coherent buffer Buffer
6+
{
7+
int foo;
8+
uint bar;
9+
} _30;
10+
11+
layout(binding = 0, rgba8) uniform writeonly image2D img;
12+
layout(binding = 1, r32ui) uniform uimage2D img2;
13+
14+
void main()
15+
{
16+
beginInvocationInterlockARB();
17+
imageStore(img, ivec2(0), vec4(1.0, 0.0, 0.0, 1.0));
18+
uint _27 = imageAtomicAdd(img2, ivec2(0), 1u);
19+
_30.foo += 42;
20+
uint _41 = atomicAnd(_30.bar, 255u);
21+
endInvocationInterlockARB();
22+
}
23+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
RasterizerOrderedByteAddressBuffer _7 : register(u1, space0);
2+
RWByteAddressBuffer _9 : register(u0, space0);
3+
4+
static float4 gl_FragCoord;
5+
struct SPIRV_Cross_Input
6+
{
7+
float4 gl_FragCoord : SV_Position;
8+
};
9+
10+
void callee2()
11+
{
12+
int _31 = int(gl_FragCoord.x);
13+
_7.Store(_31 * 4 + 0, _7.Load(_31 * 4 + 0) + 1u);
14+
}
15+
16+
void callee()
17+
{
18+
int _39 = int(gl_FragCoord.x);
19+
_9.Store(_39 * 4 + 0, _9.Load(_39 * 4 + 0) + 1u);
20+
callee2();
21+
}
22+
23+
void frag_main()
24+
{
25+
callee();
26+
}
27+
28+
void main(SPIRV_Cross_Input stage_input)
29+
{
30+
gl_FragCoord = stage_input.gl_FragCoord;
31+
frag_main();
32+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
RasterizerOrderedByteAddressBuffer _7 : register(u1, space0);
2+
RWByteAddressBuffer _13 : register(u2, space0);
3+
RasterizerOrderedByteAddressBuffer _9 : register(u0, space0);
4+
5+
static float4 gl_FragCoord;
6+
struct SPIRV_Cross_Input
7+
{
8+
float4 gl_FragCoord : SV_Position;
9+
};
10+
11+
void callee2()
12+
{
13+
int _44 = int(gl_FragCoord.x);
14+
_7.Store(_44 * 4 + 0, _7.Load(_44 * 4 + 0) + 1u);
15+
}
16+
17+
void callee()
18+
{
19+
int _52 = int(gl_FragCoord.x);
20+
_9.Store(_52 * 4 + 0, _9.Load(_52 * 4 + 0) + 1u);
21+
callee2();
22+
if (true)
23+
{
24+
}
25+
}
26+
27+
void _35()
28+
{
29+
_13.Store(int(gl_FragCoord.x) * 4 + 0, 4u);
30+
}
31+
32+
void frag_main()
33+
{
34+
callee();
35+
_35();
36+
}
37+
38+
void main(SPIRV_Cross_Input stage_input)
39+
{
40+
gl_FragCoord = stage_input.gl_FragCoord;
41+
frag_main();
42+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
RasterizerOrderedByteAddressBuffer _7 : register(u1, space0);
2+
RasterizerOrderedByteAddressBuffer _9 : register(u0, space0);
3+
4+
static float4 gl_FragCoord;
5+
struct SPIRV_Cross_Input
6+
{
7+
float4 gl_FragCoord : SV_Position;
8+
};
9+
10+
void callee2()
11+
{
12+
int _37 = int(gl_FragCoord.x);
13+
_7.Store(_37 * 4 + 0, _7.Load(_37 * 4 + 0) + 1u);
14+
}
15+
16+
void callee()
17+
{
18+
int _45 = int(gl_FragCoord.x);
19+
_9.Store(_45 * 4 + 0, _9.Load(_45 * 4 + 0) + 1u);
20+
callee2();
21+
}
22+
23+
void _29()
24+
{
25+
}
26+
27+
void _31()
28+
{
29+
}
30+
31+
void frag_main()
32+
{
33+
callee();
34+
_29();
35+
_31();
36+
}
37+
38+
void main(SPIRV_Cross_Input stage_input)
39+
{
40+
gl_FragCoord = stage_input.gl_FragCoord;
41+
frag_main();
42+
}

0 commit comments

Comments
 (0)