1#pragma clang diagnostic ignored "-Wmissing-prototypes"
2#pragma clang diagnostic ignored "-Wmissing-braces"
3
4#include <metal_stdlib>
5#include <simd/simd.h>
6
7using namespace metal;
8
9template<typename T, size_t Num>
10struct spvUnsafeArray
11{
12    T elements[Num ? Num : 1];
13
14    thread T& operator [] (size_t pos) thread
15    {
16        return elements[pos];
17    }
18    constexpr const thread T& operator [] (size_t pos) const thread
19    {
20        return elements[pos];
21    }
22
23    device T& operator [] (size_t pos) device
24    {
25        return elements[pos];
26    }
27    constexpr const device T& operator [] (size_t pos) const device
28    {
29        return elements[pos];
30    }
31
32    constexpr const constant T& operator [] (size_t pos) const constant
33    {
34        return elements[pos];
35    }
36
37    threadgroup T& operator [] (size_t pos) threadgroup
38    {
39        return elements[pos];
40    }
41    constexpr const threadgroup T& operator [] (size_t pos) const threadgroup
42    {
43        return elements[pos];
44    }
45};
46
47struct main0_out
48{
49    float4 vOutputs;
50};
51
52struct main0_in
53{
54    float4 vInputs [[attribute(0)]];
55};
56
57kernel void main0(main0_in in [[stage_in]], uint gl_InvocationID [[thread_index_in_threadgroup]], uint gl_PrimitiveID [[threadgroup_position_in_grid]], device main0_out* spvOut [[buffer(28)]], constant uint* spvIndirectParams [[buffer(29)]], device MTLQuadTessellationFactorsHalf* spvTessLevel [[buffer(26)]], threadgroup main0_in* gl_in [[threadgroup(0)]])
58{
59    device main0_out* gl_out = &spvOut[gl_PrimitiveID * 4];
60    if (gl_InvocationID < spvIndirectParams[0])
61        gl_in[gl_InvocationID] = in;
62    threadgroup_barrier(mem_flags::mem_threadgroup);
63    if (gl_InvocationID >= 4)
64        return;
65    spvUnsafeArray<float4, 32> _15 = spvUnsafeArray<float4, 32>({ gl_in[0].vInputs, gl_in[1].vInputs, gl_in[2].vInputs, gl_in[3].vInputs, gl_in[4].vInputs, gl_in[5].vInputs, gl_in[6].vInputs, gl_in[7].vInputs, gl_in[8].vInputs, gl_in[9].vInputs, gl_in[10].vInputs, gl_in[11].vInputs, gl_in[12].vInputs, gl_in[13].vInputs, gl_in[14].vInputs, gl_in[15].vInputs, gl_in[16].vInputs, gl_in[17].vInputs, gl_in[18].vInputs, gl_in[19].vInputs, gl_in[20].vInputs, gl_in[21].vInputs, gl_in[22].vInputs, gl_in[23].vInputs, gl_in[24].vInputs, gl_in[25].vInputs, gl_in[26].vInputs, gl_in[27].vInputs, gl_in[28].vInputs, gl_in[29].vInputs, gl_in[30].vInputs, gl_in[31].vInputs });
66    spvUnsafeArray<float4, 32> tmp;
67    tmp = _15;
68    gl_out[gl_InvocationID].vOutputs = tmp[gl_InvocationID];
69}
70
71