#version 450

#extension GL_ARB_gpu_shader_int64: enable
#extension GL_AMD_gpu_shader_half_float: enable
#extension GL_AMD_shader_ballot: enable

layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

layout(binding = 0) buffer Buffers
{
    int     i;
    uvec2   uv;
    vec3    fv;
    dvec4   dv;
    int64_t i64;
    u64vec2 u64v;
    f16vec3 f16v;
};

void main()
{
	i    = minInvocationsAMD(i);
    uv   = minInvocationsAMD(uv);
    fv   = minInvocationsAMD(fv);
    dv   = minInvocationsAMD(dv);
    i64  = minInvocationsAMD(i64);
    u64v = minInvocationsAMD(u64v);
    f16v = minInvocationsAMD(f16v);

    i    = maxInvocationsAMD(i);
    uv   = maxInvocationsAMD(uv);
    fv   = maxInvocationsAMD(fv);
    dv   = maxInvocationsAMD(dv);
    i64  = maxInvocationsAMD(i64);
    u64v = maxInvocationsAMD(u64v);
    f16v = maxInvocationsAMD(f16v);

    i    = addInvocationsAMD(i);
    uv   = addInvocationsAMD(uv);
    fv   = addInvocationsAMD(fv);
    dv   = addInvocationsAMD(dv);
    i64  = addInvocationsAMD(i64);
    u64v = addInvocationsAMD(u64v);
    f16v = addInvocationsAMD(f16v);

	i    = minInvocationsNonUniformAMD(i);
    uv   = minInvocationsNonUniformAMD(uv);
    fv   = minInvocationsNonUniformAMD(fv);
    dv   = minInvocationsNonUniformAMD(dv);
    i64  = minInvocationsNonUniformAMD(i64);
    u64v = minInvocationsNonUniformAMD(u64v);
    f16v = minInvocationsNonUniformAMD(f16v);

    i    = maxInvocationsNonUniformAMD(i);
    uv   = maxInvocationsNonUniformAMD(uv);
    fv   = maxInvocationsNonUniformAMD(fv);
    dv   = maxInvocationsNonUniformAMD(dv);
    i64  = maxInvocationsNonUniformAMD(i64);
    u64v = maxInvocationsNonUniformAMD(u64v);
    f16v = maxInvocationsNonUniformAMD(f16v);

    i    = addInvocationsNonUniformAMD(i);
    uv   = addInvocationsNonUniformAMD(uv);
    fv   = addInvocationsNonUniformAMD(fv);
    dv   = addInvocationsNonUniformAMD(dv);
    i64  = addInvocationsNonUniformAMD(i64);
    u64v = addInvocationsNonUniformAMD(u64v);
    f16v = addInvocationsNonUniformAMD(f16v);

    i    = minInvocationsInclusiveScanAMD(i);
    uv   = minInvocationsInclusiveScanAMD(uv);
    fv   = minInvocationsInclusiveScanAMD(fv);
    dv   = minInvocationsInclusiveScanAMD(dv);
    i64  = minInvocationsInclusiveScanAMD(i64);
    u64v = minInvocationsInclusiveScanAMD(u64v);
    f16v = minInvocationsInclusiveScanAMD(f16v);

    i    = maxInvocationsInclusiveScanAMD(i);
    uv   = maxInvocationsInclusiveScanAMD(uv);
    fv   = maxInvocationsInclusiveScanAMD(fv);
    dv   = maxInvocationsInclusiveScanAMD(dv);
    i64  = maxInvocationsInclusiveScanAMD(i64);
    u64v = maxInvocationsInclusiveScanAMD(u64v);
    f16v = maxInvocationsInclusiveScanAMD(f16v);

    i    = addInvocationsInclusiveScanAMD(i);
    uv   = addInvocationsInclusiveScanAMD(uv);
    fv   = addInvocationsInclusiveScanAMD(fv);
    dv   = addInvocationsInclusiveScanAMD(dv);
    i64  = addInvocationsInclusiveScanAMD(i64);
    u64v = addInvocationsInclusiveScanAMD(u64v);
    f16v = addInvocationsInclusiveScanAMD(f16v);

    i    = minInvocationsExclusiveScanAMD(i);
    uv   = minInvocationsExclusiveScanAMD(uv);
    fv   = minInvocationsExclusiveScanAMD(fv);
    dv   = minInvocationsExclusiveScanAMD(dv);
    i64  = minInvocationsExclusiveScanAMD(i64);
    u64v = minInvocationsExclusiveScanAMD(u64v);
    f16v = minInvocationsExclusiveScanAMD(f16v);

    i    = maxInvocationsExclusiveScanAMD(i);
    uv   = maxInvocationsExclusiveScanAMD(uv);
    fv   = maxInvocationsExclusiveScanAMD(fv);
    dv   = maxInvocationsExclusiveScanAMD(dv);
    i64  = maxInvocationsExclusiveScanAMD(i64);
    u64v = maxInvocationsExclusiveScanAMD(u64v);
    f16v = maxInvocationsExclusiveScanAMD(f16v);

    i    = addInvocationsExclusiveScanAMD(i);
    uv   = addInvocationsExclusiveScanAMD(uv);
    fv   = addInvocationsExclusiveScanAMD(fv);
    dv   = addInvocationsExclusiveScanAMD(dv);
    i64  = addInvocationsExclusiveScanAMD(i64);
    u64v = addInvocationsExclusiveScanAMD(u64v);
    f16v = addInvocationsExclusiveScanAMD(f16v);

    i    = minInvocationsInclusiveScanNonUniformAMD(i);
    uv   = minInvocationsInclusiveScanNonUniformAMD(uv);
    fv   = minInvocationsInclusiveScanNonUniformAMD(fv);
    dv   = minInvocationsInclusiveScanNonUniformAMD(dv);
    i64  = minInvocationsInclusiveScanNonUniformAMD(i64);
    u64v = minInvocationsInclusiveScanNonUniformAMD(u64v);
    f16v = minInvocationsInclusiveScanNonUniformAMD(f16v);

    i    = maxInvocationsInclusiveScanNonUniformAMD(i);
    uv   = maxInvocationsInclusiveScanNonUniformAMD(uv);
    fv   = maxInvocationsInclusiveScanNonUniformAMD(fv);
    dv   = maxInvocationsInclusiveScanNonUniformAMD(dv);
    i64  = maxInvocationsInclusiveScanNonUniformAMD(i64);
    u64v = maxInvocationsInclusiveScanNonUniformAMD(u64v);
    f16v = maxInvocationsInclusiveScanNonUniformAMD(f16v);

    i    = addInvocationsInclusiveScanNonUniformAMD(i);
    uv   = addInvocationsInclusiveScanNonUniformAMD(uv);
    fv   = addInvocationsInclusiveScanNonUniformAMD(fv);
    dv   = addInvocationsInclusiveScanNonUniformAMD(dv);
    i64  = addInvocationsInclusiveScanNonUniformAMD(i64);
    u64v = addInvocationsInclusiveScanNonUniformAMD(u64v);
    f16v = addInvocationsInclusiveScanNonUniformAMD(f16v);

    i    = minInvocationsExclusiveScanNonUniformAMD(i);
    uv   = minInvocationsExclusiveScanNonUniformAMD(uv);
    fv   = minInvocationsExclusiveScanNonUniformAMD(fv);
    dv   = minInvocationsExclusiveScanNonUniformAMD(dv);
    i64  = minInvocationsExclusiveScanNonUniformAMD(i64);
    u64v = minInvocationsExclusiveScanNonUniformAMD(u64v);
    f16v = minInvocationsExclusiveScanNonUniformAMD(f16v);

    i    = maxInvocationsExclusiveScanNonUniformAMD(i);
    uv   = maxInvocationsExclusiveScanNonUniformAMD(uv);
    fv   = maxInvocationsExclusiveScanNonUniformAMD(fv);
    dv   = maxInvocationsExclusiveScanNonUniformAMD(dv);
    i64  = maxInvocationsExclusiveScanNonUniformAMD(i64);
    u64v = maxInvocationsExclusiveScanNonUniformAMD(u64v);
    f16v = maxInvocationsExclusiveScanNonUniformAMD(f16v);

    i    = addInvocationsExclusiveScanNonUniformAMD(i);
    uv   = addInvocationsExclusiveScanNonUniformAMD(uv);
    fv   = addInvocationsExclusiveScanNonUniformAMD(fv);
    dv   = addInvocationsExclusiveScanNonUniformAMD(dv);
    i64  = addInvocationsExclusiveScanNonUniformAMD(i64);
    u64v = addInvocationsExclusiveScanNonUniformAMD(u64v);
    f16v = addInvocationsExclusiveScanNonUniformAMD(f16v);
}
