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_scalar_X_mat2() { 8*c8dee2aaSAndroid Build Coastguard Worker float2x2 m, mm; 9*c8dee2aaSAndroid Build Coastguard Worker const float2x2 z = float2x2(0.0); 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker // Test meaningful matrix X no-op scalar. 12*c8dee2aaSAndroid Build Coastguard Worker m = testMatrix2x2 * 1; 13*c8dee2aaSAndroid Build Coastguard Worker m = 1 * testMatrix2x2; 14*c8dee2aaSAndroid Build Coastguard Worker m *= 1; 15*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix2x2) return false; 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker m = m / 1; 18*c8dee2aaSAndroid Build Coastguard Worker m /= 1; 19*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix2x2) return false; 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker m = m + 0; 22*c8dee2aaSAndroid Build Coastguard Worker m = 0 + m; 23*c8dee2aaSAndroid Build Coastguard Worker m += 0; 24*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix2x2) return false; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker m = m - 0; 27*c8dee2aaSAndroid Build Coastguard Worker m = 0 - m; // negates 28*c8dee2aaSAndroid Build Coastguard Worker m -= 0; 29*c8dee2aaSAndroid Build Coastguard Worker if (m != -testMatrix2x2) return false; 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker mm = m * 0; 32*c8dee2aaSAndroid Build Coastguard Worker mm = 0 * m; 33*c8dee2aaSAndroid Build Coastguard Worker return mm == z; 34*c8dee2aaSAndroid Build Coastguard Worker} 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_scalar_X_mat3() { 37*c8dee2aaSAndroid Build Coastguard Worker float3x3 m, mm; 38*c8dee2aaSAndroid Build Coastguard Worker const float3x3 z = float3x3(0.0); 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker // Test meaningful matrix X no-op scalar. 41*c8dee2aaSAndroid Build Coastguard Worker m = testMatrix3x3 * 1; 42*c8dee2aaSAndroid Build Coastguard Worker m = 1 * testMatrix3x3; 43*c8dee2aaSAndroid Build Coastguard Worker m *= 1; 44*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix3x3) return false; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker m = m / 1; 47*c8dee2aaSAndroid Build Coastguard Worker m /= 1; 48*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix3x3) return false; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker m = m + 0; 51*c8dee2aaSAndroid Build Coastguard Worker m = 0 + m; 52*c8dee2aaSAndroid Build Coastguard Worker m += 0; 53*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix3x3) return false; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker m = m - 0; 56*c8dee2aaSAndroid Build Coastguard Worker m = 0 - m; // negates 57*c8dee2aaSAndroid Build Coastguard Worker m -= 0; 58*c8dee2aaSAndroid Build Coastguard Worker if (m != -testMatrix3x3) return false; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker mm = m * 0; 61*c8dee2aaSAndroid Build Coastguard Worker mm = 0 * m; 62*c8dee2aaSAndroid Build Coastguard Worker return mm == z; 63*c8dee2aaSAndroid Build Coastguard Worker} 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_scalar_X_mat4() { 66*c8dee2aaSAndroid Build Coastguard Worker float4x4 testMatrix4x4 = float4x4(testInputs, testInputs, testInputs, testInputs); 67*c8dee2aaSAndroid Build Coastguard Worker float4x4 m, mm; 68*c8dee2aaSAndroid Build Coastguard Worker const float4x4 z = float4x4(0.0); 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker // Test meaningful matrix X no-op scalar. 71*c8dee2aaSAndroid Build Coastguard Worker m = testMatrix4x4 * 1; 72*c8dee2aaSAndroid Build Coastguard Worker m = 1 * testMatrix4x4; 73*c8dee2aaSAndroid Build Coastguard Worker m *= 1; 74*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix4x4) return false; 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker m = m / 1; 77*c8dee2aaSAndroid Build Coastguard Worker m /= 1; 78*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix4x4) return false; 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker m = m + 0; 81*c8dee2aaSAndroid Build Coastguard Worker m = 0 + m; 82*c8dee2aaSAndroid Build Coastguard Worker m += 0; 83*c8dee2aaSAndroid Build Coastguard Worker if (m != testMatrix4x4) return false; 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker m = m - 0; 86*c8dee2aaSAndroid Build Coastguard Worker m = 0 - m; // negates 87*c8dee2aaSAndroid Build Coastguard Worker m -= 0; 88*c8dee2aaSAndroid Build Coastguard Worker if (m != -testMatrix4x4) return false; 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker mm = m * 0; 91*c8dee2aaSAndroid Build Coastguard Worker mm = 0 * m; 92*c8dee2aaSAndroid Build Coastguard Worker return mm == z; 93*c8dee2aaSAndroid Build Coastguard Worker} 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_mat2_X_scalar() { 96*c8dee2aaSAndroid Build Coastguard Worker float2x2 m, mm; 97*c8dee2aaSAndroid Build Coastguard Worker const float2x2 i = float2x2(1.0); 98*c8dee2aaSAndroid Build Coastguard Worker const float2x2 z = float2x2(0.0); 99*c8dee2aaSAndroid Build Coastguard Worker const float2x2 s = float2x2(float4(1.0)); 100*c8dee2aaSAndroid Build Coastguard Worker float scalar = testInputs.x; 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker // These operations can be optimized, because multiplying a scalar across an identity matrix 103*c8dee2aaSAndroid Build Coastguard Worker // is conceptually the same as passing a scalar into the diagonal-matrix constructor. 104*c8dee2aaSAndroid Build Coastguard Worker m = scalar * i; 105*c8dee2aaSAndroid Build Coastguard Worker m = i * scalar; 106*c8dee2aaSAndroid Build Coastguard Worker if (m != float2x2(scalar)) return false; 107*c8dee2aaSAndroid Build Coastguard Worker 108*c8dee2aaSAndroid Build Coastguard Worker // These operations are left alone, as they splat the scalar across the matrix. 109*c8dee2aaSAndroid Build Coastguard Worker m = scalar / s; 110*c8dee2aaSAndroid Build Coastguard Worker if (m != float2x2(scalar, scalar, scalar, scalar)) return false; 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker m = scalar + z; 113*c8dee2aaSAndroid Build Coastguard Worker m = z + scalar; 114*c8dee2aaSAndroid Build Coastguard Worker if (m != float2x2(scalar, scalar, scalar, scalar)) return false; 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker m = scalar - z; 117*c8dee2aaSAndroid Build Coastguard Worker m = z - scalar; // splats `-scalar` across the matrix 118*c8dee2aaSAndroid Build Coastguard Worker if (m != -float2x2(scalar, scalar, scalar, scalar)) return false; 119*c8dee2aaSAndroid Build Coastguard Worker 120*c8dee2aaSAndroid Build Coastguard Worker mm = scalar * z; 121*c8dee2aaSAndroid Build Coastguard Worker mm = z * scalar; 122*c8dee2aaSAndroid Build Coastguard Worker return mm == z; 123*c8dee2aaSAndroid Build Coastguard Worker} 124*c8dee2aaSAndroid Build Coastguard Worker 125*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_mat3_X_scalar() { 126*c8dee2aaSAndroid Build Coastguard Worker float3x3 m, mm; 127*c8dee2aaSAndroid Build Coastguard Worker const float3x3 i = float3x3(1.0); 128*c8dee2aaSAndroid Build Coastguard Worker const float3x3 z = float3x3(0.0); 129*c8dee2aaSAndroid Build Coastguard Worker const float3x3 s = float3x3(float3(1.0), float3(1.0), float3(1.0)); 130*c8dee2aaSAndroid Build Coastguard Worker float scalar = testInputs.x; 131*c8dee2aaSAndroid Build Coastguard Worker float3 scalar3 = scalar.xxx; 132*c8dee2aaSAndroid Build Coastguard Worker 133*c8dee2aaSAndroid Build Coastguard Worker // These operations can be optimized, because multiplying a scalar across an identity matrix 134*c8dee2aaSAndroid Build Coastguard Worker // is conceptually the same as passing a scalar into the diagonal-matrix constructor. 135*c8dee2aaSAndroid Build Coastguard Worker m = scalar * i; 136*c8dee2aaSAndroid Build Coastguard Worker m = i * scalar; 137*c8dee2aaSAndroid Build Coastguard Worker if (m != float3x3(scalar)) return false; 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker // These operations are left alone, as they splat the scalar across the matrix. 140*c8dee2aaSAndroid Build Coastguard Worker m = scalar / s; 141*c8dee2aaSAndroid Build Coastguard Worker if (m != float3x3(scalar3, scalar3, scalar3)) return false; 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker m = scalar + z; 144*c8dee2aaSAndroid Build Coastguard Worker m = z + scalar; 145*c8dee2aaSAndroid Build Coastguard Worker if (m != float3x3(scalar3, scalar3, scalar3)) return false; 146*c8dee2aaSAndroid Build Coastguard Worker 147*c8dee2aaSAndroid Build Coastguard Worker m = scalar - z; 148*c8dee2aaSAndroid Build Coastguard Worker m = z - scalar; // splats `-scalar` across the matrix 149*c8dee2aaSAndroid Build Coastguard Worker if (m != -float3x3(scalar3, scalar3, scalar3)) return false; 150*c8dee2aaSAndroid Build Coastguard Worker 151*c8dee2aaSAndroid Build Coastguard Worker mm = scalar * z; 152*c8dee2aaSAndroid Build Coastguard Worker mm = z * scalar; 153*c8dee2aaSAndroid Build Coastguard Worker return mm == z; 154*c8dee2aaSAndroid Build Coastguard Worker} 155*c8dee2aaSAndroid Build Coastguard Worker 156*c8dee2aaSAndroid Build Coastguard Workerbool test_no_op_mat4_X_scalar() { 157*c8dee2aaSAndroid Build Coastguard Worker float4x4 m, mm; 158*c8dee2aaSAndroid Build Coastguard Worker const float4x4 i = float4x4(1.0); 159*c8dee2aaSAndroid Build Coastguard Worker const float4x4 z = float4x4(0.0); 160*c8dee2aaSAndroid Build Coastguard Worker const float4x4 s = float4x4(float4(1.0), float4(1.0), float4(1.0), float4(1.0)); 161*c8dee2aaSAndroid Build Coastguard Worker float scalar = testInputs.x; 162*c8dee2aaSAndroid Build Coastguard Worker float4 scalar4 = scalar.xxxx; 163*c8dee2aaSAndroid Build Coastguard Worker 164*c8dee2aaSAndroid Build Coastguard Worker // These operations can be optimized, because multiplying a scalar across an identity matrix 165*c8dee2aaSAndroid Build Coastguard Worker // is conceptually the same as passing a scalar into the diagonal-matrix constructor. 166*c8dee2aaSAndroid Build Coastguard Worker m = scalar * i; 167*c8dee2aaSAndroid Build Coastguard Worker m = i * scalar; 168*c8dee2aaSAndroid Build Coastguard Worker if (m != float4x4(scalar)) return false; 169*c8dee2aaSAndroid Build Coastguard Worker 170*c8dee2aaSAndroid Build Coastguard Worker // These operations are left alone, as they splat the scalar across the matrix. 171*c8dee2aaSAndroid Build Coastguard Worker m = scalar / s; 172*c8dee2aaSAndroid Build Coastguard Worker if (m != float4x4(scalar4, scalar4, scalar4, scalar4)) return false; 173*c8dee2aaSAndroid Build Coastguard Worker 174*c8dee2aaSAndroid Build Coastguard Worker m = scalar + z; 175*c8dee2aaSAndroid Build Coastguard Worker m = z + scalar; 176*c8dee2aaSAndroid Build Coastguard Worker if (m != float4x4(scalar4, scalar4, scalar4, scalar4)) return false; 177*c8dee2aaSAndroid Build Coastguard Worker 178*c8dee2aaSAndroid Build Coastguard Worker m = scalar - z; 179*c8dee2aaSAndroid Build Coastguard Worker m = z - scalar; // splats `-scalar` across the matrix 180*c8dee2aaSAndroid Build Coastguard Worker if (m != -float4x4(scalar4, scalar4, scalar4, scalar4)) return false; 181*c8dee2aaSAndroid Build Coastguard Worker 182*c8dee2aaSAndroid Build Coastguard Worker mm = scalar * z; 183*c8dee2aaSAndroid Build Coastguard Worker mm = z * scalar; 184*c8dee2aaSAndroid Build Coastguard Worker return mm == z; 185*c8dee2aaSAndroid Build Coastguard Worker} 186*c8dee2aaSAndroid Build Coastguard Worker 187*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) { 188*c8dee2aaSAndroid Build Coastguard Worker return test_no_op_scalar_X_mat2() && 189*c8dee2aaSAndroid Build Coastguard Worker test_no_op_scalar_X_mat3() && 190*c8dee2aaSAndroid Build Coastguard Worker test_no_op_scalar_X_mat4() && 191*c8dee2aaSAndroid Build Coastguard Worker test_no_op_mat2_X_scalar() && 192*c8dee2aaSAndroid Build Coastguard Worker test_no_op_mat3_X_scalar() && 193*c8dee2aaSAndroid Build Coastguard Worker test_no_op_mat4_X_scalar() ? colorGreen : colorRed; 194*c8dee2aaSAndroid Build Coastguard Worker} 195