#version 450 | |
#extension GL_KHR_memory_scope_semantics : require | |
#extension GL_ARB_gpu_shader_int64 : require | |
#pragma use_vulkan_memory_model | |
shared uint value; | |
shared int atomi; | |
shared uint atomu; | |
layout(binding = 0, r32ui) workgroupcoherent uniform uimage2D imageu; | |
layout(binding = 1, r32i) volatile coherent uniform iimage2D imagei; | |
layout(binding = 5, r32i) nonprivate uniform iimage2D imagej[2]; | |
layout (binding = 2) buffer BufferU { workgroupcoherent uint x; } bufferu; | |
layout (binding = 3) coherent buffer BufferI { uint x; } bufferi; | |
struct A { uint x[2]; }; | |
layout (binding = 4) volatile buffer BufferJ { subgroupcoherent A a; } bufferj[2]; | |
layout (binding = 6) nonprivate uniform sampler2D samp[2]; | |
layout (binding = 7) nonprivate uniform BufferK { uint x; } bufferk; | |
shared uint64_t atomu64; | |
shared int64_t atomi64; | |
layout (binding = 8) volatile buffer BufferL { uint x; } bufferl; | |
layout (binding = 9) buffer BufferM { volatile uint x; } bufferm; | |
void main() | |
{ | |
int origi = atomicAdd(atomi, 3, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease); | |
uint origu = atomicAnd(atomu, value); | |
origi = atomicLoad(atomi, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire); | |
atomicStore(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease); | |
origi = imageAtomicLoad(imagei, ivec2(0,0), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire); | |
origu = imageAtomicAdd(imageu, ivec2(0,0), 3u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire); | |
imageAtomicStore(imageu, ivec2(0,0), 4u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease); | |
origu = atomicOr(atomu, 7u, gl_ScopeDevice, 0, 0); | |
origu = atomicXor(atomu, 7u, gl_ScopeDevice, 0, 0); | |
origu = atomicMin(atomu, value, gl_ScopeDevice, 0, 0); | |
origi = atomicMax(atomi, 7, gl_ScopeDevice, 0, 0); | |
origi = atomicExchange(atomi, origi, gl_ScopeDevice, 0, 0); | |
origu = atomicCompSwap(atomu, 10u, value, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire); | |
atomicAdd(bufferu.x, 1, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease); | |
memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease); | |
controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire); | |
controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, 0, 0); | |
uint y; | |
y = bufferu.x; | |
bufferu.x = y; | |
y = bufferi.x; | |
y = bufferj[0].a.x[1]; | |
bufferi.x = y; | |
bufferj[0].a.x[1] = y; | |
bufferj[0].a = bufferj[1].a; | |
bufferi.x = bufferk.x; | |
imageLoad(imagei, ivec2(0,0)); | |
imageLoad(imagej[0], ivec2(0,0)); | |
imageStore(imagej[1], ivec2(0,0), ivec4(0,0,0,0)); | |
texture(samp[0], vec2(0,0)); | |
atomu64 = atomicMax(atomu64, uint64_t(7), gl_ScopeDevice, 0, 0); | |
atomicCompSwap(atomi64, int64_t(10), int64_t(atomu64), gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire); | |
y = bufferl.x; | |
atomicAdd(bufferl.x, 1); | |
atomicOr(bufferm.x, 2); | |
imageAtomicAdd(imagei, ivec2(0,0), 3); | |
atomicAdd(bufferu.x, 4u, gl_ScopeDevice, 0, 0); | |
atomicAdd(bufferu.x, 5u, gl_ScopeDevice, 0, gl_SemanticsVolatile); | |
} | |