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_cithread bool operator==(const half2x3 left, const half2x3 right); 15cb93a386Sopenharmony_cithread bool operator!=(const half2x3 left, const half2x3 right); 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cithread bool operator==(const half2x4 left, const half2x4 right); 18cb93a386Sopenharmony_cithread bool operator!=(const half2x4 left, const half2x4 right); 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cithread bool operator==(const half3x2 left, const half3x2 right); 21cb93a386Sopenharmony_cithread bool operator!=(const half3x2 left, const half3x2 right); 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_cithread bool operator==(const half3x4 left, const half3x4 right); 24cb93a386Sopenharmony_cithread bool operator!=(const half3x4 left, const half3x4 right); 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_cithread bool operator==(const half4x2 left, const half4x2 right); 27cb93a386Sopenharmony_cithread bool operator!=(const half4x2 left, const half4x2 right); 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cithread bool operator==(const half4x3 left, const half4x3 right); 30cb93a386Sopenharmony_cithread bool operator!=(const half4x3 left, const half4x3 right); 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_cithread bool operator==(const half2x2 left, const half2x2 right); 33cb93a386Sopenharmony_cithread bool operator!=(const half2x2 left, const half2x2 right); 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_cithread bool operator==(const half3x3 left, const half3x3 right); 36cb93a386Sopenharmony_cithread bool operator!=(const half3x3 left, const half3x3 right); 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_cithread bool operator==(const float2x3 left, const float2x3 right); 39cb93a386Sopenharmony_cithread bool operator!=(const float2x3 left, const float2x3 right); 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_cithread bool operator==(const float2x4 left, const float2x4 right); 42cb93a386Sopenharmony_cithread bool operator!=(const float2x4 left, const float2x4 right); 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_cithread bool operator==(const float3x2 left, const float3x2 right); 45cb93a386Sopenharmony_cithread bool operator!=(const float3x2 left, const float3x2 right); 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_cithread bool operator==(const float3x4 left, const float3x4 right); 48cb93a386Sopenharmony_cithread bool operator!=(const float3x4 left, const float3x4 right); 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_cithread bool operator==(const float4x2 left, const float4x2 right); 51cb93a386Sopenharmony_cithread bool operator!=(const float4x2 left, const float4x2 right); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_cithread bool operator==(const float4x3 left, const float4x3 right); 54cb93a386Sopenharmony_cithread bool operator!=(const float4x3 left, const float4x3 right); 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_cithread bool operator==(const float2x2 left, const float2x2 right); 57cb93a386Sopenharmony_cithread bool operator!=(const float2x2 left, const float2x2 right); 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_cithread bool operator==(const float3x3 left, const float3x3 right); 60cb93a386Sopenharmony_cithread bool operator!=(const float3x3 left, const float3x3 right); 61cb93a386Sopenharmony_cithread bool operator==(const half2x3 left, const half2x3 right) { 62cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 63cb93a386Sopenharmony_ci all(left[1] == right[1]); 64cb93a386Sopenharmony_ci} 65cb93a386Sopenharmony_cithread bool operator!=(const half2x3 left, const half2x3 right) { 66cb93a386Sopenharmony_ci return !(left == right); 67cb93a386Sopenharmony_ci} 68cb93a386Sopenharmony_cithread bool operator==(const half2x4 left, const half2x4 right) { 69cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 70cb93a386Sopenharmony_ci all(left[1] == right[1]); 71cb93a386Sopenharmony_ci} 72cb93a386Sopenharmony_cithread bool operator!=(const half2x4 left, const half2x4 right) { 73cb93a386Sopenharmony_ci return !(left == right); 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_cithread bool operator==(const half3x2 left, const half3x2 right) { 76cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 77cb93a386Sopenharmony_ci all(left[1] == right[1]) && 78cb93a386Sopenharmony_ci all(left[2] == right[2]); 79cb93a386Sopenharmony_ci} 80cb93a386Sopenharmony_cithread bool operator!=(const half3x2 left, const half3x2 right) { 81cb93a386Sopenharmony_ci return !(left == right); 82cb93a386Sopenharmony_ci} 83cb93a386Sopenharmony_cithread bool operator==(const half3x4 left, const half3x4 right) { 84cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 85cb93a386Sopenharmony_ci all(left[1] == right[1]) && 86cb93a386Sopenharmony_ci all(left[2] == right[2]); 87cb93a386Sopenharmony_ci} 88cb93a386Sopenharmony_cithread bool operator!=(const half3x4 left, const half3x4 right) { 89cb93a386Sopenharmony_ci return !(left == right); 90cb93a386Sopenharmony_ci} 91cb93a386Sopenharmony_cithread bool operator==(const half4x2 left, const half4x2 right) { 92cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 93cb93a386Sopenharmony_ci all(left[1] == right[1]) && 94cb93a386Sopenharmony_ci all(left[2] == right[2]) && 95cb93a386Sopenharmony_ci all(left[3] == right[3]); 96cb93a386Sopenharmony_ci} 97cb93a386Sopenharmony_cithread bool operator!=(const half4x2 left, const half4x2 right) { 98cb93a386Sopenharmony_ci return !(left == right); 99cb93a386Sopenharmony_ci} 100cb93a386Sopenharmony_cithread bool operator==(const half4x3 left, const half4x3 right) { 101cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 102cb93a386Sopenharmony_ci all(left[1] == right[1]) && 103cb93a386Sopenharmony_ci all(left[2] == right[2]) && 104cb93a386Sopenharmony_ci all(left[3] == right[3]); 105cb93a386Sopenharmony_ci} 106cb93a386Sopenharmony_cithread bool operator!=(const half4x3 left, const half4x3 right) { 107cb93a386Sopenharmony_ci return !(left == right); 108cb93a386Sopenharmony_ci} 109cb93a386Sopenharmony_cithread bool operator==(const half2x2 left, const half2x2 right) { 110cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 111cb93a386Sopenharmony_ci all(left[1] == right[1]); 112cb93a386Sopenharmony_ci} 113cb93a386Sopenharmony_cithread bool operator!=(const half2x2 left, const half2x2 right) { 114cb93a386Sopenharmony_ci return !(left == right); 115cb93a386Sopenharmony_ci} 116cb93a386Sopenharmony_cithread bool operator==(const half3x3 left, const half3x3 right) { 117cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 118cb93a386Sopenharmony_ci all(left[1] == right[1]) && 119cb93a386Sopenharmony_ci all(left[2] == right[2]); 120cb93a386Sopenharmony_ci} 121cb93a386Sopenharmony_cithread bool operator!=(const half3x3 left, const half3x3 right) { 122cb93a386Sopenharmony_ci return !(left == right); 123cb93a386Sopenharmony_ci} 124cb93a386Sopenharmony_cithread half2x4 operator/(const half2x4 left, const half2x4 right) { 125cb93a386Sopenharmony_ci return half2x4(left[0] / right[0], left[1] / right[1]); 126cb93a386Sopenharmony_ci} 127cb93a386Sopenharmony_cithread half2x4& operator/=(thread half2x4& left, thread const half2x4& right) { 128cb93a386Sopenharmony_ci left = left / right; 129cb93a386Sopenharmony_ci return left; 130cb93a386Sopenharmony_ci} 131cb93a386Sopenharmony_cithread bool operator==(const float2x3 left, const float2x3 right) { 132cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 133cb93a386Sopenharmony_ci all(left[1] == right[1]); 134cb93a386Sopenharmony_ci} 135cb93a386Sopenharmony_cithread bool operator!=(const float2x3 left, const float2x3 right) { 136cb93a386Sopenharmony_ci return !(left == right); 137cb93a386Sopenharmony_ci} 138cb93a386Sopenharmony_cithread bool operator==(const float2x4 left, const float2x4 right) { 139cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 140cb93a386Sopenharmony_ci all(left[1] == right[1]); 141cb93a386Sopenharmony_ci} 142cb93a386Sopenharmony_cithread bool operator!=(const float2x4 left, const float2x4 right) { 143cb93a386Sopenharmony_ci return !(left == right); 144cb93a386Sopenharmony_ci} 145cb93a386Sopenharmony_cithread bool operator==(const float3x2 left, const float3x2 right) { 146cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 147cb93a386Sopenharmony_ci all(left[1] == right[1]) && 148cb93a386Sopenharmony_ci all(left[2] == right[2]); 149cb93a386Sopenharmony_ci} 150cb93a386Sopenharmony_cithread bool operator!=(const float3x2 left, const float3x2 right) { 151cb93a386Sopenharmony_ci return !(left == right); 152cb93a386Sopenharmony_ci} 153cb93a386Sopenharmony_cithread bool operator==(const float3x4 left, const float3x4 right) { 154cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 155cb93a386Sopenharmony_ci all(left[1] == right[1]) && 156cb93a386Sopenharmony_ci all(left[2] == right[2]); 157cb93a386Sopenharmony_ci} 158cb93a386Sopenharmony_cithread bool operator!=(const float3x4 left, const float3x4 right) { 159cb93a386Sopenharmony_ci return !(left == right); 160cb93a386Sopenharmony_ci} 161cb93a386Sopenharmony_cithread bool operator==(const float4x2 left, const float4x2 right) { 162cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 163cb93a386Sopenharmony_ci all(left[1] == right[1]) && 164cb93a386Sopenharmony_ci all(left[2] == right[2]) && 165cb93a386Sopenharmony_ci all(left[3] == right[3]); 166cb93a386Sopenharmony_ci} 167cb93a386Sopenharmony_cithread bool operator!=(const float4x2 left, const float4x2 right) { 168cb93a386Sopenharmony_ci return !(left == right); 169cb93a386Sopenharmony_ci} 170cb93a386Sopenharmony_cithread bool operator==(const float4x3 left, const float4x3 right) { 171cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 172cb93a386Sopenharmony_ci all(left[1] == right[1]) && 173cb93a386Sopenharmony_ci all(left[2] == right[2]) && 174cb93a386Sopenharmony_ci all(left[3] == right[3]); 175cb93a386Sopenharmony_ci} 176cb93a386Sopenharmony_cithread bool operator!=(const float4x3 left, const float4x3 right) { 177cb93a386Sopenharmony_ci return !(left == right); 178cb93a386Sopenharmony_ci} 179cb93a386Sopenharmony_cithread bool operator==(const float2x2 left, const float2x2 right) { 180cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 181cb93a386Sopenharmony_ci all(left[1] == right[1]); 182cb93a386Sopenharmony_ci} 183cb93a386Sopenharmony_cithread bool operator!=(const float2x2 left, const float2x2 right) { 184cb93a386Sopenharmony_ci return !(left == right); 185cb93a386Sopenharmony_ci} 186cb93a386Sopenharmony_cithread bool operator==(const float3x3 left, const float3x3 right) { 187cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 188cb93a386Sopenharmony_ci all(left[1] == right[1]) && 189cb93a386Sopenharmony_ci all(left[2] == right[2]); 190cb93a386Sopenharmony_ci} 191cb93a386Sopenharmony_cithread bool operator!=(const float3x3 left, const float3x3 right) { 192cb93a386Sopenharmony_ci return !(left == right); 193cb93a386Sopenharmony_ci} 194cb93a386Sopenharmony_cithread float2x4 operator/(const float2x4 left, const float2x4 right) { 195cb93a386Sopenharmony_ci return float2x4(left[0] / right[0], left[1] / right[1]); 196cb93a386Sopenharmony_ci} 197cb93a386Sopenharmony_cithread float2x4& operator/=(thread float2x4& left, thread const float2x4& right) { 198cb93a386Sopenharmony_ci left = left / right; 199cb93a386Sopenharmony_ci return left; 200cb93a386Sopenharmony_ci} 201cb93a386Sopenharmony_cibool test_half_b() { 202cb93a386Sopenharmony_ci bool ok = true; 203cb93a386Sopenharmony_ci half2x3 m23 = half2x3(2.0h); 204cb93a386Sopenharmony_ci ok = ok && m23 == half2x3(half3(2.0h, 0.0h, 0.0h), half3(0.0h, 2.0h, 0.0h)); 205cb93a386Sopenharmony_ci half2x4 m24 = half2x4(3.0h); 206cb93a386Sopenharmony_ci ok = ok && m24 == half2x4(half4(3.0h, 0.0h, 0.0h, 0.0h), half4(0.0h, 3.0h, 0.0h, 0.0h)); 207cb93a386Sopenharmony_ci half3x2 m32 = half3x2(4.0h); 208cb93a386Sopenharmony_ci ok = ok && m32 == half3x2(half2(4.0h, 0.0h), half2(0.0h, 4.0h), half2(0.0h, 0.0h)); 209cb93a386Sopenharmony_ci half3x4 m34 = half3x4(5.0h); 210cb93a386Sopenharmony_ci ok = ok && m34 == half3x4(half4(5.0h, 0.0h, 0.0h, 0.0h), half4(0.0h, 5.0h, 0.0h, 0.0h), half4(0.0h, 0.0h, 5.0h, 0.0h)); 211cb93a386Sopenharmony_ci half4x2 m42 = half4x2(6.0h); 212cb93a386Sopenharmony_ci ok = ok && m42 == half4x2(half2(6.0h, 0.0h), half2(0.0h, 6.0h), half2(0.0h, 0.0h), half2(0.0h, 0.0h)); 213cb93a386Sopenharmony_ci half4x3 m43 = half4x3(7.0h); 214cb93a386Sopenharmony_ci ok = ok && m43 == half4x3(half3(7.0h, 0.0h, 0.0h), half3(0.0h, 7.0h, 0.0h), half3(0.0h, 0.0h, 7.0h), half3(0.0h, 0.0h, 0.0h)); 215cb93a386Sopenharmony_ci half2x2 m22 = m32 * m23; 216cb93a386Sopenharmony_ci ok = ok && m22 == half2x2(8.0h); 217cb93a386Sopenharmony_ci half3x3 m33 = m43 * m34; 218cb93a386Sopenharmony_ci ok = ok && m33 == half3x3(35.0h); 219cb93a386Sopenharmony_ci m23 += (half2x3(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 1.0h); 220cb93a386Sopenharmony_ci ok = ok && m23 == half2x3(half3(3.0h, 1.0h, 1.0h), half3(1.0h, 3.0h, 1.0h)); 221cb93a386Sopenharmony_ci m32 -= (half3x2(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 2.0h); 222cb93a386Sopenharmony_ci ok = ok && m32 == half3x2(half2(2.0h, -2.0h), half2(-2.0h, 2.0h), half2(-2.0h, -2.0h)); 223cb93a386Sopenharmony_ci m24 /= (half2x4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 4.0h); 224cb93a386Sopenharmony_ci ok = ok && m24 == half2x4(half4(0.75h, 0.0h, 0.0h, 0.0h), half4(0.0h, 0.75h, 0.0h, 0.0h)); 225cb93a386Sopenharmony_ci return ok; 226cb93a386Sopenharmony_ci} 227cb93a386Sopenharmony_cifragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) { 228cb93a386Sopenharmony_ci Outputs _out; 229cb93a386Sopenharmony_ci (void)_out; 230cb93a386Sopenharmony_ci bool _0_ok = true; 231cb93a386Sopenharmony_ci float2x3 _1_m23 = float2x3(2.0); 232cb93a386Sopenharmony_ci _0_ok = _0_ok && _1_m23 == float2x3(float3(2.0, 0.0, 0.0), float3(0.0, 2.0, 0.0)); 233cb93a386Sopenharmony_ci float2x4 _2_m24 = float2x4(3.0); 234cb93a386Sopenharmony_ci _0_ok = _0_ok && _2_m24 == float2x4(float4(3.0, 0.0, 0.0, 0.0), float4(0.0, 3.0, 0.0, 0.0)); 235cb93a386Sopenharmony_ci float3x2 _3_m32 = float3x2(4.0); 236cb93a386Sopenharmony_ci _0_ok = _0_ok && _3_m32 == float3x2(float2(4.0, 0.0), float2(0.0, 4.0), float2(0.0, 0.0)); 237cb93a386Sopenharmony_ci float3x4 _4_m34 = float3x4(5.0); 238cb93a386Sopenharmony_ci _0_ok = _0_ok && _4_m34 == float3x4(float4(5.0, 0.0, 0.0, 0.0), float4(0.0, 5.0, 0.0, 0.0), float4(0.0, 0.0, 5.0, 0.0)); 239cb93a386Sopenharmony_ci float4x2 _5_m42 = float4x2(6.0); 240cb93a386Sopenharmony_ci _0_ok = _0_ok && _5_m42 == float4x2(float2(6.0, 0.0), float2(0.0, 6.0), float2(0.0, 0.0), float2(0.0, 0.0)); 241cb93a386Sopenharmony_ci float4x3 _6_m43 = float4x3(7.0); 242cb93a386Sopenharmony_ci _0_ok = _0_ok && _6_m43 == float4x3(float3(7.0, 0.0, 0.0), float3(0.0, 7.0, 0.0), float3(0.0, 0.0, 7.0), float3(0.0, 0.0, 0.0)); 243cb93a386Sopenharmony_ci float2x2 _7_m22 = _3_m32 * _1_m23; 244cb93a386Sopenharmony_ci _0_ok = _0_ok && _7_m22 == float2x2(8.0); 245cb93a386Sopenharmony_ci float3x3 _8_m33 = _6_m43 * _4_m34; 246cb93a386Sopenharmony_ci _0_ok = _0_ok && _8_m33 == float3x3(35.0); 247cb93a386Sopenharmony_ci _1_m23 += (float2x3(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 1.0); 248cb93a386Sopenharmony_ci _0_ok = _0_ok && _1_m23 == float2x3(float3(3.0, 1.0, 1.0), float3(1.0, 3.0, 1.0)); 249cb93a386Sopenharmony_ci _3_m32 -= (float3x2(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 2.0); 250cb93a386Sopenharmony_ci _0_ok = _0_ok && _3_m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0)); 251cb93a386Sopenharmony_ci _2_m24 /= (float2x4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 4.0); 252cb93a386Sopenharmony_ci _0_ok = _0_ok && _2_m24 == float2x4(float4(0.75, 0.0, 0.0, 0.0), float4(0.0, 0.75, 0.0, 0.0)); 253cb93a386Sopenharmony_ci _out.sk_FragColor = _0_ok && test_half_b() ? _uniforms.colorGreen : _uniforms.colorRed; 254cb93a386Sopenharmony_ci return _out; 255cb93a386Sopenharmony_ci} 256