#version 450
#extension GL_EXT_demote_to_helper_invocation : enable

layout(set=0, binding=0, std430) buffer foo_t
{
	float x;
	uint y;
} foo;

layout(r32ui, set=0, binding=1) uniform uimage2D bar;

layout(location=0) out vec4 fragColor;

vec4 frag_body() {
	foo.x = 1.0f;
	atomicExchange(foo.y, 0);
	if (int(gl_FragCoord.x) == 3)
		demote;
	imageStore(bar, ivec2(gl_FragCoord.xy), uvec4(1));
	atomicAdd(foo.y, 42);
	imageAtomicOr(bar, ivec2(gl_FragCoord.xy), 0x3e);
	atomicAnd(foo.y, 0xffff);
	atomicXor(foo.y, 0xffffff00);
	atomicMin(foo.y, 1);
	imageAtomicMax(bar, ivec2(gl_FragCoord.xy), 100);
	imageAtomicCompSwap(bar, ivec2(gl_FragCoord.xy), 100, 42);
	return vec4(1.0f, float(helperInvocationEXT()), 0.0f, 1.0f);
}

void main() {
	fragColor = frag_body();
}

