#version 460
#extension GL_KHR_shader_subgroup_quad : require
layout(local_size_x = 8, local_size_y = 8, 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 _24)
{
    return ((subgroupQuadBroadcast(_24, 0u) || subgroupQuadBroadcast(_24, 1u)) || subgroupQuadBroadcast(_24, 2u)) || subgroupQuadBroadcast(_24, 3u);
}

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

void main()
{
    imageStore(_9, int(gl_GlobalInvocationID.x * 2u), uvec4(uint(QuadAny(imageLoad(_8, int(gl_GlobalInvocationID.x)).x != 0u))));
    imageStore(_9, int((gl_GlobalInvocationID.x * 2u) + 1u), uvec4(uint(QuadAll(imageLoad(_8, int(gl_GlobalInvocationID.x)).x != 0u))));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 68
; Schema: 0
OpCapability Shader
OpCapability ImageBuffer
OpCapability GroupNonUniformQuad
OpCapability ComputeDerivativeGroupQuadsKHR
OpExtension "SPV_KHR_compute_shader_derivatives"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %12
OpExecutionMode %3 DerivativeGroupQuadsKHR
OpExecutionMode %3 LocalSize 8 8 1
OpName %3 "main"
OpName %25 "QuadAny"
OpName %44 "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 GlobalInvocationId
%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
%13 = OpTypePointer Input %5
%15 = OpConstant %5 0
%18 = OpTypeVector %5 4
%21 = OpTypeBool
%23 = OpTypeFunction %21 %21
%28 = OpConstant %5 3
%30 = OpConstant %5 1
%32 = OpConstant %5 2
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %66
%66 = OpLabel
%14 = OpAccessChain %13 %12 %15
%16 = OpLoad %5 %14
%17 = OpLoad %6 %8
%19 = OpImageRead %18 %17 %16
%20 = OpCompositeExtract %5 %19 0
%22 = OpINotEqual %21 %20 %15
%38 = OpFunctionCall %21 %25 %22
%39 = OpLoad %6 %8
%40 = OpImageRead %18 %39 %16
%41 = OpCompositeExtract %5 %40 0
%42 = OpINotEqual %21 %41 %15
%54 = OpFunctionCall %21 %44 %42
%55 = OpSelect %5 %38 %30 %15
%56 = OpShiftLeftLogical %5 %16 %30
%57 = OpLoad %6 %9
%58 = OpIMul %5 %16 %32
%59 = OpCompositeConstruct %18 %55 %55 %55 %55
OpImageWrite %57 %58 %59
%60 = OpSelect %5 %54 %30 %15
%61 = OpBitwiseOr %5 %56 %30
%62 = OpLoad %6 %9
%63 = OpIMul %5 %16 %32
%64 = OpIAdd %5 %63 %30
%65 = OpCompositeConstruct %18 %60 %60 %60 %60
OpImageWrite %62 %64 %65
OpReturn
OpFunctionEnd
%25 = OpFunction %21 None %23
%24 = OpFunctionParameter %21
%26 = OpLabel
%27 = OpGroupNonUniformQuadBroadcast %21 %28 %24 %15
%29 = OpGroupNonUniformQuadBroadcast %21 %28 %24 %30
%31 = OpGroupNonUniformQuadBroadcast %21 %28 %24 %32
%33 = OpGroupNonUniformQuadBroadcast %21 %28 %24 %28
%34 = OpLogicalOr %21 %27 %29
%35 = OpLogicalOr %21 %34 %31
%36 = OpLogicalOr %21 %35 %33
OpReturnValue %36
OpFunctionEnd
%44 = OpFunction %21 None %23
%43 = OpFunctionParameter %21
%45 = OpLabel
%46 = OpGroupNonUniformQuadBroadcast %21 %28 %43 %15
%47 = OpGroupNonUniformQuadBroadcast %21 %28 %43 %30
%48 = OpGroupNonUniformQuadBroadcast %21 %28 %43 %32
%49 = OpGroupNonUniformQuadBroadcast %21 %28 %43 %28
%50 = OpLogicalAnd %21 %46 %47
%51 = OpLogicalAnd %21 %50 %48
%52 = OpLogicalAnd %21 %51 %49
OpReturnValue %52
OpFunctionEnd
#endif
