#version 450

#extension GL_ARB_gpu_shader_int64: enable
#extension GL_AMD_gpu_shader_half_float: enable
#extension GL_AMD_gpu_shader_int16: 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;
    i16vec4 i16v;
    uint16_t u16;
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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