Implement GLSL_EXT_shader_atomic_float2
This commit is contained in:
committed by
Caio Marcelo de Oliveira Filho
parent
a23e143636
commit
d352577a99
179
Test/spv.atomicFloat2.comp
Normal file
179
Test/spv.atomicFloat2.comp
Normal file
@@ -0,0 +1,179 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user