#version 460
#extension GL_EXT_buffer_reference2 : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_buffer_reference_uvec2 : require
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

layout(buffer_reference) buffer uintPointer;
layout(buffer_reference, buffer_reference_align = 4) buffer uintPointer
{
    uint value;
};

layout(set = 7, binding = 0, std430) readonly buffer AtomicCounters
{
    uvec2 counters[];
} _17;

layout(push_constant, std430) uniform RootConstants
{
    uint _m0;
    uint _m1;
    uint _m2;
    uint _m3;
    uint _m4;
    uint _m5;
    uint _m6;
    uint _m7;
} registers;

layout(set = 4, binding = 0, r32ui) uniform readonly writeonly uimageBuffer _12[];
layout(set = 3, binding = 0) uniform writeonly image2D _22[];

uint RobustPhysicalAtomicCounter(uvec2 _60, uint _61, uint _62)
{
    uint _76;
    if (any(notEqual(_60, uvec2(0u))))
    {
        uint _73 = atomicAdd(uintPointer(_60), _61);
        _76 = _73 + _62;
    }
    else
    {
        _76 = 0u;
    }
    return _76;
}

void main()
{
    if (gl_GlobalInvocationID.x > 80u)
    {
        imageStore(_22[registers._m3 + 6u], ivec2(uvec2(gl_GlobalInvocationID.x, 0u)), vec4(0.0));
        if (gl_GlobalInvocationID.x > 90u)
        {
            imageStore(_22[registers._m3 + ((gl_GlobalInvocationID.x & 1u) + 7u)], ivec2(uvec2(0u, gl_GlobalInvocationID.x)), vec4(0.0));
        }
    }
    uvec2 _58 = _17.counters[registers._m4];
    uint _78 = RobustPhysicalAtomicCounter(_58, 1u, 0u);
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 95
; Schema: 0
OpCapability Shader
OpCapability StorageImageArrayDynamicIndexing
OpCapability ImageBuffer
OpCapability StorageImageWriteWithoutFormat
OpCapability RuntimeDescriptorArray
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_physical_storage_buffer"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint GLCompute %3 "main" %25
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "main"
OpName %6 "RootConstants"
OpName %8 "registers"
OpName %15 "AtomicCounters"
OpMemberName %15 0 "counters"
OpName %63 "RobustPhysicalAtomicCounter"
OpDecorate %6 Block
OpMemberDecorate %6 0 Offset 0
OpMemberDecorate %6 1 Offset 4
OpMemberDecorate %6 2 Offset 8
OpMemberDecorate %6 3 Offset 12
OpMemberDecorate %6 4 Offset 16
OpMemberDecorate %6 5 Offset 20
OpMemberDecorate %6 6 Offset 24
OpMemberDecorate %6 7 Offset 28
OpDecorate %12 DescriptorSet 4
OpDecorate %12 Binding 0
OpDecorate %12 NonReadable
OpDecorate %12 NonWritable
OpDecorate %14 ArrayStride 8
OpDecorate %15 Block
OpMemberDecorate %15 0 Offset 0
OpMemberDecorate %15 0 NonWritable
OpDecorate %17 DescriptorSet 7
OpDecorate %17 Binding 0
OpDecorate %17 AliasedPointer
OpDecorate %22 DescriptorSet 3
OpDecorate %22 Binding 0
OpDecorate %22 NonReadable
OpDecorate %25 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeStruct %5 %5 %5 %5 %5 %5 %5 %5
%7 = OpTypePointer PushConstant %6
%8 = OpVariable %7 PushConstant
%9 = OpTypeImage %5 Buffer 0 0 0 2 R32ui
%10 = OpTypeRuntimeArray %9
%11 = OpTypePointer UniformConstant %10
%12 = OpVariable %11 UniformConstant
%13 = OpTypeVector %5 2
%14 = OpTypeRuntimeArray %13
%15 = OpTypeStruct %14
%16 = OpTypePointer StorageBuffer %15
%17 = OpVariable %16 StorageBuffer
%18 = OpTypeFloat 32
%19 = OpTypeImage %18 2D 0 0 0 2 Unknown
%20 = OpTypeRuntimeArray %19
%21 = OpTypePointer UniformConstant %20
%22 = OpVariable %21 UniformConstant
%23 = OpTypeVector %5 3
%24 = OpTypePointer Input %23
%25 = OpVariable %24 Input
%26 = OpTypePointer Input %5
%28 = OpConstant %5 0
%30 = OpTypeBool
%32 = OpConstant %5 80
%33 = OpTypePointer UniformConstant %19
%35 = OpTypePointer PushConstant %5
%37 = OpConstant %5 3
%40 = OpConstant %5 6
%42 = OpConstant %18 0
%44 = OpTypeVector %18 4
%47 = OpConstant %5 90
%48 = OpTypePointer UniformConstant %9
%51 = OpConstant %5 4
%54 = OpTypePointer StorageBuffer %13
%59 = OpTypeFunction %5 %13 %5 %5
%67 = OpTypeVector %30 2
%68 = OpConstantNull %13
%71 = OpTypePointer PhysicalStorageBuffer %5
%74 = OpConstant %5 1
%81 = OpConstant %5 7
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %89
%89 = OpLabel
%27 = OpAccessChain %26 %25 %28
%29 = OpLoad %5 %27
%31 = OpUGreaterThan %30 %29 %32
OpSelectionMerge %93 None
OpBranchConditional %31 %90 %93
%90 = OpLabel
%36 = OpAccessChain %35 %8 %37
%38 = OpLoad %5 %36
%39 = OpIAdd %5 %38 %40
%34 = OpAccessChain %33 %22 %39
%41 = OpLoad %19 %34
%43 = OpCompositeConstruct %13 %29 %28
%45 = OpCompositeConstruct %44 %42 %42 %42 %42
OpImageWrite %41 %43 %45
%46 = OpUGreaterThan %30 %29 %47
OpSelectionMerge %92 None
OpBranchConditional %46 %91 %92
%91 = OpLabel
%79 = OpBitwiseAnd %5 %29 %74
%80 = OpIAdd %5 %79 %81
%83 = OpAccessChain %35 %8 %37
%84 = OpLoad %5 %83
%85 = OpIAdd %5 %84 %80
%82 = OpAccessChain %33 %22 %85
%86 = OpLoad %19 %82
%87 = OpCompositeConstruct %13 %28 %29
%88 = OpCompositeConstruct %44 %42 %42 %42 %42
OpImageWrite %86 %87 %88
OpBranch %92
%92 = OpLabel
OpBranch %93
%93 = OpLabel
%50 = OpAccessChain %35 %8 %51
%52 = OpLoad %5 %50
%49 = OpAccessChain %48 %12 %52
%53 = OpLoad %9 %49
%56 = OpAccessChain %35 %8 %51
%57 = OpLoad %5 %56
%55 = OpAccessChain %54 %17 %28 %57
%58 = OpLoad %13 %55
%78 = OpFunctionCall %5 %63 %58 %74 %28
OpReturn
OpFunctionEnd
%63 = OpFunction %5 None %59
%60 = OpFunctionParameter %13
%61 = OpFunctionParameter %5
%62 = OpFunctionParameter %5
%64 = OpLabel
%69 = OpINotEqual %67 %60 %68
%70 = OpAny %30 %69
OpSelectionMerge %66 None
OpBranchConditional %70 %65 %66
%65 = OpLabel
%72 = OpBitcast %71 %60
%73 = OpAtomicIAdd %5 %72 %74 %28 %61
%75 = OpIAdd %5 %73 %62
OpBranch %66
%66 = OpLabel
%76 = OpPhi %5 %28 %64 %75 %65
OpReturnValue %76
OpFunctionEnd
#endif
