#version 460
#extension GL_EXT_mesh_shader : require
#extension GL_KHR_shader_subgroup_basic : require
#extension GL_KHR_shader_subgroup_ballot : require
layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) in;
layout(max_vertices = 24, max_primitives = 8, triangles) out;

struct _36
{
    float _m0;
};

layout(location = 1) out vec4 B[24];
layout(location = 3) perprimitiveEXT out vec4 C[8];
shared float _32[64];
taskPayloadSharedEXT _36 _38;

void main()
{
    _32[gl_LocalInvocationIndex] = float(gl_LocalInvocationIndex);
    barrier();
    SetMeshOutputsEXT(24u, 8u);
    if ((gl_NumSubgroups == 1u) && ((subgroupBroadcastFirst(24u) == 0u) || (subgroupBroadcastFirst(8u) == 0u)))
    {
        return;
    }
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.x = _32[gl_LocalInvocationIndex];
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.y = _32[gl_LocalInvocationIndex];
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.z = _32[gl_LocalInvocationIndex];
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.w = _32[gl_LocalInvocationIndex];
    float _68 = _38._m0 + _32[gl_LocalInvocationIndex ^ 1u];
    B[gl_LocalInvocationIndex].x = _68;
    B[gl_LocalInvocationIndex].y = _68;
    B[gl_LocalInvocationIndex].z = _68;
    B[gl_LocalInvocationIndex].w = _68;
    if (gl_LocalInvocationIndex < 8u)
    {
        uint _74 = gl_LocalInvocationIndex * 3u;
        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex] = uvec3(_74, _74 + 1u, _74 + 2u);
        gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_CullPrimitiveEXT = (gl_LocalInvocationIndex & 1u) != 0u;
        gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_PrimitiveID = int(gl_LocalInvocationIndex);
        gl_MeshPrimitivesEXT[gl_LocalInvocationIndex].gl_Layer = int(gl_LocalInvocationIndex);
        uint _87 = gl_LocalInvocationIndex ^ 2u;
        C[gl_LocalInvocationIndex].x = _32[_87];
        C[gl_LocalInvocationIndex].y = _32[_87];
        C[gl_LocalInvocationIndex].z = _32[_87];
        C[gl_LocalInvocationIndex].w = _32[_87];
    }
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.4
; Generator: Unknown(30017); 21022
; Bound: 101
; Schema: 0
OpCapability Shader
OpCapability Geometry
OpCapability GroupNonUniform
OpCapability GroupNonUniformBallot
OpCapability ShaderViewportIndexLayerEXT
OpCapability MeshShadingEXT
OpExtension "SPV_EXT_mesh_shader"
OpExtension "SPV_EXT_shader_viewport_index_layer"
OpMemoryModel Logical GLSL450
OpEntryPoint MeshEXT %3 "main" %11 %12 %17 %20 %21 %24 %28 %32 %34 %38 %44
OpExecutionMode %3 OutputVertices 24
OpExecutionMode %3 OutputPrimitivesEXT 8
OpExecutionMode %3 OutputTrianglesEXT
OpExecutionMode %3 LocalSize 2 3 4
OpName %3 "main"
OpName %11 "SV_Position"
OpName %12 "B"
OpName %17 "SV_CullPrimitive"
OpName %20 "SV_RenderTargetArrayIndex"
OpName %21 "SV_PrimitiveID"
OpName %24 "C"
OpName %28 "indices"
OpName %36 ""
OpDecorate %11 BuiltIn Position
OpDecorate %12 Location 1
OpDecorate %17 BuiltIn CullPrimitiveEXT
OpDecorate %17 PerPrimitiveEXT
OpDecorate %20 BuiltIn Layer
OpDecorate %20 PerPrimitiveEXT
OpDecorate %21 BuiltIn PrimitiveId
OpDecorate %21 PerPrimitiveEXT
OpDecorate %24 Location 3
OpDecorate %24 PerPrimitiveEXT
OpDecorate %28 BuiltIn PrimitiveTriangleIndicesEXT
OpDecorate %34 BuiltIn LocalInvocationIndex
OpDecorate %44 BuiltIn NumSubgroups
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeFloat 32
%6 = OpTypeVector %5 4
%7 = OpTypeInt 32 0
%8 = OpConstant %7 24
%9 = OpTypeArray %6 %8
%10 = OpTypePointer Output %9
%11 = OpVariable %10 Output
%12 = OpVariable %10 Output
%13 = OpTypeBool
%14 = OpConstant %7 8
%15 = OpTypeArray %13 %14
%16 = OpTypePointer Output %15
%17 = OpVariable %16 Output
%18 = OpTypeArray %7 %14
%19 = OpTypePointer Output %18
%20 = OpVariable %19 Output
%21 = OpVariable %19 Output
%22 = OpTypeArray %6 %14
%23 = OpTypePointer Output %22
%24 = OpVariable %23 Output
%25 = OpTypeVector %7 3
%26 = OpTypeArray %25 %14
%27 = OpTypePointer Output %26
%28 = OpVariable %27 Output
%29 = OpConstant %7 64
%30 = OpTypeArray %5 %29
%31 = OpTypePointer Workgroup %30
%32 = OpVariable %31 Workgroup
%33 = OpTypePointer Input %7
%34 = OpVariable %33 Input
%36 = OpTypeStruct %5
%37 = OpTypePointer TaskPayloadWorkgroupEXT %36
%38 = OpVariable %37 TaskPayloadWorkgroupEXT
%40 = OpTypePointer Workgroup %5
%42 = OpConstant %7 2
%43 = OpConstant %7 264
%44 = OpVariable %33 Input
%47 = OpConstant %7 1
%49 = OpConstant %7 3
%52 = OpConstant %7 0
%57 = OpTypePointer Output %5
%65 = OpTypePointer TaskPayloadWorkgroupEXT %5
%78 = OpTypePointer Output %25
%82 = OpTypePointer Output %13
%84 = OpTypePointer Output %7
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %94
%94 = OpLabel
%35 = OpLoad %7 %34
%39 = OpConvertUToF %5 %35
%41 = OpAccessChain %40 %32 %35
OpStore %41 %39
OpControlBarrier %42 %42 %43
OpSetMeshOutputsEXT %8 %14
%45 = OpLoad %7 %44
%46 = OpIEqual %13 %45 %47
%48 = OpGroupNonUniformBroadcastFirst %7 %49 %8
%50 = OpGroupNonUniformBroadcastFirst %7 %49 %14
%51 = OpIEqual %13 %48 %52
%53 = OpIEqual %13 %50 %52
%54 = OpLogicalOr %13 %51 %53
%55 = OpLogicalAnd %13 %46 %54
OpSelectionMerge %98 None
OpBranchConditional %55 %97 %98
%97 = OpLabel
OpReturn
%98 = OpLabel
%56 = OpLoad %5 %41
%58 = OpAccessChain %57 %11 %35 %52
OpStore %58 %56
%59 = OpAccessChain %57 %11 %35 %47
OpStore %59 %56
%60 = OpAccessChain %57 %11 %35 %42
OpStore %60 %56
%61 = OpAccessChain %57 %11 %35 %49
OpStore %61 %56
%62 = OpBitwiseXor %7 %35 %47
%63 = OpAccessChain %40 %32 %62
%64 = OpLoad %5 %63
%66 = OpInBoundsAccessChain %65 %38 %52
%67 = OpLoad %5 %66
%68 = OpFAdd %5 %67 %64
%69 = OpAccessChain %57 %12 %35 %52
OpStore %69 %68
%70 = OpAccessChain %57 %12 %35 %47
OpStore %70 %68
%71 = OpAccessChain %57 %12 %35 %42
OpStore %71 %68
%72 = OpAccessChain %57 %12 %35 %49
OpStore %72 %68
%73 = OpULessThan %13 %35 %14
OpSelectionMerge %96 None
OpBranchConditional %73 %95 %96
%95 = OpLabel
%74 = OpIMul %7 %35 %49
%75 = OpIAdd %7 %74 %47
%76 = OpIAdd %7 %74 %42
%77 = OpCompositeConstruct %25 %74 %75 %76
%79 = OpAccessChain %78 %28 %35
OpStore %79 %77
%80 = OpBitwiseAnd %7 %35 %47
%81 = OpINotEqual %13 %80 %52
%83 = OpAccessChain %82 %17 %35
OpStore %83 %81
%85 = OpAccessChain %84 %21 %35
OpStore %85 %35
%86 = OpAccessChain %84 %20 %35
OpStore %86 %35
%87 = OpBitwiseXor %7 %35 %42
%88 = OpAccessChain %40 %32 %87
%89 = OpLoad %5 %88
%90 = OpAccessChain %57 %24 %35 %52
OpStore %90 %89
%91 = OpAccessChain %57 %24 %35 %47
OpStore %91 %89
%92 = OpAccessChain %57 %24 %35 %42
OpStore %92 %89
%93 = OpAccessChain %57 %24 %35 %49
OpStore %93 %89
OpBranch %96
%96 = OpLabel
OpReturn
OpFunctionEnd
#endif
