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

layout(set = 15, binding = 0, std430) restrict readonly buffer SSBO_Offsets
{
    uvec2 _m0[];
} _13;

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

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

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 _30 = registers._m4 + 1u;
    uvec2 _38 = _13._m0[subgroupBroadcastFirst(_30)] >> uvec2(2u);
    uvec2 _48 = _13._m0[subgroupBroadcastFirst(registers._m4)] >> uvec2(2u);
    uint _55 = gl_GlobalInvocationID.x * 6u;
    uint _62 = (_55 < _48.y) ? (_55 + _48.x) : 1073741820u;
    uint _66 = _18[registers._m4]._m0[_62];
    uint _69 = _18[registers._m4]._m0[_62 + 1u];
    uint _72 = _18[registers._m4]._m0[_62 + 2u];
    vec3 _76 = uintBitsToFloat(uvec3(_66, _69, _72));
    uint _80 = gl_GlobalInvocationID.x * 6u;
    uint _85 = (_80 < _38.y) ? (_80 + _38.x) : 1073741820u;
    _23[_30]._m0[_85] = floatBitsToUint(_76.x);
    _23[_30]._m0[_85 + 1u] = floatBitsToUint(_76.y);
    _23[_30]._m0[_85 + 2u] = floatBitsToUint(_76.z);
    uint _95 = (gl_GlobalInvocationID.x * 6u) + 3u;
    uint _100 = (_95 < _48.y) ? (_95 + _48.x) : 1073741820u;
    uint _102 = _18[registers._m4]._m0[_100];
    uint _105 = _18[registers._m4]._m0[_100 + 1u];
    uint _108 = _18[registers._m4]._m0[_100 + 2u];
    vec3 _110 = uintBitsToFloat(uvec3(_102, _105, _108));
    uint _115 = (gl_GlobalInvocationID.x * 6u) + 3u;
    uint _120 = (_115 < _38.y) ? (_115 + _38.x) : 1073741820u;
    _23[_30]._m0[_120] = floatBitsToUint(_110.x);
    _23[_30]._m0[_120 + 1u] = floatBitsToUint(_110.y);
    _23[_30]._m0[_120 + 2u] = floatBitsToUint(_110.z);
}


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