| #version 450 core | |
| #extension GL_KHR_memory_scope_semantics : enable | |
| #extension GL_EXT_shader_atomic_float: enable | |
| #pragma use_vulkan_memory_model | |
| layout(local_size_x = 16, local_size_y = 16) in; | |
| layout(binding = 0) buffer Buffer | |
| { | |
| float dataf; | |
| double datad; | |
| } buf; | |
| shared float atomf; | |
| shared double atomd; | |
| layout(binding = 0, r32f) volatile coherent uniform image1D fimage1D; | |
| layout(binding = 1, r32f) volatile coherent uniform image1DArray fimage1DArray; | |
| layout(binding = 2, r32f) volatile coherent uniform image2D fimage2D; | |
| layout(binding = 3, r32f) volatile coherent uniform image2DArray fimage2DArray; | |
| layout(binding = 4, r32f) volatile coherent uniform image2DRect fimage2DRect; | |
| layout(binding = 5, r32f) volatile coherent uniform imageCube fimageCube; | |
| layout(binding = 6, r32f) volatile coherent uniform imageCubeArray fimageCubeArray; | |
| layout(binding = 9, r32f) volatile coherent uniform image3D fimage3D; | |
| void main() | |
| { | |
| //atomicAdd | |
| float resultf = 0; | |
| resultf = atomicAdd(atomf, 3.0); | |
| resultf = atomicAdd(atomf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquireRelease); | |
| resultf = atomicAdd(buf.dataf, 3.0); | |
| resultf = atomicAdd(buf.dataf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquireRelease); | |
| double resultd = 0; | |
| resultd = atomicAdd(atomd, 3.0); | |
| resultd = atomicAdd(atomd, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquireRelease); | |
| resultd = atomicAdd(buf.datad, 3.0); | |
| resultd = atomicAdd(buf.datad, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquireRelease); | |
| //atomicExchange | |
| resultf = atomicExchange(buf.dataf, resultf); | |
| buf.dataf += resultf; | |
| resultf = atomicExchange(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsAcquireRelease); | |
| buf.dataf += resultf; | |
| resultf = atomicExchange(atomf, resultf); | |
| buf.dataf += resultf; | |
| resultf = atomicExchange(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsAcquireRelease); | |
| buf.dataf += resultf; | |
| resultd = atomicExchange(buf.datad, resultd); | |
| buf.datad += resultd; | |
| resultd = atomicExchange(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsAcquireRelease); | |
| buf.datad += resultd; | |
| resultd = atomicExchange(atomd, resultd); | |
| buf.datad += resultd; | |
| resultd = atomicExchange(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsAcquireRelease); | |
| buf.datad += resultd; | |
| //atomic load/store | |
| resultf = atomicLoad(buf.dataf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsAcquire); | |
| atomicStore(buf.dataf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelease); | |
| buf.dataf += resultf; | |
| resultf = atomicLoad(atomf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsAcquire); | |
| atomicStore(atomf, resultf, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelease); | |
| buf.dataf += resultf; | |
| resultd = atomicLoad(buf.datad, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsAcquire); | |
| atomicStore(buf.datad, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelease); | |
| buf.datad += resultd; | |
| resultd = atomicLoad(atomd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsAcquire); | |
| atomicStore(atomd, resultd, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelease); | |
| buf.datad += resultd; | |
| // image atomics on 1D: | |
| atomf = imageAtomicAdd(fimage1D, int(0), 2.0); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicAdd(fimage1D, int(1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicExchange(fimage1D, int(1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicLoad(fimage1D, int(1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquire); | |
| buf.dataf += atomf; | |
| imageAtomicStore(fimage1D, int(2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelease); | |
| buf.dataf += atomf; | |
| // image atomics on 1D Array: | |
| atomf = imageAtomicAdd(fimage1DArray, ivec2(0,0), 2.0); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicAdd(fimage1DArray, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicExchange(fimage1DArray, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicLoad(fimage1DArray, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquire); | |
| buf.dataf += atomf; | |
| imageAtomicStore(fimage1DArray, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelease); | |
| buf.dataf += atomf; | |
| // image atomics on 2D: | |
| atomf = imageAtomicAdd(fimage2D, ivec2(0,0), 2.0); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicAdd(fimage2D, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicExchange(fimage2D, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicLoad(fimage2D, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquire); | |
| buf.dataf += atomf; | |
| imageAtomicStore(fimage2D, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelease); | |
| buf.dataf += atomf; | |
| // image atomics on 2D Rect: | |
| atomf = imageAtomicAdd(fimage2DRect, ivec2(0,0), 2.0); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicAdd(fimage2DRect, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicExchange(fimage2DRect, ivec2(1,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicLoad(fimage2DRect, ivec2(1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquire); | |
| buf.dataf += atomf; | |
| imageAtomicStore(fimage2DRect, ivec2(2,2), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelease); | |
| buf.dataf += atomf; | |
| // image atomics on 2D Array: | |
| atomf = imageAtomicAdd(fimage2DArray, ivec3(0,0,0), 2.0); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicAdd(fimage2DArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicExchange(fimage2DArray, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicLoad(fimage2DArray, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquire); | |
| buf.dataf += atomf; | |
| imageAtomicStore(fimage2DArray, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelease); | |
| buf.dataf += atomf; | |
| // image atomics on Cube: | |
| atomf = imageAtomicAdd(fimageCube, ivec3(0,0,0), 2.0); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicAdd(fimageCube, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicExchange(fimageCube, ivec3(1,0,0), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicLoad(fimageCube, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquire); | |
| buf.dataf += atomf; | |
| imageAtomicStore(fimageCube, ivec3(2,2,1), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelease); | |
| buf.dataf += atomf; | |
| // image atomics on Cube Array: | |
| atomf = imageAtomicAdd(fimageCubeArray, ivec3(0,0,0), 2.0); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicAdd(fimageCubeArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicExchange(fimageCubeArray, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicLoad(fimageCubeArray, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquire); | |
| buf.dataf += atomf; | |
| imageAtomicStore(fimageCubeArray, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelease); | |
| buf.dataf += atomf; | |
| // image atomics on 3D: | |
| atomf = imageAtomicAdd(fimage3D, ivec3(0,0,0), 2.0); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicAdd(fimage3D, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicExchange(fimage3D, ivec3(1,0,1), 4.0, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquireRelease); | |
| buf.dataf += atomf; | |
| atomf = imageAtomicLoad(fimage3D, ivec3(1,1,1), gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsAcquire); | |
| buf.dataf += atomf; | |
| imageAtomicStore(fimage3D, ivec3(2,2,0), atomf, gl_ScopeDevice, gl_StorageSemanticsImage, gl_SemanticsRelease); | |
| buf.dataf += atomf; | |
| } |