#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;

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;
    }
    float _45 = float(gl_LocalInvocationIndex + bitfieldExtract(ViewInstancingOffsets.ViewID_Layer, int(0u), int(16u)));
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.x = _45;
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.y = _45;
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.z = _45;
    gl_MeshVerticesEXT[gl_LocalInvocationIndex].gl_Position.w = _45;
    B[gl_LocalInvocationIndex] = float(gl_LocalInvocationIndex ^ 1u);
    if (gl_LocalInvocationIndex < 8u)
    {
        uint _56 = gl_LocalInvocationIndex * 3u;
        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex] = uvec3(_56, _56 + 1u, _56 + 2u);
    }
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.4
; Generator: Unknown(30017); 21022
; Bound: 69
; Schema: 0
OpCapability Shader
OpCapability GroupNonUniform
OpCapability GroupNonUniformBallot
OpCapability MeshShadingEXT
OpExtension "SPV_EXT_mesh_shader"
OpMemoryModel Logical GLSL450
OpEntryPoint MeshEXT %3 "main" %11 %14 %19 %22 %30 %32
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 %14 "B"
OpName %19 "indices"
OpName %20 "ViewInstancingOffsetsUBO"
OpMemberName %20 0 "ViewID_Layer"
OpName %22 "ViewInstancingOffsets"
OpDecorate %11 BuiltIn Position
OpDecorate %14 Location 1
OpDecorate %19 BuiltIn PrimitiveTriangleIndicesEXT
OpDecorate %20 Block
OpMemberDecorate %20 0 Offset 0
OpDecorate %22 DescriptorSet 10
OpDecorate %22 Binding 22
OpDecorate %30 BuiltIn LocalInvocationIndex
OpDecorate %32 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 = 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 = OpTypeStruct %7
%21 = OpTypePointer Uniform %20
%22 = OpVariable %21 Uniform
%23 = OpTypePointer Uniform %7
%25 = OpConstant %7 0
%28 = OpConstant %7 16
%29 = OpTypePointer Input %7
%30 = OpVariable %29 Input
%32 = OpVariable %29 Input
%34 = OpTypeBool
%36 = OpConstant %7 1
%38 = OpConstant %7 3
%46 = OpTypePointer Output %5
%50 = OpConstant %7 2
%60 = OpTypePointer Output %16
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %62
%62 = OpLabel
%24 = OpAccessChain %23 %22 %25
%26 = OpLoad %7 %24
%27 = OpBitFieldUExtract %7 %26 %25 %28
%31 = OpLoad %7 %30
OpSetMeshOutputsEXT %8 %15
%33 = OpLoad %7 %32
%35 = OpIEqual %34 %33 %36
%37 = OpGroupNonUniformBroadcastFirst %7 %38 %8
%39 = OpGroupNonUniformBroadcastFirst %7 %38 %15
%40 = OpIEqual %34 %37 %25
%41 = OpIEqual %34 %39 %25
%42 = OpLogicalOr %34 %40 %41
%43 = OpLogicalAnd %34 %35 %42
OpSelectionMerge %66 None
OpBranchConditional %43 %65 %66
%65 = OpLabel
OpReturn
%66 = OpLabel
%44 = OpIAdd %7 %31 %27
%45 = OpConvertUToF %5 %44
%47 = OpAccessChain %46 %11 %31 %25
OpStore %47 %45
%48 = OpAccessChain %46 %11 %31 %36
OpStore %48 %45
%49 = OpAccessChain %46 %11 %31 %50
OpStore %49 %45
%51 = OpAccessChain %46 %11 %31 %38
OpStore %51 %45
%52 = OpBitwiseXor %7 %31 %36
%53 = OpConvertUToF %5 %52
%54 = OpAccessChain %46 %14 %31
OpStore %54 %53
%55 = OpULessThan %34 %31 %15
OpSelectionMerge %64 None
OpBranchConditional %55 %63 %64
%63 = OpLabel
%56 = OpIMul %7 %31 %38
%57 = OpIAdd %7 %56 %36
%58 = OpIAdd %7 %56 %50
%59 = OpCompositeConstruct %16 %56 %57 %58
%61 = OpAccessChain %60 %19 %31
OpStore %61 %59
OpBranch %64
%64 = OpLabel
OpReturn
OpFunctionEnd
#endif
