#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;

struct DescriptorHeapRawPayload
{
    uvec2 _m0[1];
};

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

layout(set = 0, binding = 0, std430) buffer DescriptorHeapRobustnessSSBO
{
    DescriptorHeapRawPayload descriptors[];
} DescriptorHeapRobustness;

layout(set = 4, binding = 0, std430) buffer SSBO
{
    uint _m0[];
} _23[];

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

layout(set = 0, binding = 2, std430) buffer BloomBufferInvocationSSBO
{
    uint atomics[];
} BloomBufferInvocation;

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

uint InvocationID;

uint AllocateInvocationID()
{
    uint _40 = atomicAdd(BloomBufferInvocation.atomics[uint(BloomBufferInvocation.atomics.length()) - 1u], 1103633207u);
    return _40;
}

uint RobustPhysicalAtomicCounter(uvec2 _74, uint _75, uint _76)
{
    uint _90;
    if (any(notEqual(_74, uvec2(0u))))
    {
        uint _88 = atomicAdd(uintPointer(_74).value, _75);
        _90 = _88 + _76;
    }
    else
    {
        _90 = 0u;
    }
    return _90;
}

void main()
{
    uint _43 = AllocateInvocationID();
    InvocationID = _43;
    uvec2 _61 = _27.counters[registers._m4];
    uint _69 = atomicAdd(_23[registers._m4]._m0[gl_GlobalInvocationID.x], 1u);
    uint _71 = atomicCompSwap(_23[registers._m4]._m0[gl_GlobalInvocationID.x], 1u, 2u);
    uint _92 = RobustPhysicalAtomicCounter(_61, 1u, 0u);
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 95
; Schema: 0
OpCapability Shader
OpCapability SignedZeroInfNanPreserve
OpCapability RuntimeDescriptorArray
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_float_controls"
OpExtension "SPV_KHR_physical_storage_buffer"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint GLCompute %3 "main" %64
OpExecutionMode %3 SignedZeroInfNanPreserve 32
OpExecutionMode %3 SignedZeroInfNanPreserve 64
OpExecutionMode %3 LocalSize 1 1 1
OpName %3 "main"
OpName %6 "RootConstants"
OpName %8 "registers"
OpName %12 "DescriptorHeapRawPayload"
OpName %14 "DescriptorHeapRobustnessSSBO"
OpMemberName %14 0 "descriptors"
OpName %16 "DescriptorHeapRobustness"
OpName %18 "InvocationID"
OpName %20 "SSBO"
OpName %25 "AtomicCounters"
OpMemberName %25 0 "counters"
OpName %29 "BloomBufferInvocationSSBO"
OpMemberName %29 0 "atomics"
OpName %31 "BloomBufferInvocation"
OpName %33 "AllocateInvocationID"
OpName %77 "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 %11 ArrayStride 8
OpMemberDecorate %12 0 Offset 0
OpDecorate %13 ArrayStride 8
OpDecorate %14 Block
OpMemberDecorate %14 0 Offset 0
OpDecorate %16 DescriptorSet 0
OpDecorate %16 Binding 0
OpDecorate %19 ArrayStride 4
OpMemberDecorate %20 0 Offset 0
OpDecorate %20 Block
OpDecorate %23 DescriptorSet 4
OpDecorate %23 Binding 0
OpDecorate %24 ArrayStride 8
OpDecorate %25 Block
OpMemberDecorate %25 0 Offset 0
OpMemberDecorate %25 0 NonWritable
OpDecorate %27 DescriptorSet 7
OpDecorate %27 Binding 0
OpDecorate %27 AliasedPointer
OpDecorate %28 ArrayStride 4
OpMemberDecorate %29 0 Offset 0
OpDecorate %29 Block
OpDecorate %31 DescriptorSet 0
OpDecorate %31 Binding 2
OpDecorate %64 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 = OpTypeVector %5 2
%10 = OpConstant %5 1
%11 = OpTypeArray %9 %10
%12 = OpTypeStruct %11
%13 = OpTypeRuntimeArray %12
%14 = OpTypeStruct %13
%15 = OpTypePointer StorageBuffer %14
%16 = OpVariable %15 StorageBuffer
%17 = OpTypePointer Private %5
%18 = OpVariable %17 Private
%19 = OpTypeRuntimeArray %5
%20 = OpTypeStruct %19
%21 = OpTypeRuntimeArray %20
%22 = OpTypePointer StorageBuffer %21
%23 = OpVariable %22 StorageBuffer
%24 = OpTypeRuntimeArray %9
%25 = OpTypeStruct %24
%26 = OpTypePointer StorageBuffer %25
%27 = OpVariable %26 StorageBuffer
%28 = OpTypeRuntimeArray %5
%29 = OpTypeStruct %28
%30 = OpTypePointer StorageBuffer %29
%31 = OpVariable %30 StorageBuffer
%32 = OpTypeFunction %5
%37 = OpTypePointer StorageBuffer %5
%39 = OpConstant %5 0
%41 = OpConstant %5 1103633207
%44 = OpTypePointer StorageBuffer %20
%46 = OpTypePointer PushConstant %5
%48 = OpConstant %5 4
%50 = OpTypePointer StorageBuffer %9
%55 = OpConstant %5 16
%62 = OpTypeVector %5 3
%63 = OpTypePointer Input %62
%64 = OpVariable %63 Input
%65 = OpTypePointer Input %5
%72 = OpConstant %5 2
%73 = OpTypeFunction %5 %9 %5 %5
%81 = OpTypeBool
%82 = OpTypeVector %81 2
%83 = OpConstantNull %9
%86 = OpTypePointer PhysicalStorageBuffer %5
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %93
%93 = OpLabel
%43 = OpFunctionCall %5 %33
OpStore %18 %43
%47 = OpAccessChain %46 %8 %48
%49 = OpLoad %5 %47
%51 = OpAccessChain %50 %16 %39 %49 %39 %39
%52 = OpLoad %9 %51
%53 = OpCompositeExtract %5 %52 1
%54 = OpShiftRightLogical %5 %53 %55
%45 = OpAccessChain %44 %23 %49
%56 = OpArrayLength %5 %45 0
%57 = OpIMul %5 %56 %48
%59 = OpAccessChain %46 %8 %48
%60 = OpLoad %5 %59
%58 = OpAccessChain %50 %27 %39 %60
%61 = OpLoad %9 %58
%66 = OpAccessChain %65 %64 %39
%67 = OpLoad %5 %66
%68 = OpAccessChain %37 %45 %39 %67
%69 = OpAtomicIAdd %5 %68 %10 %39 %10
%70 = OpAccessChain %37 %45 %39 %67
%71 = OpAtomicCompareExchange %5 %70 %10 %39 %39 %72 %10
%92 = OpFunctionCall %5 %77 %61 %10 %39
OpReturn
OpFunctionEnd
%33 = OpFunction %5 None %32
%34 = OpLabel
%35 = OpArrayLength %5 %31 0
%36 = OpISub %5 %35 %10
%38 = OpAccessChain %37 %31 %39 %36
%40 = OpAtomicIAdd %5 %38 %10 %39 %41
OpReturnValue %40
OpFunctionEnd
%77 = OpFunction %5 None %73
%74 = OpFunctionParameter %9
%75 = OpFunctionParameter %5
%76 = OpFunctionParameter %5
%78 = OpLabel
%84 = OpINotEqual %82 %74 %83
%85 = OpAny %81 %84
OpSelectionMerge %80 None
OpBranchConditional %85 %79 %80
%79 = OpLabel
%87 = OpBitcast %86 %74
%88 = OpAtomicIAdd %5 %87 %10 %39 %75
%89 = OpIAdd %5 %88 %76
OpBranch %80
%80 = OpLabel
%90 = OpPhi %5 %39 %78 %89 %79
OpReturnValue %90
OpFunctionEnd
#endif
