1*c8dee2aaSAndroid Build Coastguard Workeruniform float2x2 testMatrix2x2; 2*c8dee2aaSAndroid Build Coastguard Workeruniform float3x3 testMatrix3x3; 3*c8dee2aaSAndroid Build Coastguard Workeruniform float4 testInputs; 4*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorRed, colorGreen; 5*c8dee2aaSAndroid Build Coastguard Workeruniform half unknownInput; 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_mat2_X_vec2() { 8*c8dee2aaSAndroid Build Coastguard Worker const float2x2 i = float2x2(1.0); 9*c8dee2aaSAndroid Build Coastguard Worker const float2x2 z = float2x2(0.0); 10*c8dee2aaSAndroid Build Coastguard Worker const float2x2 n = float2x2(-1.0); 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker float2 v, vv; 13*c8dee2aaSAndroid Build Coastguard Worker v = testInputs.xy * i; 14*c8dee2aaSAndroid Build Coastguard Worker v = i * testInputs.xy; 15*c8dee2aaSAndroid Build Coastguard Worker if (v != testInputs.xy) return false; 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker v = v * i; 18*c8dee2aaSAndroid Build Coastguard Worker v = i * v; 19*c8dee2aaSAndroid Build Coastguard Worker v *= i; 20*c8dee2aaSAndroid Build Coastguard Worker if (v != testInputs.xy) return false; 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker v = testInputs.xy * n; 23*c8dee2aaSAndroid Build Coastguard Worker v = n * testInputs.xy; 24*c8dee2aaSAndroid Build Coastguard Worker if (v != -testInputs.xy) return false; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker vv = v * z; 27*c8dee2aaSAndroid Build Coastguard Worker vv = z * v; 28*c8dee2aaSAndroid Build Coastguard Worker return vv == z[0]; 29*c8dee2aaSAndroid Build Coastguard Worker} 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_mat3_X_vec3() { 32*c8dee2aaSAndroid Build Coastguard Worker const float3x3 i = float3x3(1.0); 33*c8dee2aaSAndroid Build Coastguard Worker const float3x3 z = float3x3(0.0); 34*c8dee2aaSAndroid Build Coastguard Worker const float3x3 n = float3x3(-1.0); 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker float3 v, vv; 37*c8dee2aaSAndroid Build Coastguard Worker v = testInputs.xyz * i; 38*c8dee2aaSAndroid Build Coastguard Worker v = i * testInputs.xyz; 39*c8dee2aaSAndroid Build Coastguard Worker if (v != testInputs.xyz) return false; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker v = v * i; 42*c8dee2aaSAndroid Build Coastguard Worker v = i * v; 43*c8dee2aaSAndroid Build Coastguard Worker v *= i; 44*c8dee2aaSAndroid Build Coastguard Worker if (v != testInputs.xyz) return false; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker v = testInputs.xyz * n; 47*c8dee2aaSAndroid Build Coastguard Worker v = n * testInputs.xyz; 48*c8dee2aaSAndroid Build Coastguard Worker if (v != -testInputs.xyz) return false; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker vv = v * z; 51*c8dee2aaSAndroid Build Coastguard Worker vv = z * v; 52*c8dee2aaSAndroid Build Coastguard Worker return vv == z[0]; 53*c8dee2aaSAndroid Build Coastguard Worker} 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_mat4_X_vec4() { 56*c8dee2aaSAndroid Build Coastguard Worker const float4x4 i = float4x4(1.0); 57*c8dee2aaSAndroid Build Coastguard Worker const float4x4 z = float4x4(0.0); 58*c8dee2aaSAndroid Build Coastguard Worker const float4x4 n = float4x4(-1.0); 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker float4 v, vv; 61*c8dee2aaSAndroid Build Coastguard Worker v = testInputs * i; 62*c8dee2aaSAndroid Build Coastguard Worker v = i * testInputs; 63*c8dee2aaSAndroid Build Coastguard Worker if (v != testInputs) return false; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker v = v * i; 66*c8dee2aaSAndroid Build Coastguard Worker v = i * v; 67*c8dee2aaSAndroid Build Coastguard Worker v *= i; 68*c8dee2aaSAndroid Build Coastguard Worker if (v != testInputs) return false; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker v = testInputs * n; 71*c8dee2aaSAndroid Build Coastguard Worker v = n * testInputs; 72*c8dee2aaSAndroid Build Coastguard Worker if (v != -testInputs) return false; 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker vv = v * z; 75*c8dee2aaSAndroid Build Coastguard Worker vv = z * v; 76*c8dee2aaSAndroid Build Coastguard Worker return vv == z[0]; 77*c8dee2aaSAndroid Build Coastguard Worker} 78*c8dee2aaSAndroid Build Coastguard Worker 79*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_vec2_X_mat2() { 80*c8dee2aaSAndroid Build Coastguard Worker const float2 n = float2(-1.0); 81*c8dee2aaSAndroid Build Coastguard Worker const float2 i = float2(1.0); 82*c8dee2aaSAndroid Build Coastguard Worker const float2 z = float2(0.0); 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker // These operations can be optimized; multiplying a zero vector across any matrix always results 85*c8dee2aaSAndroid Build Coastguard Worker // in a zero vector. 86*c8dee2aaSAndroid Build Coastguard Worker float2 v, vv; 87*c8dee2aaSAndroid Build Coastguard Worker vv = z * testMatrix2x2; 88*c8dee2aaSAndroid Build Coastguard Worker vv = testMatrix2x2 * z; 89*c8dee2aaSAndroid Build Coastguard Worker if (vv != z) return false; 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker // These operations can't be simplified; they do real work. 92*c8dee2aaSAndroid Build Coastguard Worker v = i * testMatrix2x2; 93*c8dee2aaSAndroid Build Coastguard Worker if (v != float2(3, 7)) return false; 94*c8dee2aaSAndroid Build Coastguard Worker v = testMatrix2x2 * i; 95*c8dee2aaSAndroid Build Coastguard Worker if (v != float2(4, 6)) return false; 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker v = n * testMatrix2x2; 98*c8dee2aaSAndroid Build Coastguard Worker if (v != -float2(3, 7)) return false; 99*c8dee2aaSAndroid Build Coastguard Worker v = testMatrix2x2 * n; 100*c8dee2aaSAndroid Build Coastguard Worker return v == -float2(4, 6); 101*c8dee2aaSAndroid Build Coastguard Worker} 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_vec3_X_mat3() { 104*c8dee2aaSAndroid Build Coastguard Worker const float3 n = float3(-1.0); 105*c8dee2aaSAndroid Build Coastguard Worker const float3 i = float3(1.0); 106*c8dee2aaSAndroid Build Coastguard Worker const float3 z = float3(0.0); 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker // These operations can be optimized; multiplying a zero vector across any matrix always results 109*c8dee2aaSAndroid Build Coastguard Worker // in a zero vector. 110*c8dee2aaSAndroid Build Coastguard Worker float3 v, vv; 111*c8dee2aaSAndroid Build Coastguard Worker vv = z * testMatrix3x3; 112*c8dee2aaSAndroid Build Coastguard Worker vv = testMatrix3x3 * z; 113*c8dee2aaSAndroid Build Coastguard Worker if (vv != z) return false; 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker // These operations can't be simplified; they do real work. 116*c8dee2aaSAndroid Build Coastguard Worker v = i * testMatrix3x3; 117*c8dee2aaSAndroid Build Coastguard Worker if (v != float3(6, 15, 24)) return false; 118*c8dee2aaSAndroid Build Coastguard Worker v = testMatrix3x3 * i; 119*c8dee2aaSAndroid Build Coastguard Worker if (v != float3(12, 15, 18)) return false; 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker v = n * testMatrix3x3; 122*c8dee2aaSAndroid Build Coastguard Worker if (v != -float3(6, 15, 24)) return false; 123*c8dee2aaSAndroid Build Coastguard Worker v = testMatrix3x3 * n; 124*c8dee2aaSAndroid Build Coastguard Worker return v == -float3(12, 15, 18); 125*c8dee2aaSAndroid Build Coastguard Worker} 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_vec4_X_mat4() { 128*c8dee2aaSAndroid Build Coastguard Worker const float4 n = float4(-1.0); 129*c8dee2aaSAndroid Build Coastguard Worker const float4 i = float4(1.0); 130*c8dee2aaSAndroid Build Coastguard Worker const float4 z = float4(0.0); 131*c8dee2aaSAndroid Build Coastguard Worker float4x4 testMatrix4x4 = float4x4(testMatrix2x2[0], testMatrix2x2[1], 132*c8dee2aaSAndroid Build Coastguard Worker testMatrix2x2[0], testMatrix2x2[1], 133*c8dee2aaSAndroid Build Coastguard Worker testMatrix2x2[0], testMatrix2x2[1], 134*c8dee2aaSAndroid Build Coastguard Worker testMatrix2x2[0], testMatrix2x2[1]); 135*c8dee2aaSAndroid Build Coastguard Worker 136*c8dee2aaSAndroid Build Coastguard Worker // These operations can be optimized; multiplying a zero vector across any matrix always results 137*c8dee2aaSAndroid Build Coastguard Worker // in a zero vector. 138*c8dee2aaSAndroid Build Coastguard Worker float4 v, vv; 139*c8dee2aaSAndroid Build Coastguard Worker vv = z * testMatrix4x4; 140*c8dee2aaSAndroid Build Coastguard Worker vv = testMatrix4x4 * z; 141*c8dee2aaSAndroid Build Coastguard Worker if (vv != z) return false; 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker // These operations can't be simplified; they do real work. 144*c8dee2aaSAndroid Build Coastguard Worker v = i * testMatrix4x4; 145*c8dee2aaSAndroid Build Coastguard Worker if (v != float4(10, 10, 10, 10)) return false; 146*c8dee2aaSAndroid Build Coastguard Worker v = testMatrix4x4 * i; 147*c8dee2aaSAndroid Build Coastguard Worker if (v != float4(4, 8, 12, 16)) return false; 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker v = n * testMatrix4x4; 150*c8dee2aaSAndroid Build Coastguard Worker if (v != -float4(10, 10, 10, 10)) return false; 151*c8dee2aaSAndroid Build Coastguard Worker v = testMatrix4x4 * n; 152*c8dee2aaSAndroid Build Coastguard Worker return v == -float4(4, 8, 12, 16); 153*c8dee2aaSAndroid Build Coastguard Worker} 154*c8dee2aaSAndroid Build Coastguard Worker 155*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) { 156*c8dee2aaSAndroid Build Coastguard Worker return test_no_op_mat2_X_vec2() && 157*c8dee2aaSAndroid Build Coastguard Worker test_no_op_mat3_X_vec3() && 158*c8dee2aaSAndroid Build Coastguard Worker test_no_op_mat4_X_vec4() && 159*c8dee2aaSAndroid Build Coastguard Worker test_no_op_vec2_X_mat2() && 160*c8dee2aaSAndroid Build Coastguard Worker test_no_op_vec3_X_mat3() && 161*c8dee2aaSAndroid Build Coastguard Worker test_no_op_vec4_X_mat4() ? colorGreen : colorRed; 162*c8dee2aaSAndroid Build Coastguard Worker} 163