1#pragma clang diagnostic ignored "-Wmissing-prototypes"
2
3#include <metal_stdlib>
4#include <simd/simd.h>
5
6using namespace metal;
7
8struct spvDescriptorSetBuffer0
9{
10    array<texture2d<float>, 4> uSampler0 [[id(0)]];
11    array<sampler, 4> uSampler0Smplr [[id(4)]];
12    constant uint* spvSwizzleConstants [[id(8)]];
13};
14
15struct main0_out
16{
17    float4 FragColor [[color(0)]];
18};
19
20struct main0_in
21{
22    float2 vUV [[user(locn0)]];
23};
24
25template<typename T> struct spvRemoveReference { typedef T type; };
26template<typename T> struct spvRemoveReference<thread T&> { typedef T type; };
27template<typename T> struct spvRemoveReference<thread T&&> { typedef T type; };
28template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type& x)
29{
30    return static_cast<thread T&&>(x);
31}
32template<typename T> inline constexpr thread T&& spvForward(thread typename spvRemoveReference<T>::type&& x)
33{
34    return static_cast<thread T&&>(x);
35}
36
37enum class spvSwizzle : uint
38{
39    none = 0,
40    zero,
41    one,
42    red,
43    green,
44    blue,
45    alpha
46};
47
48template<typename T>
49inline T spvGetSwizzle(vec<T, 4> x, T c, spvSwizzle s)
50{
51    switch (s)
52    {
53        case spvSwizzle::none:
54            return c;
55        case spvSwizzle::zero:
56            return 0;
57        case spvSwizzle::one:
58            return 1;
59        case spvSwizzle::red:
60            return x.r;
61        case spvSwizzle::green:
62            return x.g;
63        case spvSwizzle::blue:
64            return x.b;
65        case spvSwizzle::alpha:
66            return x.a;
67    }
68}
69
70// Wrapper function that swizzles texture samples and fetches.
71template<typename T>
72inline vec<T, 4> spvTextureSwizzle(vec<T, 4> x, uint s)
73{
74    if (!s)
75        return x;
76    return vec<T, 4>(spvGetSwizzle(x, x.r, spvSwizzle((s >> 0) & 0xFF)), spvGetSwizzle(x, x.g, spvSwizzle((s >> 8) & 0xFF)), spvGetSwizzle(x, x.b, spvSwizzle((s >> 16) & 0xFF)), spvGetSwizzle(x, x.a, spvSwizzle((s >> 24) & 0xFF)));
77}
78
79template<typename T>
80inline T spvTextureSwizzle(T x, uint s)
81{
82    return spvTextureSwizzle(vec<T, 4>(x, 0, 0, 1), s).x;
83}
84
85fragment main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]], constant uint* spvSwizzleConstants [[buffer(30)]], texture2d<float> uSampler1 [[texture(0)]], sampler uSampler1Smplr [[sampler(0)]])
86{
87    main0_out out = {};
88    constant uint* spvDescriptorSet0_uSampler0Swzl = &spvDescriptorSet0.spvSwizzleConstants[0];
89    constant uint& uSampler1Swzl = spvSwizzleConstants[0];
90    out.FragColor = spvTextureSwizzle(spvDescriptorSet0.uSampler0[2].sample(spvDescriptorSet0.uSampler0Smplr[2], in.vUV), spvDescriptorSet0_uSampler0Swzl[2]);
91    float4 _73 = spvTextureSwizzle(uSampler1.sample(uSampler1Smplr, in.vUV), uSampler1Swzl);
92    out.FragColor += _73;
93    out.FragColor += spvTextureSwizzle(spvDescriptorSet0.uSampler0[1].sample(spvDescriptorSet0.uSampler0Smplr[1], in.vUV), spvDescriptorSet0_uSampler0Swzl[1]);
94    out.FragColor += _73;
95    return out;
96}
97
98