Merge pull request #3031 from rg3igalia/sub-group-size-arb-flat-fix
[platform/upstream/glslang.git] / Test / spv.memoryScopeSemantics.comp
1 #version 450\r
2 #extension GL_KHR_memory_scope_semantics : require\r
3 #extension GL_ARB_gpu_shader_int64 : require\r
4 \r
5 #pragma use_vulkan_memory_model\r
6 \r
7 shared uint value;\r
8 shared int atomi;\r
9 shared uint atomu;\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
24 \r
25 \r
26 void main()\r
27 {\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
45 \r
46     uint y;\r
47     y = bufferu.x;\r
48     bufferu.x = y;\r
49     y = bufferi.x;\r
50     y = bufferj[0].a.x[1];\r
51     bufferi.x = y;\r
52     bufferj[0].a.x[1] = y;\r
53     bufferj[0].a = bufferj[1].a;\r
54     bufferi.x = bufferk.x;\r
55 \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
60 \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
63 \r
64     y = bufferl.x;\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
70 \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
73 }\r
74 \r