2 #extension GL_KHR_memory_scope_semantics : require
\r
3 #extension GL_ARB_gpu_shader_int64 : require
\r
5 #pragma use_vulkan_memory_model
\r
10 layout(binding = 0, r32ui) workgroupcoherent uniform uimage2D imageu;
\r
11 layout(binding = 1, r32i) volatile coherent uniform iimage2D imagei;
\r
12 layout(binding = 5, r32i) nonprivate uniform iimage2D imagej[2];
\r
13 layout (binding = 2) buffer BufferU { workgroupcoherent uint x; } bufferu;
\r
14 layout (binding = 3) coherent buffer BufferI { uint x; } bufferi;
\r
15 struct A { uint x[2]; };
\r
16 layout (binding = 4) volatile buffer BufferJ { subgroupcoherent A a; } bufferj[2];
\r
17 layout (binding = 6) nonprivate uniform sampler2D samp[2];
\r
18 layout (binding = 7) nonprivate uniform BufferK { uint x; } bufferk;
\r
19 shared uint64_t atomu64;
\r
20 shared int64_t atomi64;
\r
21 layout (binding = 8) volatile buffer BufferL { uint x; } bufferl;
\r
22 layout (binding = 9) buffer BufferM { volatile uint x; } bufferm;
\r
23 layout(binding = 10, r32i) volatile coherent uniform iimage2DMS imageMS;
\r
28 int origi = atomicAdd(atomi, 3, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
\r
29 uint origu = atomicAnd(atomu, value);
\r
30 origi = atomicLoad(atomi, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
\r
31 atomicStore(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
\r
32 origi = imageAtomicLoad(imagei, ivec2(0,0), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
\r
33 origu = imageAtomicAdd(imageu, ivec2(0,0), 3u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
\r
34 imageAtomicStore(imageu, ivec2(0,0), 4u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
\r
35 origu = atomicOr(atomu, 7u, gl_ScopeDevice, 0, 0);
\r
36 origu = atomicXor(atomu, 7u, gl_ScopeDevice, 0, 0);
\r
37 origu = atomicMin(atomu, value, gl_ScopeDevice, 0, 0);
\r
38 origi = atomicMax(atomi, 7, gl_ScopeDevice, 0, 0);
\r
39 origi = atomicExchange(atomi, origi, gl_ScopeDevice, 0, 0);
\r
40 origu = atomicCompSwap(atomu, 10u, value, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
\r
41 atomicAdd(bufferu.x, 1, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
\r
42 memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
\r
43 controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
\r
44 controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, 0, 0);
\r
50 y = bufferj[0].a.x[1];
\r
52 bufferj[0].a.x[1] = y;
\r
53 bufferj[0].a = bufferj[1].a;
\r
54 bufferi.x = bufferk.x;
\r
56 imageLoad(imagei, ivec2(0,0));
\r
57 imageLoad(imagej[0], ivec2(0,0));
\r
58 imageStore(imagej[1], ivec2(0,0), ivec4(0,0,0,0));
\r
59 texture(samp[0], vec2(0,0));
\r
61 atomu64 = atomicMax(atomu64, uint64_t(7), gl_ScopeDevice, 0, 0);
\r
62 atomicCompSwap(atomi64, int64_t(10), int64_t(atomu64), gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
\r
65 atomicAdd(bufferl.x, 1);
\r
66 atomicOr(bufferm.x, 2);
\r
67 imageAtomicAdd(imagei, ivec2(0,0), 3);
\r
68 atomicAdd(bufferu.x, 4u, gl_ScopeDevice, 0, 0);
\r
69 atomicAdd(bufferu.x, 5u, gl_ScopeDevice, 0, gl_SemanticsVolatile);
\r
71 imageAtomicStore(imageMS, ivec2(0,0), 1, 4, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
\r
72 imageAtomicStore(imagei, ivec2(0,0), -7, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
\r