mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 20:10:06 +00:00
fb18b6df28
For GLSL function imageAtomicStore, it will be translated to OpImageTexelPointer + OpAtomicStore. The result type of OpImageTexelPointer must be the same as the sampled type of OpTypeImage. On translation, the result type is mistakenly fetched from operand list operands[2] while operands[2] corresponds to sampleNum whose type is always uint. This leads to an error if the image type is iimageXXX that is int image.
75 lines
3.8 KiB
Plaintext
75 lines
3.8 KiB
Plaintext
#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;
|
|
layout(binding = 10, r32i) volatile coherent uniform iimage2DMS imageMS;
|
|
|
|
|
|
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);
|
|
|
|
imageAtomicStore(imageMS, ivec2(0,0), 1, 4, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
|
|
imageAtomicStore(imagei, ivec2(0,0), -7, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
|
|
}
|
|
|