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