#version 460
layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;

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

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

layout(set = 0, binding = 0, std430) buffer _16_18
{
    uvec4 _m0[];
} _18;

layout(set = 0, binding = 1, std430) readonly buffer _20_22
{
    uvec4 _m0[];
} _22;

layout(set = 0, binding = 2, std430) writeonly buffer _24_26
{
    uvec4 _m0[];
} _26;

layout(set = 0, binding = 0, std140) uniform _31_33
{
    vec4 _m0[1];
} _33;

void main()
{
    _18._m0[gl_LocalInvocationIndex] = uvec4(floatBitsToUint(0.0), floatBitsToUint(0.0), floatBitsToUint(0.0), floatBitsToUint(0.0));
    if (!(floatBitsToUint(_33._m0[0u]).x == 0u))
    {
        uint _66 = 0u;
        uint _70;
        uint _73;
        bool _76;
        for (;;)
        {
            _70 = (_66 << 8u) + gl_LocalInvocationIndex;
            _73 = _9._m0[_70];
            groupMemoryBarrier();
            barrier();
            _76 = _73 < 256u;
            if (_76)
            {
                vec4 _80 = uintBitsToFloat(_14._m0[_70]);
                vec4 _87 = uintBitsToFloat(_18._m0[_73]);
                _18._m0[_73] = uvec4(floatBitsToUint(_87.x + _80.x), floatBitsToUint(_87.y + _80.y), floatBitsToUint(_87.z + _80.z), floatBitsToUint(_87.w + _80.w));
            }
            uint _67 = _66 + 1u;
            if (_67 < floatBitsToUint(_33._m0[0u]).x)
            {
                _66 = _67;
                continue;
            }
            else
            {
                break;
            }
        }
    }
    vec4 _55 = uintBitsToFloat(_22._m0[gl_LocalInvocationIndex]);
    _26._m0[gl_LocalInvocationIndex] = uvec4(floatBitsToUint(_55.x), floatBitsToUint(_55.y), floatBitsToUint(_55.z), floatBitsToUint(_55.w));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.6
; Generator: Unknown(30017); 21022
; Bound: 117
; Schema: 0
OpCapability Shader
OpCapability VulkanMemoryModel
OpMemoryModel Logical Vulkan
OpEntryPoint GLCompute %3 "main" %9 %14 %18 %22 %26 %33 %35
OpExecutionMode %3 LocalSize 256 1 1
OpName %3 "main"
OpName %7 "SSBO"
OpName %12 "SSBO"
OpName %16 "SSBO"
OpName %20 "SSBO"
OpName %24 "SSBO"
OpName %31 ""
OpDecorate %6 ArrayStride 4
OpMemberDecorate %7 0 Offset 0
OpDecorate %7 Block
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 0
OpDecorate %9 NonWritable
OpDecorate %9 Restrict
OpDecorate %11 ArrayStride 16
OpMemberDecorate %12 0 Offset 0
OpDecorate %12 Block
OpDecorate %14 DescriptorSet 0
OpDecorate %14 Binding 1
OpDecorate %14 NonWritable
OpDecorate %14 Restrict
OpDecorate %15 ArrayStride 16
OpMemberDecorate %16 0 Offset 0
OpDecorate %16 Block
OpDecorate %18 DescriptorSet 0
OpDecorate %18 Binding 0
OpDecorate %19 ArrayStride 16
OpMemberDecorate %20 0 Offset 0
OpDecorate %20 Block
OpDecorate %22 DescriptorSet 0
OpDecorate %22 Binding 1
OpDecorate %22 NonWritable
OpDecorate %23 ArrayStride 16
OpMemberDecorate %24 0 Offset 0
OpDecorate %24 Block
OpDecorate %26 DescriptorSet 0
OpDecorate %26 Binding 2
OpDecorate %26 NonReadable
OpDecorate %30 ArrayStride 16
OpMemberDecorate %31 0 Offset 0
OpDecorate %31 Block
OpDecorate %33 DescriptorSet 0
OpDecorate %33 Binding 0
OpDecorate %35 BuiltIn LocalInvocationIndex
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeRuntimeArray %5
%7 = OpTypeStruct %6
%8 = OpTypePointer StorageBuffer %7
%9 = OpVariable %8 StorageBuffer
%10 = OpTypeVector %5 4
%11 = OpTypeRuntimeArray %10
%12 = OpTypeStruct %11
%13 = OpTypePointer StorageBuffer %12
%14 = OpVariable %13 StorageBuffer
%15 = OpTypeRuntimeArray %10
%16 = OpTypeStruct %15
%17 = OpTypePointer StorageBuffer %16
%18 = OpVariable %17 StorageBuffer
%19 = OpTypeRuntimeArray %10
%20 = OpTypeStruct %19
%21 = OpTypePointer StorageBuffer %20
%22 = OpVariable %21 StorageBuffer
%23 = OpTypeRuntimeArray %10
%24 = OpTypeStruct %23
%25 = OpTypePointer StorageBuffer %24
%26 = OpVariable %25 StorageBuffer
%27 = OpConstant %5 1
%28 = OpTypeFloat 32
%29 = OpTypeVector %28 4
%30 = OpTypeArray %29 %27
%31 = OpTypeStruct %30
%32 = OpTypePointer Uniform %31
%33 = OpVariable %32 Uniform
%34 = OpTypePointer Input %5
%35 = OpVariable %34 Input
%37 = OpConstant %28 0
%43 = OpTypePointer StorageBuffer %10
%45 = OpConstant %5 0
%46 = OpTypePointer Uniform %29
%51 = OpTypeBool
%69 = OpConstant %5 8
%71 = OpTypePointer StorageBuffer %5
%74 = OpConstant %5 2
%75 = OpConstant %5 26696
%77 = OpConstant %5 256
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %107
%107 = OpLabel
%36 = OpLoad %5 %35
%38 = OpBitcast %5 %37
%39 = OpBitcast %5 %37
%40 = OpBitcast %5 %37
%41 = OpBitcast %5 %37
%42 = OpCompositeConstruct %10 %38 %39 %40 %41
%44 = OpAccessChain %43 %18 %45 %36
OpStore %44 %42 NonPrivatePointer
%47 = OpAccessChain %46 %33 %45 %45
%48 = OpLoad %29 %47
%49 = OpBitcast %10 %48
%50 = OpCompositeExtract %5 %49 0
%52 = OpIEqual %51 %50 %45
OpSelectionMerge %115 None
OpBranchConditional %52 %115 %108
%108 = OpLabel
OpBranch %109
%109 = OpLabel
%66 = OpPhi %5 %45 %108 %67 %113
%68 = OpShiftLeftLogical %5 %66 %69
%70 = OpIAdd %5 %68 %36
%72 = OpAccessChain %71 %9 %45 %70
%73 = OpLoad %5 %72
OpControlBarrier %74 %74 %75
%76 = OpULessThan %51 %73 %77
OpLoopMerge %114 %113 None
OpBranch %110
%110 = OpLabel
OpSelectionMerge %112 None
OpBranchConditional %76 %111 %112
%111 = OpLabel
%78 = OpAccessChain %43 %14 %45 %70
%79 = OpLoad %10 %78
%80 = OpBitcast %29 %79
%81 = OpCompositeExtract %28 %80 0
%82 = OpCompositeExtract %28 %80 1
%83 = OpCompositeExtract %28 %80 2
%84 = OpCompositeExtract %28 %80 3
%85 = OpAccessChain %43 %18 %45 %73
%86 = OpLoad %10 %85 NonPrivatePointer
%87 = OpBitcast %29 %86
%88 = OpCompositeExtract %28 %87 0
%89 = OpCompositeExtract %28 %87 1
%90 = OpCompositeExtract %28 %87 2
%91 = OpCompositeExtract %28 %87 3
%92 = OpFAdd %28 %88 %81
%93 = OpFAdd %28 %89 %82
%94 = OpFAdd %28 %90 %83
%95 = OpFAdd %28 %91 %84
%96 = OpBitcast %5 %92
%97 = OpBitcast %5 %93
%98 = OpBitcast %5 %94
%99 = OpBitcast %5 %95
%100 = OpCompositeConstruct %10 %96 %97 %98 %99
%101 = OpAccessChain %43 %18 %45 %73
OpStore %101 %100 NonPrivatePointer
OpBranch %112
%112 = OpLabel
OpBranch %113
%113 = OpLabel
%67 = OpIAdd %5 %66 %27
%102 = OpAccessChain %46 %33 %45 %45
%103 = OpLoad %29 %102
%104 = OpBitcast %10 %103
%105 = OpCompositeExtract %5 %104 0
%106 = OpULessThan %51 %67 %105
OpBranchConditional %106 %109 %114
%114 = OpLabel
OpBranch %115
%115 = OpLabel
%53 = OpAccessChain %43 %22 %45 %36
%54 = OpLoad %10 %53 NonPrivatePointer
%55 = OpBitcast %29 %54
%56 = OpCompositeExtract %28 %55 0
%57 = OpCompositeExtract %28 %55 1
%58 = OpCompositeExtract %28 %55 2
%59 = OpCompositeExtract %28 %55 3
%60 = OpBitcast %5 %56
%61 = OpBitcast %5 %57
%62 = OpBitcast %5 %58
%63 = OpBitcast %5 %59
%64 = OpCompositeConstruct %10 %60 %61 %62 %63
%65 = OpAccessChain %43 %26 %45 %36
OpStore %65 %64 NonPrivatePointer
OpReturn
OpFunctionEnd
#endif
