#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 = 1) in;
layout(max_vertices = 24, max_primitives = 8, triangles) out;

layout(set = 10, binding = 22, std140) uniform ViewInstancingOffsetsUBO
{
    uint ViewID_Layer;
} ViewInstancingOffsets;

layout(location = 1) out float B[24];

void main()
{
    SetMeshOutputsEXT(24u, 8u);
    if ((gl_NumSubgroups == 1u) && ((subgroupBroadcastFirst(24u) == 0u) || (subgroupBroadcastFirst(8u) == 0u)))
    {
        return;
    }
    uint _42 = bitfieldExtract(ViewInstancingOffsets.ViewID_Layer, int(16u), int(16u));
    uint _48 = gl_LocalInvocationIndex + 0u;
    if (_48 < 8u)
    {
        gl_MeshPrimitivesEXT[_48].gl_Layer = int(_42);
    }
    uint _52 = gl_LocalInvocationIndex + 6u;
    if (_52 < 8u)
    {
        gl_MeshPrimitivesEXT[_52].gl_Layer = int(_42);
    }
    float _56 = float(gl_LocalInvocationIndex);
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.x = _56;
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.y = _56;
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.z = _56;
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.w = _56;
    B[gl_LocalInvocationIndex] = float(gl_LocalInvocationIndex ^ 1u);
    if (gl_LocalInvocationIndex < 8u)
    {
        uint _67 = gl_LocalInvocationIndex * 3u;
        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex] = uvec3(_67, _67 + 1u, _67 + 2u);
    }
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.4
; Generator: Unknown(30017); 21022
; Bound: 84
; 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 %14 %19 %21 %23 %38 %46
OpExecutionMode %3 OutputVertices 24
OpExecutionMode %3 OutputPrimitivesEXT 8
OpExecutionMode %3 OutputTrianglesEXT
OpExecutionMode %3 LocalSize 2 3 1
OpName %3 "main"
OpName %11 "SV_Position"
OpName %14 "B"
OpName %19 "indices"
OpName %36 "ViewInstancingOffsetsUBO"
OpMemberName %36 0 "ViewID_Layer"
OpName %38 "ViewInstancingOffsets"
OpDecorate %11 BuiltIn Position
OpDecorate %14 Location 1
OpDecorate %19 BuiltIn PrimitiveTriangleIndicesEXT
OpDecorate %21 BuiltIn LocalInvocationIndex
OpDecorate %23 BuiltIn NumSubgroups
OpDecorate %36 Block
OpMemberDecorate %36 0 Offset 0
OpDecorate %38 DescriptorSet 10
OpDecorate %38 Binding 22
OpDecorate %46 BuiltIn Layer
OpDecorate %46 PerPrimitiveEXT
%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 = OpTypeArray %5 %8
%13 = OpTypePointer Output %12
%14 = OpVariable %13 Output
%15 = OpConstant %7 8
%16 = OpTypeVector %7 3
%17 = OpTypeArray %16 %15
%18 = OpTypePointer Output %17
%19 = OpVariable %18 Output
%20 = OpTypePointer Input %7
%21 = OpVariable %20 Input
%23 = OpVariable %20 Input
%25 = OpTypeBool
%27 = OpConstant %7 1
%29 = OpConstant %7 3
%32 = OpConstant %7 0
%36 = OpTypeStruct %7
%37 = OpTypePointer Uniform %36
%38 = OpVariable %37 Uniform
%39 = OpTypePointer Uniform %7
%43 = OpConstant %7 16
%44 = OpTypeArray %7 %15
%45 = OpTypePointer Output %44
%46 = OpVariable %45 Output
%50 = OpTypePointer Output %7
%53 = OpConstant %7 6
%57 = OpTypePointer Output %5
%61 = OpConstant %7 2
%71 = OpTypePointer Output %16
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %73
%73 = OpLabel
%22 = OpLoad %7 %21
OpSetMeshOutputsEXT %8 %15
%24 = OpLoad %7 %23
%26 = OpIEqual %25 %24 %27
%28 = OpGroupNonUniformBroadcastFirst %7 %29 %8
%30 = OpGroupNonUniformBroadcastFirst %7 %29 %15
%31 = OpIEqual %25 %28 %32
%33 = OpIEqual %25 %30 %32
%34 = OpLogicalOr %25 %31 %33
%35 = OpLogicalAnd %25 %26 %34
OpSelectionMerge %77 None
OpBranchConditional %35 %76 %77
%76 = OpLabel
OpReturn
%77 = OpLabel
%40 = OpAccessChain %39 %38 %32
%41 = OpLoad %7 %40
%42 = OpBitFieldUExtract %7 %41 %43 %43
%47 = OpLoad %7 %21
%48 = OpIAdd %7 %47 %32
%49 = OpULessThan %25 %48 %15
%51 = OpAccessChain %50 %46 %48
OpSelectionMerge %80 None
OpBranchConditional %49 %79 %80
%79 = OpLabel
OpStore %51 %42
OpBranch %80
%80 = OpLabel
%52 = OpIAdd %7 %47 %53
%54 = OpULessThan %25 %52 %15
%55 = OpAccessChain %50 %46 %52
OpSelectionMerge %82 None
OpBranchConditional %54 %81 %82
%81 = OpLabel
OpStore %55 %42
OpBranch %82
%82 = OpLabel
%56 = OpConvertUToF %5 %22
%58 = OpAccessChain %57 %11 %22 %32
OpStore %58 %56
%59 = OpAccessChain %57 %11 %22 %27
OpStore %59 %56
%60 = OpAccessChain %57 %11 %22 %61
OpStore %60 %56
%62 = OpAccessChain %57 %11 %22 %29
OpStore %62 %56
%63 = OpBitwiseXor %7 %22 %27
%64 = OpConvertUToF %5 %63
%65 = OpAccessChain %57 %14 %22
OpStore %65 %64
%66 = OpULessThan %25 %22 %15
OpSelectionMerge %75 None
OpBranchConditional %66 %74 %75
%74 = OpLabel
%67 = OpIMul %7 %22 %29
%68 = OpIAdd %7 %67 %27
%69 = OpIAdd %7 %67 %61
%70 = OpCompositeConstruct %16 %67 %68 %69
%72 = OpAccessChain %71 %19 %22
OpStore %72 %70
OpBranch %75
%75 = OpLabel
OpReturn
OpFunctionEnd
#endif
