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 float2x2 testMatrix2x2; 8cb93a386Sopenharmony_ci}; 9cb93a386Sopenharmony_cistruct Inputs { 10cb93a386Sopenharmony_ci}; 11cb93a386Sopenharmony_cistruct Outputs { 12cb93a386Sopenharmony_ci half4 sk_FragColor [[color(0)]]; 13cb93a386Sopenharmony_ci}; 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cithread bool operator==(const float2x2 left, const float2x2 right); 16cb93a386Sopenharmony_cithread bool operator!=(const float2x2 left, const float2x2 right); 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_cithread bool operator==(const float3x3 left, const float3x3 right); 19cb93a386Sopenharmony_cithread bool operator!=(const float3x3 left, const float3x3 right); 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cithread bool operator==(const float4x4 left, const float4x4 right); 22cb93a386Sopenharmony_cithread bool operator!=(const float4x4 left, const float4x4 right); 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cifloat4 float4_from_float2x2(float2x2 x) { 25cb93a386Sopenharmony_ci return float4(x[0].xy, x[1].xy); 26cb93a386Sopenharmony_ci} 27cb93a386Sopenharmony_cithread bool operator==(const float2x2 left, const float2x2 right) { 28cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 29cb93a386Sopenharmony_ci all(left[1] == right[1]); 30cb93a386Sopenharmony_ci} 31cb93a386Sopenharmony_cithread bool operator!=(const float2x2 left, const float2x2 right) { 32cb93a386Sopenharmony_ci return !(left == right); 33cb93a386Sopenharmony_ci} 34cb93a386Sopenharmony_cifloat2x2 float2x2_from_float3_float(float3 x0, float x1) { 35cb93a386Sopenharmony_ci return float2x2(float2(x0.xy), float2(x0.z, x1)); 36cb93a386Sopenharmony_ci} 37cb93a386Sopenharmony_cithread bool operator==(const float3x3 left, const float3x3 right) { 38cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 39cb93a386Sopenharmony_ci all(left[1] == right[1]) && 40cb93a386Sopenharmony_ci all(left[2] == right[2]); 41cb93a386Sopenharmony_ci} 42cb93a386Sopenharmony_cithread bool operator!=(const float3x3 left, const float3x3 right) { 43cb93a386Sopenharmony_ci return !(left == right); 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_cifloat3x3 float3x3_from_float2_float2_float4_float(float2 x0, float2 x1, float4 x2, float x3) { 46cb93a386Sopenharmony_ci return float3x3(float3(x0.xy, x1.x), float3(x1.y, x2.xy), float3(x2.zw, x3)); 47cb93a386Sopenharmony_ci} 48cb93a386Sopenharmony_cithread bool operator==(const float4x4 left, const float4x4 right) { 49cb93a386Sopenharmony_ci return all(left[0] == right[0]) && 50cb93a386Sopenharmony_ci all(left[1] == right[1]) && 51cb93a386Sopenharmony_ci all(left[2] == right[2]) && 52cb93a386Sopenharmony_ci all(left[3] == right[3]); 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_cithread bool operator!=(const float4x4 left, const float4x4 right) { 55cb93a386Sopenharmony_ci return !(left == right); 56cb93a386Sopenharmony_ci} 57cb93a386Sopenharmony_cifloat4x4 float4x4_from_float3_float3_float4_float2_float4(float3 x0, float3 x1, float4 x2, float2 x3, float4 x4) { 58cb93a386Sopenharmony_ci return float4x4(float4(x0.xyz, x1.x), float4(x1.yz, x2.xy), float4(x2.zw, x3.xy), float4(x4.xyzw)); 59cb93a386Sopenharmony_ci} 60cb93a386Sopenharmony_cifragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) { 61cb93a386Sopenharmony_ci Outputs _out; 62cb93a386Sopenharmony_ci (void)_out; 63cb93a386Sopenharmony_ci float4 f4 = float4_from_float2x2(_uniforms.testMatrix2x2); 64cb93a386Sopenharmony_ci bool ok = float2x2_from_float3_float(f4.xyz, 4.0) == float2x2(float2(1.0, 2.0), float2(3.0, 4.0)); 65cb93a386Sopenharmony_ci ok = ok && float3x3_from_float2_float2_float4_float(f4.xy, f4.zw, f4, f4.x) == float3x3(float3(1.0, 2.0, 3.0), float3(4.0, 1.0, 2.0), float3(3.0, 4.0, 1.0)); 66cb93a386Sopenharmony_ci ok = ok && float4x4_from_float3_float3_float4_float2_float4(f4.xyz, f4.wxy, f4.zwxy, f4.zw, f4) == float4x4(float4(1.0, 2.0, 3.0, 4.0), float4(1.0, 2.0, 3.0, 4.0), float4(1.0, 2.0, 3.0, 4.0), float4(1.0, 2.0, 3.0, 4.0)); 67cb93a386Sopenharmony_ci _out.sk_FragColor = ok ? _uniforms.colorGreen : _uniforms.colorRed; 68cb93a386Sopenharmony_ci return _out; 69cb93a386Sopenharmony_ci} 70