#version 460
#extension GL_KHR_shader_subgroup_quad : require
layout(local_size_x = 16, local_size_y = 4, local_size_z = 1) in;

layout(set = 0, binding = 0, r32ui) uniform readonly uimageBuffer _8;
layout(set = 0, binding = 1, r32ui) uniform writeonly uimageBuffer _9;

bool QuadAny(bool _36)
{
    return ((subgroupQuadBroadcast(_36, 0u) || subgroupQuadBroadcast(_36, 1u)) || subgroupQuadBroadcast(_36, 2u)) || subgroupQuadBroadcast(_36, 3u);
}

bool QuadAll(bool _53)
{
    return ((subgroupQuadBroadcast(_53, 0u) && subgroupQuadBroadcast(_53, 1u)) && subgroupQuadBroadcast(_53, 2u)) && subgroupQuadBroadcast(_53, 3u);
}

void main()
{
    uint _28 = (gl_WorkGroupID.x * 8u) + ((gl_LocalInvocationID.x & 1u) | ((gl_LocalInvocationID.x >> 2u) << 1u));
    imageStore(_9, int(_28 * 2u), uvec4(uint(QuadAny(imageLoad(_8, int(_28)).x != 0u))));
    imageStore(_9, int((_28 * 2u) + 1u), uvec4(uint(QuadAll(imageLoad(_8, int(_28)).x != 0u))));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 78
; Schema: 0
OpCapability Shader
OpCapability ImageBuffer
OpCapability GroupNonUniformQuad
OpCapability ComputeDerivativeGroupLinearKHR
OpExtension "SPV_NV_compute_shader_derivatives"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %12 %21
OpExecutionMode %3 DerivativeGroupLinearKHR
OpExecutionMode %3 LocalSize 16 4 1
OpName %3 "main"
OpName %37 "QuadAny"
OpName %54 "QuadAll"
OpDecorate %8 DescriptorSet 0
OpDecorate %8 Binding 0
OpDecorate %8 NonWritable
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 1
OpDecorate %9 NonReadable
OpDecorate %12 BuiltIn LocalInvocationId
OpDecorate %21 BuiltIn WorkgroupId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeImage %5 Buffer 0 0 0 2 R32ui
%7 = OpTypePointer UniformConstant %6
%8 = OpVariable %7 UniformConstant
%9 = OpVariable %7 UniformConstant
%10 = OpTypeVector %5 3
%11 = OpTypePointer Input %10
%12 = OpVariable %11 Input
%16 = OpConstant %5 1
%18 = OpConstant %5 2
%21 = OpVariable %11 Input
%22 = OpTypePointer Input %5
%24 = OpConstant %5 0
%27 = OpConstant %5 8
%30 = OpTypeVector %5 4
%33 = OpTypeBool
%35 = OpTypeFunction %33 %33
%40 = OpConstant %5 3
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %76
%76 = OpLabel
%13 = OpLoad %10 %12
%14 = OpCompositeExtract %5 %13 0
%15 = OpBitwiseAnd %5 %14 %16
%17 = OpShiftRightLogical %5 %14 %18
%19 = OpShiftLeftLogical %5 %17 %16
%20 = OpBitwiseOr %5 %15 %19
%23 = OpAccessChain %22 %21 %24
%25 = OpLoad %5 %23
%26 = OpIMul %5 %25 %27
%28 = OpIAdd %5 %26 %20
%29 = OpLoad %6 %8
%31 = OpImageRead %30 %29 %28
%32 = OpCompositeExtract %5 %31 0
%34 = OpINotEqual %33 %32 %24
%48 = OpFunctionCall %33 %37 %34
%49 = OpLoad %6 %8
%50 = OpImageRead %30 %49 %28
%51 = OpCompositeExtract %5 %50 0
%52 = OpINotEqual %33 %51 %24
%64 = OpFunctionCall %33 %54 %52
%65 = OpSelect %5 %48 %16 %24
%66 = OpShiftLeftLogical %5 %28 %16
%67 = OpLoad %6 %9
%68 = OpIMul %5 %28 %18
%69 = OpCompositeConstruct %30 %65 %65 %65 %65
OpImageWrite %67 %68 %69
%70 = OpSelect %5 %64 %16 %24
%71 = OpBitwiseOr %5 %66 %16
%72 = OpLoad %6 %9
%73 = OpIMul %5 %28 %18
%74 = OpIAdd %5 %73 %16
%75 = OpCompositeConstruct %30 %70 %70 %70 %70
OpImageWrite %72 %74 %75
OpReturn
OpFunctionEnd
%37 = OpFunction %33 None %35
%36 = OpFunctionParameter %33
%38 = OpLabel
%39 = OpGroupNonUniformQuadBroadcast %33 %40 %36 %24
%41 = OpGroupNonUniformQuadBroadcast %33 %40 %36 %16
%42 = OpGroupNonUniformQuadBroadcast %33 %40 %36 %18
%43 = OpGroupNonUniformQuadBroadcast %33 %40 %36 %40
%44 = OpLogicalOr %33 %39 %41
%45 = OpLogicalOr %33 %44 %42
%46 = OpLogicalOr %33 %45 %43
OpReturnValue %46
OpFunctionEnd
%54 = OpFunction %33 None %35
%53 = OpFunctionParameter %33
%55 = OpLabel
%56 = OpGroupNonUniformQuadBroadcast %33 %40 %53 %24
%57 = OpGroupNonUniformQuadBroadcast %33 %40 %53 %16
%58 = OpGroupNonUniformQuadBroadcast %33 %40 %53 %18
%59 = OpGroupNonUniformQuadBroadcast %33 %40 %53 %40
%60 = OpLogicalAnd %33 %56 %57
%61 = OpLogicalAnd %33 %60 %58
%62 = OpLogicalAnd %33 %61 %59
OpReturnValue %62
OpFunctionEnd
#endif
