#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 = 64, 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;
    uint _m8;
    uint _m9;
    uint _m10;
    uint _m11;
    uint _m12;
    uint _m13;
    uint _m14;
    uint _m15;
} registers;

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

uint RobustPhysicalAtomicCounter(uvec2 _45, uint _46, uint _47)
{
    uint _62;
    if (any(notEqual(_45, uvec2(0u))))
    {
        uint _59 = atomicAdd(uintPointer(_45).value, _46);
        _62 = _59 + _47;
    }
    else
    {
        _62 = 0u;
    }
    return _62;
}

void main()
{
    uint _25 = gl_GlobalInvocationID.x + 2u;
    uvec2 _43 = _17.counters[(4u * (registers._m4 + _25)) + 3u];
    uint _64 = RobustPhysicalAtomicCounter(_43, 1u, 0u);
    uint _66 = (gl_GlobalInvocationID.x ^ 1u) + 2u;
    uvec2 _78 = _17.counters[(4u * (registers._m4 + _66)) + 3u];
    uint _79 = RobustPhysicalAtomicCounter(_78, 1u, 0u);
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 82
; Schema: 0
OpCapability Shader
OpCapability ImageBuffer
OpCapability RuntimeDescriptorArray
OpCapability StorageTexelBufferArrayDynamicIndexing
OpCapability StorageTexelBufferArrayNonUniformIndexing
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_physical_storage_buffer"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint GLCompute %3 "main" %20
OpExecutionMode %3 LocalSize 64 1 1
OpName %3 "main"
OpName %6 "RootConstants"
OpName %8 "registers"
OpName %15 "AtomicCounters"
OpMemberName %15 0 "counters"
OpName %48 "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
OpMemberDecorate %6 8 Offset 32
OpMemberDecorate %6 9 Offset 36
OpMemberDecorate %6 10 Offset 40
OpMemberDecorate %6 11 Offset 44
OpMemberDecorate %6 12 Offset 48
OpMemberDecorate %6 13 Offset 52
OpMemberDecorate %6 14 Offset 56
OpMemberDecorate %6 15 Offset 60
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 %20 BuiltIn GlobalInvocationId
OpDecorate %33 NonUniform
OpDecorate %34 NonUniform
OpDecorate %70 NonUniform
OpDecorate %71 NonUniform
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeStruct %5 %5 %5 %5 %5 %5 %5 %5 %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 = OpTypeVector %5 3
%19 = OpTypePointer Input %18
%20 = OpVariable %19 Input
%21 = OpTypePointer Input %5
%23 = OpConstant %5 0
%26 = OpConstant %5 2
%27 = OpTypePointer UniformConstant %9
%29 = OpTypePointer PushConstant %5
%31 = OpConstant %5 4
%35 = OpTypePointer StorageBuffer %13
%42 = OpConstant %5 3
%44 = OpTypeFunction %5 %13 %5 %5
%52 = OpTypeBool
%53 = OpTypeVector %52 2
%54 = OpConstantNull %13
%57 = OpTypePointer PhysicalStorageBuffer %5
%60 = OpConstant %5 1
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %80
%80 = OpLabel
%22 = OpAccessChain %21 %20 %23
%24 = OpLoad %5 %22
%25 = OpIAdd %5 %24 %26
%30 = OpAccessChain %29 %8 %31
%32 = OpLoad %5 %30
%33 = OpIAdd %5 %32 %25
%28 = OpAccessChain %27 %12 %33
%34 = OpLoad %9 %28
%37 = OpAccessChain %29 %8 %31
%38 = OpLoad %5 %37
%39 = OpIAdd %5 %38 %25
%40 = OpIMul %5 %31 %39
%41 = OpIAdd %5 %40 %42
%36 = OpAccessChain %35 %17 %23 %41
%43 = OpLoad %13 %36
%64 = OpFunctionCall %5 %48 %43 %60 %23
%65 = OpBitwiseXor %5 %24 %60
%66 = OpIAdd %5 %65 %26
%68 = OpAccessChain %29 %8 %31
%69 = OpLoad %5 %68
%70 = OpIAdd %5 %69 %66
%67 = OpAccessChain %27 %12 %70
%71 = OpLoad %9 %67
%73 = OpAccessChain %29 %8 %31
%74 = OpLoad %5 %73
%75 = OpIAdd %5 %74 %66
%76 = OpIMul %5 %31 %75
%77 = OpIAdd %5 %76 %42
%72 = OpAccessChain %35 %17 %23 %77
%78 = OpLoad %13 %72
%79 = OpFunctionCall %5 %48 %78 %60 %23
OpReturn
OpFunctionEnd
%48 = OpFunction %5 None %44
%45 = OpFunctionParameter %13
%46 = OpFunctionParameter %5
%47 = OpFunctionParameter %5
%49 = OpLabel
%55 = OpINotEqual %53 %45 %54
%56 = OpAny %52 %55
OpSelectionMerge %51 None
OpBranchConditional %56 %50 %51
%50 = OpLabel
%58 = OpBitcast %57 %45
%59 = OpAtomicIAdd %5 %58 %60 %23 %46
%61 = OpIAdd %5 %59 %47
OpBranch %51
%51 = OpLabel
%62 = OpPhi %5 %23 %49 %61 %50
OpReturnValue %62
OpFunctionEnd
#endif
