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

layout(set = 1, binding = 0, std430) restrict readonly buffer SSBO
{
    uint _m0[];
} _13[];

layout(set = 1, binding = 0, std430) restrict readonly buffer _16_19
{
    uvec4 _m0[];
} _19[];

layout(set = 4, binding = 0, std430) coherent buffer _21_24
{
    uvec4 _m0[];
} _24[];

layout(set = 4, binding = 0, std430) readonly buffer _26_29
{
    uvec4 _m0[];
} _29[];

layout(set = 4, binding = 0, std430) writeonly buffer _31_34
{
    uvec4 _m0[];
} _34[];

layout(set = 5, binding = 0, std140) uniform BindlessCBV
{
    vec4 _m0[4096];
} _42[];

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

void main()
{
    uint _65 = registers._m1 + 1u;
    _24[registers._m4]._m0[gl_LocalInvocationIndex] = uvec4(floatBitsToUint(0.0), floatBitsToUint(0.0), floatBitsToUint(0.0), floatBitsToUint(0.0));
    if (!(floatBitsToUint(_42[registers._m5]._m0[0u]).x == 0u))
    {
        uint _107 = 0u;
        uint _111;
        uint _114;
        bool _116;
        for (;;)
        {
            _111 = (_107 << 8u) + gl_LocalInvocationIndex;
            _114 = _13[registers._m1]._m0[_111];
            groupMemoryBarrier();
            barrier();
            _116 = _114 < 256u;
            if (_116)
            {
                vec4 _120 = uintBitsToFloat(_19[_65]._m0[_111]);
                vec4 _127 = uintBitsToFloat(_24[registers._m4]._m0[_114]);
                _24[registers._m4]._m0[_114] = uvec4(floatBitsToUint(_127.x + _120.x), floatBitsToUint(_127.y + _120.y), floatBitsToUint(_127.z + _120.z), floatBitsToUint(_127.w + _120.w));
            }
            uint _108 = _107 + 1u;
            if (_108 < floatBitsToUint(_42[registers._m5]._m0[0u]).x)
            {
                _107 = _108;
                continue;
            }
            else
            {
                break;
            }
        }
    }
    vec4 _96 = uintBitsToFloat(_29[registers._m4 + 1u]._m0[gl_LocalInvocationIndex]);
    _34[registers._m4 + 2u]._m0[gl_LocalInvocationIndex] = uvec4(floatBitsToUint(_96.x), floatBitsToUint(_96.y), floatBitsToUint(_96.z), floatBitsToUint(_96.w));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 157
; Schema: 0
OpCapability Shader
OpCapability RuntimeDescriptorArray
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_physical_storage_buffer"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint GLCompute %3 "main" %76
OpExecutionMode %3 LocalSize 256 1 1
OpName %3 "main"
OpName %6 "RootConstants"
OpName %8 "registers"
OpName %10 "SSBO"
OpName %16 "SSBO"
OpName %21 "SSBO"
OpName %26 "SSBO"
OpName %31 "SSBO"
OpName %39 "BindlessCBV"
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 %9 ArrayStride 4
OpMemberDecorate %10 0 Offset 0
OpDecorate %10 Block
OpDecorate %13 DescriptorSet 1
OpDecorate %13 Binding 0
OpDecorate %13 NonWritable
OpDecorate %13 Restrict
OpDecorate %15 ArrayStride 16
OpMemberDecorate %16 0 Offset 0
OpDecorate %16 Block
OpDecorate %19 DescriptorSet 1
OpDecorate %19 Binding 0
OpDecorate %19 NonWritable
OpDecorate %19 Restrict
OpDecorate %20 ArrayStride 16
OpMemberDecorate %21 0 Offset 0
OpDecorate %21 Block
OpDecorate %24 DescriptorSet 4
OpDecorate %24 Binding 0
OpDecorate %24 Coherent
OpDecorate %25 ArrayStride 16
OpMemberDecorate %26 0 Offset 0
OpDecorate %26 Block
OpDecorate %29 DescriptorSet 4
OpDecorate %29 Binding 0
OpDecorate %29 NonWritable
OpDecorate %30 ArrayStride 16
OpMemberDecorate %31 0 Offset 0
OpDecorate %31 Block
OpDecorate %34 DescriptorSet 4
OpDecorate %34 Binding 0
OpDecorate %34 NonReadable
OpDecorate %38 ArrayStride 16
OpDecorate %39 Block
OpMemberDecorate %39 0 Offset 0
OpDecorate %42 DescriptorSet 5
OpDecorate %42 Binding 0
OpDecorate %76 BuiltIn LocalInvocationIndex
%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 = OpTypeRuntimeArray %5
%10 = OpTypeStruct %9
%11 = OpTypeRuntimeArray %10
%12 = OpTypePointer StorageBuffer %11
%13 = OpVariable %12 StorageBuffer
%14 = OpTypeVector %5 4
%15 = OpTypeRuntimeArray %14
%16 = OpTypeStruct %15
%17 = OpTypeRuntimeArray %16
%18 = OpTypePointer StorageBuffer %17
%19 = OpVariable %18 StorageBuffer
%20 = OpTypeRuntimeArray %14
%21 = OpTypeStruct %20
%22 = OpTypeRuntimeArray %21
%23 = OpTypePointer StorageBuffer %22
%24 = OpVariable %23 StorageBuffer
%25 = OpTypeRuntimeArray %14
%26 = OpTypeStruct %25
%27 = OpTypeRuntimeArray %26
%28 = OpTypePointer StorageBuffer %27
%29 = OpVariable %28 StorageBuffer
%30 = OpTypeRuntimeArray %14
%31 = OpTypeStruct %30
%32 = OpTypeRuntimeArray %31
%33 = OpTypePointer StorageBuffer %32
%34 = OpVariable %33 StorageBuffer
%35 = OpTypeFloat 32
%36 = OpTypeVector %35 4
%37 = OpConstant %5 4096
%38 = OpTypeArray %36 %37
%39 = OpTypeStruct %38
%40 = OpTypeRuntimeArray %39
%41 = OpTypePointer Uniform %40
%42 = OpVariable %41 Uniform
%43 = OpTypePointer StorageBuffer %31
%45 = OpTypePointer PushConstant %5
%47 = OpConstant %5 4
%50 = OpConstant %5 2
%51 = OpTypePointer StorageBuffer %26
%56 = OpConstant %5 1
%57 = OpTypePointer StorageBuffer %21
%61 = OpTypePointer StorageBuffer %16
%66 = OpTypePointer StorageBuffer %10
%70 = OpTypePointer Uniform %39
%73 = OpConstant %5 5
%75 = OpTypePointer Input %5
%76 = OpVariable %75 Input
%78 = OpConstant %35 0
%84 = OpTypePointer StorageBuffer %14
%86 = OpConstant %5 0
%87 = OpTypePointer Uniform %36
%92 = OpTypeBool
%110 = OpConstant %5 8
%112 = OpTypePointer StorageBuffer %5
%115 = OpConstant %5 2120
%117 = OpConstant %5 256
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %147
%147 = OpLabel
%46 = OpAccessChain %45 %8 %47
%48 = OpLoad %5 %46
%49 = OpIAdd %5 %48 %50
%44 = OpAccessChain %43 %34 %49
%53 = OpAccessChain %45 %8 %47
%54 = OpLoad %5 %53
%55 = OpIAdd %5 %54 %56
%52 = OpAccessChain %51 %29 %55
%59 = OpAccessChain %45 %8 %47
%60 = OpLoad %5 %59
%58 = OpAccessChain %57 %24 %60
%63 = OpAccessChain %45 %8 %56
%64 = OpLoad %5 %63
%65 = OpIAdd %5 %64 %56
%62 = OpAccessChain %61 %19 %65
%68 = OpAccessChain %45 %8 %56
%69 = OpLoad %5 %68
%67 = OpAccessChain %66 %13 %69
%72 = OpAccessChain %45 %8 %73
%74 = OpLoad %5 %72
%71 = OpAccessChain %70 %42 %74
%77 = OpLoad %5 %76
%79 = OpBitcast %5 %78
%80 = OpBitcast %5 %78
%81 = OpBitcast %5 %78
%82 = OpBitcast %5 %78
%83 = OpCompositeConstruct %14 %79 %80 %81 %82
%85 = OpAccessChain %84 %58 %86 %77
OpStore %85 %83
%88 = OpAccessChain %87 %71 %86 %86
%89 = OpLoad %36 %88
%90 = OpBitcast %14 %89
%91 = OpCompositeExtract %5 %90 0
%93 = OpIEqual %92 %91 %86
OpSelectionMerge %155 None
OpBranchConditional %93 %155 %148
%148 = OpLabel
OpBranch %149
%149 = OpLabel
%107 = OpPhi %5 %86 %148 %108 %153
%109 = OpShiftLeftLogical %5 %107 %110
%111 = OpIAdd %5 %109 %77
%113 = OpAccessChain %112 %67 %86 %111
%114 = OpLoad %5 %113
OpControlBarrier %50 %50 %115
%116 = OpULessThan %92 %114 %117
OpLoopMerge %154 %153 None
OpBranch %150
%150 = OpLabel
OpSelectionMerge %152 None
OpBranchConditional %116 %151 %152
%151 = OpLabel
%118 = OpAccessChain %84 %62 %86 %111
%119 = OpLoad %14 %118
%120 = OpBitcast %36 %119
%121 = OpCompositeExtract %35 %120 0
%122 = OpCompositeExtract %35 %120 1
%123 = OpCompositeExtract %35 %120 2
%124 = OpCompositeExtract %35 %120 3
%125 = OpAccessChain %84 %58 %86 %114
%126 = OpLoad %14 %125
%127 = OpBitcast %36 %126
%128 = OpCompositeExtract %35 %127 0
%129 = OpCompositeExtract %35 %127 1
%130 = OpCompositeExtract %35 %127 2
%131 = OpCompositeExtract %35 %127 3
%132 = OpFAdd %35 %128 %121
%133 = OpFAdd %35 %129 %122
%134 = OpFAdd %35 %130 %123
%135 = OpFAdd %35 %131 %124
%136 = OpBitcast %5 %132
%137 = OpBitcast %5 %133
%138 = OpBitcast %5 %134
%139 = OpBitcast %5 %135
%140 = OpCompositeConstruct %14 %136 %137 %138 %139
%141 = OpAccessChain %84 %58 %86 %114
OpStore %141 %140
OpBranch %152
%152 = OpLabel
OpBranch %153
%153 = OpLabel
%108 = OpIAdd %5 %107 %56
%142 = OpAccessChain %87 %71 %86 %86
%143 = OpLoad %36 %142
%144 = OpBitcast %14 %143
%145 = OpCompositeExtract %5 %144 0
%146 = OpULessThan %92 %108 %145
OpBranchConditional %146 %149 %154
%154 = OpLabel
OpBranch %155
%155 = OpLabel
%94 = OpAccessChain %84 %52 %86 %77
%95 = OpLoad %14 %94
%96 = OpBitcast %36 %95
%97 = OpCompositeExtract %35 %96 0
%98 = OpCompositeExtract %35 %96 1
%99 = OpCompositeExtract %35 %96 2
%100 = OpCompositeExtract %35 %96 3
%101 = OpBitcast %5 %97
%102 = OpBitcast %5 %98
%103 = OpBitcast %5 %99
%104 = OpBitcast %5 %100
%105 = OpCompositeConstruct %14 %101 %102 %103 %104
%106 = OpAccessChain %84 %44 %86 %77
OpStore %106 %105
OpReturn
OpFunctionEnd
#endif
