#version 460 | |
out vec4 o; | |
// default uniforms will be gathered into a uniform block | |
uniform vec4 a; | |
uniform vec2 b = vec2(0, 0); // initializer will be ignored | |
layout(location = 0) uniform vec2 c; // location qualifier will be ignored | |
uniform vec4 d[10]; | |
uniform struct e { | |
vec2 x; | |
float y; | |
uint z; | |
} structUniform; | |
// opaque types will not be grouped into uniform block | |
uniform sampler2D t1; | |
// shared and packed layout qualifier are silently ignored | |
layout(shared) uniform UniformBlock { | |
float j; | |
vec4 k; | |
}; | |
layout(packed) buffer BufferBlock { | |
float j; | |
vec4 k; | |
} bufferInstance; | |
// atomic_uint will be converted to uint and gathered in a buffer block | |
layout(binding = 0) uniform atomic_uint counter1; // offset not used | |
layout(binding = 0) uniform atomic_uint counter2; // offset not used | |
layout(binding = 1) uniform atomic_uint counter3; // offset not used | |
// atomic counter functions will be converted to equivalent integer atomic operations | |
uint bar() { | |
uint j = 0; | |
j = atomicCounterIncrement(counter1); | |
j = atomicCounterDecrement(counter1); | |
j = atomicCounter(counter1); | |
j = atomicCounterAdd(counter1, 1); | |
j = atomicCounterAdd(counter1, -1); | |
j = atomicCounterSubtract(counter1, 1); | |
j = atomicCounterMin(counter1, j); | |
j = atomicCounterMax(counter1, j); | |
j = atomicCounterAnd(counter1, j); | |
j = atomicCounterOr(counter1, j); | |
j = atomicCounterXor(counter1, j); | |
j = atomicCounterExchange(counter1, j); | |
j = atomicCounterCompSwap(counter1, 0, j); | |
atomicCounterIncrement(counter2); | |
atomicCounterIncrement(counter3); | |
memoryBarrierAtomicCounter(); | |
return j; | |
} | |
vec4 foo() { | |
float f = j + bufferInstance.j + structUniform.y + structUniform.z; | |
vec2 v2 = b + c + structUniform.x; | |
vec4 v4 = a + d[0] + d[1] + d[2] + k + bufferInstance.k + texture(t1, vec2(0, 0)); | |
return vec4(f) * vec4(v2, 1, 1) * v4; | |
} | |
void main() { | |
float j = float(bar()); | |
o = j * foo(); | |
} |