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

layout(set = 0, binding = 0) uniform usamplerBuffer _8;
layout(set = 0, binding = 0, r32ui) uniform writeonly uimageBuffer _11;

uvec4 WaveMatch(uint _26)
{
    uvec4 _35;
    for (;;)
    {
        bool _34 = _26 == subgroupBroadcastFirst(_26);
        _35 = subgroupBallot(_34);
        if (_34)
        {
            break;
        }
        else
        {
            continue;
        }
    }
    return _35;
}

void main()
{
    uvec4 _37 = WaveMatch(texelFetch(_8, int(gl_GlobalInvocationID.x)).x);
    uvec4 _47 = WaveMatch(floatBitsToUint(uintBitsToFloat(texelFetch(_8, int(gl_GlobalInvocationID.x)).x)));
    uvec4 _64 = WaveMatch(floatBitsToUint(float(texelFetch(_8, int(gl_GlobalInvocationID.x)).x != 20u)));
    uint _73 = gl_GlobalInvocationID.x * 4u;
    imageStore(_11, int(_73), uvec4((_47.x | _37.x) | _64.x));
    imageStore(_11, int(_73 + 1u), uvec4((_47.y | _37.y) | _64.y));
    imageStore(_11, int(_73 + 2u), uvec4((_47.z | _37.z) | _64.z));
    imageStore(_11, int(_73 + 3u), uvec4((_47.w | _37.w) | _64.w));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 86
; Schema: 0
OpCapability Shader
OpCapability SampledBuffer
OpCapability ImageBuffer
OpCapability GroupNonUniform
OpCapability GroupNonUniformBallot
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %16
OpExecutionMode %3 LocalSize 64 1 1
OpName %3 "main"
OpName %27 "WaveMatch"
OpDecorate %8 DescriptorSet 0
OpDecorate %8 Binding 0
OpDecorate %11 DescriptorSet 0
OpDecorate %11 Binding 0
OpDecorate %11 NonReadable
OpDecorate %16 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeImage %5 Buffer 0 0 0 1 Unknown
%7 = OpTypePointer UniformConstant %6
%8 = OpVariable %7 UniformConstant
%9 = OpTypeImage %5 Buffer 0 0 0 2 R32ui
%10 = OpTypePointer UniformConstant %9
%11 = OpVariable %10 UniformConstant
%14 = OpTypeVector %5 3
%15 = OpTypePointer Input %14
%16 = OpVariable %15 Input
%17 = OpTypePointer Input %5
%19 = OpConstant %5 0
%21 = OpTypeVector %5 4
%24 = OpTypeBool
%25 = OpTypeFunction %21 %5
%33 = OpConstant %5 3
%44 = OpTypeFloat 32
%59 = OpConstant %5 20
%60 = OpConstant %44 0
%61 = OpConstant %44 1
%74 = OpConstant %5 4
%78 = OpConstant %5 1
%81 = OpConstant %5 2
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %84
%84 = OpLabel
%12 = OpLoad %9 %11
%13 = OpLoad %6 %8
%18 = OpAccessChain %17 %16 %19
%20 = OpLoad %5 %18
%22 = OpImageFetch %21 %13 %20
%23 = OpCompositeExtract %5 %22 0
%37 = OpFunctionCall %21 %27 %23
%38 = OpCompositeExtract %5 %37 0
%39 = OpCompositeExtract %5 %37 1
%40 = OpCompositeExtract %5 %37 2
%41 = OpCompositeExtract %5 %37 3
%42 = OpImageFetch %21 %13 %20
%43 = OpCompositeExtract %5 %42 0
%45 = OpBitcast %44 %43
%46 = OpBitcast %5 %45
%47 = OpFunctionCall %21 %27 %46
%48 = OpCompositeExtract %5 %47 0
%49 = OpCompositeExtract %5 %47 1
%50 = OpCompositeExtract %5 %47 2
%51 = OpCompositeExtract %5 %47 3
%52 = OpBitwiseOr %5 %48 %38
%53 = OpBitwiseOr %5 %49 %39
%54 = OpBitwiseOr %5 %50 %40
%55 = OpBitwiseOr %5 %51 %41
%56 = OpImageFetch %21 %13 %20
%57 = OpCompositeExtract %5 %56 0
%58 = OpINotEqual %24 %57 %59
%62 = OpSelect %44 %58 %61 %60
%63 = OpBitcast %5 %62
%64 = OpFunctionCall %21 %27 %63
%65 = OpCompositeExtract %5 %64 0
%66 = OpCompositeExtract %5 %64 1
%67 = OpCompositeExtract %5 %64 2
%68 = OpCompositeExtract %5 %64 3
%69 = OpBitwiseOr %5 %52 %65
%70 = OpBitwiseOr %5 %53 %66
%71 = OpBitwiseOr %5 %54 %67
%72 = OpBitwiseOr %5 %55 %68
%73 = OpIMul %5 %20 %74
%75 = OpCompositeConstruct %21 %69 %69 %69 %69
OpImageWrite %12 %73 %75
%76 = OpCompositeConstruct %21 %70 %70 %70 %70
%77 = OpIAdd %5 %73 %78
OpImageWrite %12 %77 %76
%79 = OpCompositeConstruct %21 %71 %71 %71 %71
%80 = OpIAdd %5 %73 %81
OpImageWrite %12 %80 %79
%82 = OpCompositeConstruct %21 %72 %72 %72 %72
%83 = OpIAdd %5 %73 %33
OpImageWrite %12 %83 %82
OpReturn
OpFunctionEnd
%27 = OpFunction %21 None %25
%26 = OpFunctionParameter %5
%28 = OpLabel
OpBranch %29
%29 = OpLabel
OpLoopMerge %31 %30 None
OpBranch %30
%30 = OpLabel
%32 = OpGroupNonUniformBroadcastFirst %5 %33 %26
%34 = OpIEqual %24 %26 %32
%35 = OpGroupNonUniformBallot %21 %33 %34
OpBranchConditional %34 %31 %29
%31 = OpLabel
OpReturnValue %35
OpFunctionEnd
#endif
