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