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 Workerstruct Uniforms { 8*c8dee2aaSAndroid Build Coastguard Worker half4 colorWhite; 9*c8dee2aaSAndroid Build Coastguard Worker half4 colorGreen; 10*c8dee2aaSAndroid Build Coastguard Worker half4 colorRed; 11*c8dee2aaSAndroid Build Coastguard Worker float2x2 testMatrix2x2; 12*c8dee2aaSAndroid Build Coastguard Worker float3x3 testMatrix3x3; 13*c8dee2aaSAndroid Build Coastguard Worker float4x4 testMatrix4x4; 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 Workerthread bool operator==(const float2x2 left, const float2x2 right); 22*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const float2x2 left, const float2x2 right); 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const float3x3 left, const float3x3 right); 25*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const float3x3 left, const float3x3 right); 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const float4x4 left, const float4x4 right); 28*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const float4x4 left, const float4x4 right); 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const half2x2 left, const half2x2 right); 31*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const half2x2 left, const half2x2 right); 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const half3x3 left, const half3x3 right); 34*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const half3x3 left, const half3x3 right); 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const half4x4 left, const half4x4 right); 37*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const half4x4 left, const half4x4 right); 38*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const float2x2 left, const float2x2 right) { 39*c8dee2aaSAndroid Build Coastguard Worker return all(left[0] == right[0]) && 40*c8dee2aaSAndroid Build Coastguard Worker all(left[1] == right[1]); 41*c8dee2aaSAndroid Build Coastguard Worker} 42*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const float2x2 left, const float2x2 right) { 43*c8dee2aaSAndroid Build Coastguard Worker return !(left == right); 44*c8dee2aaSAndroid Build Coastguard Worker} 45*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const float3x3 left, const float3x3 right) { 46*c8dee2aaSAndroid Build Coastguard Worker return all(left[0] == right[0]) && 47*c8dee2aaSAndroid Build Coastguard Worker all(left[1] == right[1]) && 48*c8dee2aaSAndroid Build Coastguard Worker all(left[2] == right[2]); 49*c8dee2aaSAndroid Build Coastguard Worker} 50*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const float3x3 left, const float3x3 right) { 51*c8dee2aaSAndroid Build Coastguard Worker return !(left == right); 52*c8dee2aaSAndroid Build Coastguard Worker} 53*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const float4x4 left, const float4x4 right) { 54*c8dee2aaSAndroid Build Coastguard Worker return all(left[0] == right[0]) && 55*c8dee2aaSAndroid Build Coastguard Worker all(left[1] == right[1]) && 56*c8dee2aaSAndroid Build Coastguard Worker all(left[2] == right[2]) && 57*c8dee2aaSAndroid Build Coastguard Worker all(left[3] == right[3]); 58*c8dee2aaSAndroid Build Coastguard Worker} 59*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const float4x4 left, const float4x4 right) { 60*c8dee2aaSAndroid Build Coastguard Worker return !(left == right); 61*c8dee2aaSAndroid Build Coastguard Worker} 62*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const half2x2 left, const half2x2 right) { 63*c8dee2aaSAndroid Build Coastguard Worker return all(left[0] == right[0]) && 64*c8dee2aaSAndroid Build Coastguard Worker all(left[1] == right[1]); 65*c8dee2aaSAndroid Build Coastguard Worker} 66*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const half2x2 left, const half2x2 right) { 67*c8dee2aaSAndroid Build Coastguard Worker return !(left == right); 68*c8dee2aaSAndroid Build Coastguard Worker} 69*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const half3x3 left, const half3x3 right) { 70*c8dee2aaSAndroid Build Coastguard Worker return all(left[0] == right[0]) && 71*c8dee2aaSAndroid Build Coastguard Worker all(left[1] == right[1]) && 72*c8dee2aaSAndroid Build Coastguard Worker all(left[2] == right[2]); 73*c8dee2aaSAndroid Build Coastguard Worker} 74*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const half3x3 left, const half3x3 right) { 75*c8dee2aaSAndroid Build Coastguard Worker return !(left == right); 76*c8dee2aaSAndroid Build Coastguard Worker} 77*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(const half4x4 left, const half4x4 right) { 78*c8dee2aaSAndroid Build Coastguard Worker return all(left[0] == right[0]) && 79*c8dee2aaSAndroid Build Coastguard Worker all(left[1] == right[1]) && 80*c8dee2aaSAndroid Build Coastguard Worker all(left[2] == right[2]) && 81*c8dee2aaSAndroid Build Coastguard Worker all(left[3] == right[3]); 82*c8dee2aaSAndroid Build Coastguard Worker} 83*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(const half4x4 left, const half4x4 right) { 84*c8dee2aaSAndroid Build Coastguard Worker return !(left == right); 85*c8dee2aaSAndroid Build Coastguard Worker} 86*c8dee2aaSAndroid Build Coastguard Workerbool test_iscalar_b(Uniforms _uniforms) { 87*c8dee2aaSAndroid Build Coastguard Worker int x = int(_uniforms.colorWhite.x); 88*c8dee2aaSAndroid Build Coastguard Worker x = -x; 89*c8dee2aaSAndroid Build Coastguard Worker return x == -1; 90*c8dee2aaSAndroid Build Coastguard Worker} 91*c8dee2aaSAndroid Build Coastguard Workerbool test_fvec_b(Uniforms _uniforms) { 92*c8dee2aaSAndroid Build Coastguard Worker half2 x = _uniforms.colorWhite.xy; 93*c8dee2aaSAndroid Build Coastguard Worker x = -x; 94*c8dee2aaSAndroid Build Coastguard Worker return all(x == half2(-1.0h)); 95*c8dee2aaSAndroid Build Coastguard Worker} 96*c8dee2aaSAndroid Build Coastguard Workerbool test_ivec_b(Uniforms _uniforms) { 97*c8dee2aaSAndroid Build Coastguard Worker int2 x = int2(int(_uniforms.colorWhite.x)); 98*c8dee2aaSAndroid Build Coastguard Worker x = -x; 99*c8dee2aaSAndroid Build Coastguard Worker return all(x == int2(-1)); 100*c8dee2aaSAndroid Build Coastguard Worker} 101*c8dee2aaSAndroid Build Coastguard Workerbool test_mat2_b(Uniforms _uniforms) { 102*c8dee2aaSAndroid Build Coastguard Worker const float2x2 negated = float2x2(float2(-1.0, -2.0), float2(-3.0, -4.0)); 103*c8dee2aaSAndroid Build Coastguard Worker float2x2 x = _uniforms.testMatrix2x2; 104*c8dee2aaSAndroid Build Coastguard Worker x = (-1.0 * x); 105*c8dee2aaSAndroid Build Coastguard Worker return x == negated; 106*c8dee2aaSAndroid Build Coastguard Worker} 107*c8dee2aaSAndroid Build Coastguard Workerbool test_mat3_b(Uniforms _uniforms) { 108*c8dee2aaSAndroid Build Coastguard Worker const float3x3 negated = float3x3(float3(-1.0, -2.0, -3.0), float3(-4.0, -5.0, -6.0), float3(-7.0, -8.0, -9.0)); 109*c8dee2aaSAndroid Build Coastguard Worker float3x3 x = _uniforms.testMatrix3x3; 110*c8dee2aaSAndroid Build Coastguard Worker x = (-1.0 * x); 111*c8dee2aaSAndroid Build Coastguard Worker return x == negated; 112*c8dee2aaSAndroid Build Coastguard Worker} 113*c8dee2aaSAndroid Build Coastguard Workerbool test_mat4_b(Uniforms _uniforms) { 114*c8dee2aaSAndroid Build Coastguard Worker const float4x4 negated = float4x4(float4(-1.0, -2.0, -3.0, -4.0), float4(-5.0, -6.0, -7.0, -8.0), float4(-9.0, -10.0, -11.0, -12.0), float4(-13.0, -14.0, -15.0, -16.0)); 115*c8dee2aaSAndroid Build Coastguard Worker float4x4 x = _uniforms.testMatrix4x4; 116*c8dee2aaSAndroid Build Coastguard Worker x = (-1.0 * x); 117*c8dee2aaSAndroid Build Coastguard Worker return x == negated; 118*c8dee2aaSAndroid Build Coastguard Worker} 119*c8dee2aaSAndroid Build Coastguard Workerbool test_hmat2_b(Uniforms _uniforms) { 120*c8dee2aaSAndroid Build Coastguard Worker const half2x2 negated = half2x2(half2(-1.0h, -2.0h), half2(-3.0h, -4.0h)); 121*c8dee2aaSAndroid Build Coastguard Worker half2x2 x = half2x2(_uniforms.testMatrix2x2); 122*c8dee2aaSAndroid Build Coastguard Worker x = (-1.0h * x); 123*c8dee2aaSAndroid Build Coastguard Worker return x == negated; 124*c8dee2aaSAndroid Build Coastguard Worker} 125*c8dee2aaSAndroid Build Coastguard Workerbool test_hmat3_b(Uniforms _uniforms) { 126*c8dee2aaSAndroid Build Coastguard Worker const half3x3 negated = half3x3(half3(-1.0h, -2.0h, -3.0h), half3(-4.0h, -5.0h, -6.0h), half3(-7.0h, -8.0h, -9.0h)); 127*c8dee2aaSAndroid Build Coastguard Worker half3x3 x = half3x3(_uniforms.testMatrix3x3); 128*c8dee2aaSAndroid Build Coastguard Worker x = (-1.0h * x); 129*c8dee2aaSAndroid Build Coastguard Worker return x == negated; 130*c8dee2aaSAndroid Build Coastguard Worker} 131*c8dee2aaSAndroid Build Coastguard Workerbool test_hmat4_b(Uniforms _uniforms) { 132*c8dee2aaSAndroid Build Coastguard Worker const half4x4 negated = half4x4(half4(-1.0h, -2.0h, -3.0h, -4.0h), half4(-5.0h, -6.0h, -7.0h, -8.0h), half4(-9.0h, -10.0h, -11.0h, -12.0h), half4(-13.0h, -14.0h, -15.0h, -16.0h)); 133*c8dee2aaSAndroid Build Coastguard Worker half4x4 x = half4x4(_uniforms.testMatrix4x4); 134*c8dee2aaSAndroid Build Coastguard Worker x = (-1.0h * x); 135*c8dee2aaSAndroid Build Coastguard Worker return x == negated; 136*c8dee2aaSAndroid Build Coastguard Worker} 137*c8dee2aaSAndroid Build Coastguard Workerfragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) { 138*c8dee2aaSAndroid Build Coastguard Worker Outputs _out; 139*c8dee2aaSAndroid Build Coastguard Worker (void)_out; 140*c8dee2aaSAndroid Build Coastguard Worker float _0_x = float(_uniforms.colorWhite.x); 141*c8dee2aaSAndroid Build Coastguard Worker _0_x = -_0_x; 142*c8dee2aaSAndroid Build Coastguard Worker _out.sk_FragColor = ((((((((_0_x == -1.0 && test_iscalar_b(_uniforms)) && test_fvec_b(_uniforms)) && test_ivec_b(_uniforms)) && test_mat2_b(_uniforms)) && test_mat3_b(_uniforms)) && test_mat4_b(_uniforms)) && test_hmat2_b(_uniforms)) && test_hmat3_b(_uniforms)) && test_hmat4_b(_uniforms) ? _uniforms.colorGreen : _uniforms.colorRed; 143*c8dee2aaSAndroid Build Coastguard Worker return _out; 144*c8dee2aaSAndroid Build Coastguard Worker} 145