| #version 450 core |
| |
| #extension GL_KHR_memory_scope_semantics : enable |
| #extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable |
| #extension GL_EXT_shader_atomic_float2: enable |
| #pragma use_vulkan_memory_model |
| |
| layout(local_size_x = 16, local_size_y = 16) in; |
| |
| layout(binding = 0) buffer Buffer |
| { |
| float16_t datah; |
| float dataf; |
| double datad; |
| } buf; |
| |
| shared float16_t atomh; |
| 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 |
| float16_t resulth = float16_t(0.0); |
| resulth = atomicAdd(atomh, float16_t(3.0)); |
| resulth = atomicAdd(atomh, float16_t(4.5), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| resulth = atomicAdd(buf.datah, float16_t(3.0)); |
| resulth = atomicAdd(buf.datah, float16_t(4.5), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| |
| //atomicMin |
| resulth = atomicMin(atomh, float16_t(3.0)); |
| resulth = atomicMin(atomh, float16_t(4.5), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| resulth = atomicMin(buf.datah, float16_t(3.0)); |
| resulth = atomicMin(buf.datah, float16_t(4.5), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| |
| float resultf = 0.0; |
| resultf = atomicMin(atomf, 3.0); |
| resultf = atomicMin(atomf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| resultf = atomicMin(buf.dataf, 3.0); |
| resultf = atomicMin(buf.dataf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| |
| double resultd = 0.0; |
| resultd = atomicMin(atomd, 3.0); |
| resultd = atomicMin(atomd, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| resultd = atomicMin(buf.datad, 3.0); |
| resultd = atomicMin(buf.datad, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| |
| //atomicMax |
| resulth = atomicMax(atomh, float16_t(3.0)); |
| resulth = atomicMax(atomh, float16_t(4.5), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| resulth = atomicMax(buf.datah, float16_t(3.0)); |
| resulth = atomicMax(buf.datah, float16_t(4.5), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| |
| resultf = atomicMax(atomf, 3.0); |
| resultf = atomicMax(atomf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| resultf = atomicMax(buf.dataf, 3.0); |
| resultf = atomicMax(buf.dataf, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| |
| resultd = atomicMax(atomd, 3.0); |
| resultd = atomicMax(atomd, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| resultd = atomicMax(buf.datad, 3.0); |
| resultd = atomicMax(buf.datad, 4.5, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelaxed); |
| |
| //atomicExchange |
| resulth = atomicExchange(buf.datah, resulth); |
| buf.datah += resulth; |
| resulth = atomicExchange(buf.datah, resulth, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed); |
| buf.datah += resulth; |
| resulth = atomicExchange(atomh, resulth); |
| buf.datah += resulth; |
| resulth = atomicExchange(atomh, resulth, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed); |
| buf.datah += resulth; |
| |
| //atomic load/store |
| resulth = atomicLoad(buf.datah, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed); |
| atomicStore(buf.datah, resulth, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed); |
| buf.datah += resulth; |
| |
| resulth = atomicLoad(atomh, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed); |
| atomicStore(atomh, resulth, gl_ScopeDevice, gl_StorageSemanticsShared, gl_SemanticsRelaxed); |
| buf.datah += resulth; |
| |
| // image atomics on 1D: |
| atomf = imageAtomicMin(fimage1D, int(0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMin(fimage1D, int(1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| atomf = imageAtomicMax(fimage1D, int(0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMax(fimage1D, int(1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| // image atomics on 1D Array: |
| atomf = imageAtomicMin(fimage1DArray, ivec2(0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMin(fimage1DArray, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| atomf = imageAtomicMax(fimage1DArray, ivec2(0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMax(fimage1DArray, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| // image atomics on 2D: |
| atomf = imageAtomicMin(fimage2D, ivec2(0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMin(fimage2D, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| atomf = imageAtomicMax(fimage2D, ivec2(0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMax(fimage2D, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| // image atomics on 2D Rect: |
| atomf = imageAtomicMin(fimage2DRect, ivec2(0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMin(fimage2DRect, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| atomf = imageAtomicMax(fimage2DRect, ivec2(0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMax(fimage2DRect, ivec2(1,1), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| // image atomics on 2D Array: |
| atomf = imageAtomicMin(fimage2DArray, ivec3(0,0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMin(fimage2DArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| atomf = imageAtomicMax(fimage2DArray, ivec3(0,0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMax(fimage2DArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| // image atomics on Cube: |
| atomf = imageAtomicMin(fimageCube, ivec3(0,0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMin(fimageCube, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| atomf = imageAtomicMax(fimageCube, ivec3(0,0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMax(fimageCube, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| // image atomics on Cube Array: |
| atomf = imageAtomicMin(fimageCubeArray, ivec3(0,0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMin(fimageCubeArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| atomf = imageAtomicMax(fimageCubeArray, ivec3(0,0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMax(fimageCubeArray, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| // image atomics on 3D: |
| atomf = imageAtomicMin(fimage3D, ivec3(0,0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMin(fimage3D, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| |
| atomf = imageAtomicMax(fimage3D, ivec3(0,0,0), 2.0); |
| buf.dataf += atomf; |
| atomf = imageAtomicMax(fimage3D, ivec3(1,1,0), 3.0, gl_ScopeDevice, gl_StorageSemanticsImage , gl_SemanticsRelaxed); |
| buf.dataf += atomf; |
| } |