1*c8dee2aaSAndroid Build Coastguard Worker#include <metal_stdlib> 2*c8dee2aaSAndroid Build Coastguard Worker#include <simd/simd.h> 3*c8dee2aaSAndroid Build Coastguard Worker#ifdef __clang__ 4*c8dee2aaSAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wall" 5*c8dee2aaSAndroid Build Coastguard Worker#endif 6*c8dee2aaSAndroid Build Coastguard Workerusing namespace metal; 7*c8dee2aaSAndroid Build Coastguard Workerconstant const int minus = 2; 8*c8dee2aaSAndroid Build Coastguard Workerconstant const int star = 3; 9*c8dee2aaSAndroid Build Coastguard Workerconstant const int slash = 4; 10*c8dee2aaSAndroid Build Coastguard Workerstruct Uniforms { 11*c8dee2aaSAndroid Build Coastguard Worker half4 colorGreen; 12*c8dee2aaSAndroid Build Coastguard Worker half4 colorRed; 13*c8dee2aaSAndroid Build Coastguard Worker float4 testInputs; 14*c8dee2aaSAndroid Build Coastguard Worker}; 15*c8dee2aaSAndroid Build Coastguard Workerstruct Inputs { 16*c8dee2aaSAndroid Build Coastguard Worker}; 17*c8dee2aaSAndroid Build Coastguard Workerstruct Outputs { 18*c8dee2aaSAndroid Build Coastguard Worker half4 sk_FragColor [[color(0)]]; 19*c8dee2aaSAndroid Build Coastguard Worker}; 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Workerfloat4 float4_from_float2x2(float2x2 x) { 22*c8dee2aaSAndroid Build Coastguard Worker return float4(x[0].xy, x[1].xy); 23*c8dee2aaSAndroid Build Coastguard Worker} 24*c8dee2aaSAndroid Build Coastguard Workerbool test_bifffff22(Uniforms _uniforms, int op, float m11, float m12, float m21, float m22, float2x2 expected) { 25*c8dee2aaSAndroid Build Coastguard Worker float one = float(_uniforms.colorRed.x); 26*c8dee2aaSAndroid Build Coastguard Worker float2x2 m2 = float2x2(float2(m11 * one, m12 * one), float2(m21 * one, m22 * one)); 27*c8dee2aaSAndroid Build Coastguard Worker switch (op) { 28*c8dee2aaSAndroid Build Coastguard Worker case 1: 29*c8dee2aaSAndroid Build Coastguard Worker m2 = (float2x2(1.0, 1.0, 1.0, 1.0) * 1.0) + m2; 30*c8dee2aaSAndroid Build Coastguard Worker break; 31*c8dee2aaSAndroid Build Coastguard Worker case 2: 32*c8dee2aaSAndroid Build Coastguard Worker m2 -= (float2x2(1.0, 1.0, 1.0, 1.0) * 1.0); 33*c8dee2aaSAndroid Build Coastguard Worker break; 34*c8dee2aaSAndroid Build Coastguard Worker case 3: 35*c8dee2aaSAndroid Build Coastguard Worker m2 *= 2.0; 36*c8dee2aaSAndroid Build Coastguard Worker break; 37*c8dee2aaSAndroid Build Coastguard Worker case 4: 38*c8dee2aaSAndroid Build Coastguard Worker m2 = m2 * 0.5; 39*c8dee2aaSAndroid Build Coastguard Worker break; 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker return ((m2[0].x == expected[0].x && m2[0].y == expected[0].y) && m2[1].x == expected[1].x) && m2[1].y == expected[1].y; 42*c8dee2aaSAndroid Build Coastguard Worker} 43*c8dee2aaSAndroid Build Coastguard Workerbool divisionTest_b(Uniforms _uniforms) { 44*c8dee2aaSAndroid Build Coastguard Worker float ten = float(_uniforms.colorRed.x * 10.0h); 45*c8dee2aaSAndroid Build Coastguard Worker float2x2 mat = float2x2(float2(ten), float2(ten)); 46*c8dee2aaSAndroid Build Coastguard Worker float2x2 div = mat * (1.0 / _uniforms.testInputs.x); 47*c8dee2aaSAndroid Build Coastguard Worker mat *= 1.0 / _uniforms.testInputs.x; 48*c8dee2aaSAndroid Build Coastguard Worker return all((abs(float4_from_float2x2(div) + float4(8.0)) < float4(0.01))) && all((abs(float4_from_float2x2(mat) + float4(8.0)) < float4(0.01))); 49*c8dee2aaSAndroid Build Coastguard Worker} 50*c8dee2aaSAndroid Build Coastguard Workerfragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) { 51*c8dee2aaSAndroid Build Coastguard Worker Outputs _out; 52*c8dee2aaSAndroid Build Coastguard Worker (void)_out; 53*c8dee2aaSAndroid Build Coastguard Worker float f1 = float(_uniforms.colorGreen.y); 54*c8dee2aaSAndroid Build Coastguard Worker float f2 = float(2.0h * _uniforms.colorGreen.y); 55*c8dee2aaSAndroid Build Coastguard Worker float f3 = float(3.0h * _uniforms.colorGreen.y); 56*c8dee2aaSAndroid Build Coastguard Worker float f4 = float(4.0h * _uniforms.colorGreen.y); 57*c8dee2aaSAndroid Build Coastguard Worker float2x2 _0_expected = float2x2(float2(f1 + 1.0, f2 + 1.0), float2(f3 + 1.0, f4 + 1.0)); 58*c8dee2aaSAndroid Build Coastguard Worker float _1_one = float(_uniforms.colorRed.x); 59*c8dee2aaSAndroid Build Coastguard Worker float2x2 _2_m2 = float2x2(float2(f1 * _1_one, f2 * _1_one), float2(f3 * _1_one, f4 * _1_one)); 60*c8dee2aaSAndroid Build Coastguard Worker { 61*c8dee2aaSAndroid Build Coastguard Worker _2_m2 = (float2x2(1.0, 1.0, 1.0, 1.0) * 1.0) + _2_m2; 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker _out.sk_FragColor = ((((((_2_m2[0].x == _0_expected[0].x && _2_m2[0].y == _0_expected[0].y) && _2_m2[1].x == _0_expected[1].x) && _2_m2[1].y == _0_expected[1].y) && test_bifffff22(_uniforms, minus, f1, f2, f3, f4, float2x2(float2(f1 - 1.0, f2 - 1.0), float2(f3 - 1.0, f4 - 1.0)))) && test_bifffff22(_uniforms, star, f1, f2, f3, f4, float2x2(float2(f1 * 2.0, f2 * 2.0), float2(f3 * 2.0, f4 * 2.0)))) && test_bifffff22(_uniforms, slash, f1, f2, f3, f4, float2x2(float2(f1 * 0.5, f2 * 0.5), float2(f3 * 0.5, f4 * 0.5)))) && divisionTest_b(_uniforms) ? _uniforms.colorGreen : _uniforms.colorRed; 64*c8dee2aaSAndroid Build Coastguard Worker return _out; 65*c8dee2aaSAndroid Build Coastguard Worker} 66