1cb93a386Sopenharmony_ci#include <metal_stdlib> 2cb93a386Sopenharmony_ci#include <simd/simd.h> 3cb93a386Sopenharmony_ciusing namespace metal; 4cb93a386Sopenharmony_cistruct Uniforms { 5cb93a386Sopenharmony_ci half4 colorGreen; 6cb93a386Sopenharmony_ci half4 colorRed; 7cb93a386Sopenharmony_ci}; 8cb93a386Sopenharmony_cistruct Inputs { 9cb93a386Sopenharmony_ci}; 10cb93a386Sopenharmony_cistruct Outputs { 11cb93a386Sopenharmony_ci half4 sk_FragColor [[color(0)]]; 12cb93a386Sopenharmony_ci}; 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_citemplate <typename T1, typename T2, size_t N> 15cb93a386Sopenharmony_cibool operator==(thread const array<T1, N>& left, thread const array<T2, N>& right); 16cb93a386Sopenharmony_citemplate <typename T1, typename T2, size_t N> 17cb93a386Sopenharmony_cibool operator!=(thread const array<T1, N>& left, thread const array<T2, N>& right); 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_citemplate <size_t N> 20cb93a386Sopenharmony_ciarray<int, N> array_of_int_from_short(thread const array<short, N>& x) { 21cb93a386Sopenharmony_ci array<int, N> result; 22cb93a386Sopenharmony_ci for (int i = 0; i < N; ++i) { 23cb93a386Sopenharmony_ci result[i] = int(x[i]); 24cb93a386Sopenharmony_ci } 25cb93a386Sopenharmony_ci return result; 26cb93a386Sopenharmony_ci} 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_citemplate <size_t N> 29cb93a386Sopenharmony_ciarray<short, N> array_of_short_from_int(thread const array<int, N>& x) { 30cb93a386Sopenharmony_ci array<short, N> result; 31cb93a386Sopenharmony_ci for (int i = 0; i < N; ++i) { 32cb93a386Sopenharmony_ci result[i] = short(x[i]); 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci return result; 35cb93a386Sopenharmony_ci} 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_citemplate <size_t N> 38cb93a386Sopenharmony_ciarray<float, N> array_of_float_from_half(thread const array<half, N>& x) { 39cb93a386Sopenharmony_ci array<float, N> result; 40cb93a386Sopenharmony_ci for (int i = 0; i < N; ++i) { 41cb93a386Sopenharmony_ci result[i] = float(x[i]); 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci return result; 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_citemplate <size_t N> 47cb93a386Sopenharmony_ciarray<half, N> array_of_half_from_float(thread const array<float, N>& x) { 48cb93a386Sopenharmony_ci array<half, N> result; 49cb93a386Sopenharmony_ci for (int i = 0; i < N; ++i) { 50cb93a386Sopenharmony_ci result[i] = half(x[i]); 51cb93a386Sopenharmony_ci } 52cb93a386Sopenharmony_ci return result; 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_citemplate <typename T1, typename T2, size_t N> 56cb93a386Sopenharmony_cibool operator==(thread const array<T1, N>& left, thread const array<T2, N>& right) { 57cb93a386Sopenharmony_ci for (size_t index = 0; index < N; ++index) { 58cb93a386Sopenharmony_ci if (!all(left[index] == right[index])) { 59cb93a386Sopenharmony_ci return false; 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci return true; 63cb93a386Sopenharmony_ci} 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_citemplate <typename T1, typename T2, size_t N> 66cb93a386Sopenharmony_cibool operator!=(thread const array<T1, N>& left, thread const array<T2, N>& right) { 67cb93a386Sopenharmony_ci return !(left == right); 68cb93a386Sopenharmony_ci} 69cb93a386Sopenharmony_cifragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) { 70cb93a386Sopenharmony_ci Outputs _out; 71cb93a386Sopenharmony_ci (void)_out; 72cb93a386Sopenharmony_ci array<int, 2> i2 = array<int, 2>{1, 2}; 73cb93a386Sopenharmony_ci array<short, 2> s2 = array<short, 2>{1, 2}; 74cb93a386Sopenharmony_ci array<float, 2> f2 = array<float, 2>{1.0, 2.0}; 75cb93a386Sopenharmony_ci array<half, 2> h2 = array<half, 2>{1.0h, 2.0h}; 76cb93a386Sopenharmony_ci i2 = array_of_int_from_short(s2); 77cb93a386Sopenharmony_ci s2 = array_of_short_from_int(i2); 78cb93a386Sopenharmony_ci f2 = array_of_float_from_half(h2); 79cb93a386Sopenharmony_ci h2 = array_of_half_from_float(f2); 80cb93a386Sopenharmony_ci const array<float, 2> cf2 = array<float, 2>{1.0, 2.0}; 81cb93a386Sopenharmony_ci _out.sk_FragColor = ((i2 == array_of_int_from_short(s2) && f2 == array_of_float_from_half(h2)) && i2 == array<int, 2>{1, 2}) && array_of_float_from_half(h2) == cf2 ? _uniforms.colorGreen : _uniforms.colorRed; 82cb93a386Sopenharmony_ci return _out; 83cb93a386Sopenharmony_ci} 84