Merge pull request #2439 from KhronosGroup/fix-2261
[KhronosGroup/SPIRV-Cross.git] / reference / shaders-msl / tese / read-tess-level-in-func.msl2.tese
blob432ad7cc2d0c3c4fc88dc6a39151acc143be5f95
1 #pragma clang diagnostic ignored "-Wmissing-prototypes"
2 #pragma clang diagnostic ignored "-Wmissing-braces"
4 #include <metal_stdlib>
5 #include <simd/simd.h>
7 using namespace metal;
9 template<typename T, size_t Num>
10 struct spvUnsafeArray
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     }
47 struct main0_out
49     float4 gl_Position [[position]];
52 struct main0_patchIn
54     float4 gl_TessLevel [[attribute(0)]];
57 static inline __attribute__((always_inline))
58 float4 read_tess_levels(thread spvUnsafeArray<float, 4>& gl_TessLevelOuter, thread spvUnsafeArray<float, 2>& gl_TessLevelInner)
60     return float4(gl_TessLevelOuter[0], gl_TessLevelOuter[1], gl_TessLevelOuter[2], gl_TessLevelOuter[3]) + float2(gl_TessLevelInner[0], gl_TessLevelInner[1]).xyxy;
63 [[ patch(triangle, 0) ]] vertex main0_out main0(main0_patchIn patchIn [[stage_in]])
65     main0_out out = {};
66     spvUnsafeArray<float, 4> gl_TessLevelOuter = {};
67     spvUnsafeArray<float, 2> gl_TessLevelInner = {};
68     gl_TessLevelOuter[0] = patchIn.gl_TessLevel[0];
69     gl_TessLevelOuter[1] = patchIn.gl_TessLevel[1];
70     gl_TessLevelOuter[2] = patchIn.gl_TessLevel[2];
71     gl_TessLevelInner[0] = patchIn.gl_TessLevel[3];
72     out.gl_Position = read_tess_levels(gl_TessLevelOuter, gl_TessLevelInner);
73     return out;