1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorRed, colorGreen; 2*c8dee2aaSAndroid Build Coastguard Worker 3*c8dee2aaSAndroid Build Coastguard Workerbool test_matrix_op_matrix_float() { 4*c8dee2aaSAndroid Build Coastguard Worker bool ok = true; 5*c8dee2aaSAndroid Build Coastguard Worker 6*c8dee2aaSAndroid Build Coastguard Worker // Addition, subtraction and division operate componentwise. 7*c8dee2aaSAndroid Build Coastguard Worker { 8*c8dee2aaSAndroid Build Coastguard Worker const float3x3 splat_4 = float3x3(4, 4, 4, 4, 4, 4, 4, 4, 4); 9*c8dee2aaSAndroid Build Coastguard Worker const float3x3 splat_2 = float3x3(2, 2, 2, 2, 2, 2, 2, 2, 2); 10*c8dee2aaSAndroid Build Coastguard Worker float3x3 m; 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker m = float3x3(2); m += splat_4; ok = ok && (m == float3x3(6, 4, 4, 4, 6, 4, 4, 4, 6)); 13*c8dee2aaSAndroid Build Coastguard Worker m = float3x3(2); m -= splat_4; ok = ok && (m == float3x3(-2,-4,-4,-4,-2,-4,-4,-4,-2)); 14*c8dee2aaSAndroid Build Coastguard Worker m = float3x3(2); m /= splat_4; ok = ok && (m == float3x3(0.5)); 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker m = splat_4; m += float3x3(2); ok = ok && (m == float3x3(6, 4, 4, 4, 6, 4, 4, 4, 6)); 17*c8dee2aaSAndroid Build Coastguard Worker m = splat_4; m -= float3x3(2); ok = ok && (m == float3x3(2, 4, 4, 4, 2, 4, 4, 4, 2)); 18*c8dee2aaSAndroid Build Coastguard Worker m = splat_4; m /= splat_2; ok = ok && (m == float3x3(2, 2, 2, 2, 2, 2, 2, 2 ,2)); 19*c8dee2aaSAndroid Build Coastguard Worker } 20*c8dee2aaSAndroid Build Coastguard Worker { 21*c8dee2aaSAndroid Build Coastguard Worker float4x4 m = float4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); 22*c8dee2aaSAndroid Build Coastguard Worker m += float4x4(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1); 23*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == float4x4(17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17)); 24*c8dee2aaSAndroid Build Coastguard Worker } 25*c8dee2aaSAndroid Build Coastguard Worker { 26*c8dee2aaSAndroid Build Coastguard Worker float2x2 m = float2x2(10, 20, 30, 40); 27*c8dee2aaSAndroid Build Coastguard Worker m -= float2x2(1, 2, 3, 4); 28*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == float2x2(9, 18, 27, 36)); 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker { 31*c8dee2aaSAndroid Build Coastguard Worker float2x2 m = float2x2(2, 4, 6, 8); 32*c8dee2aaSAndroid Build Coastguard Worker m /= float2x2(2, 2, 2, 4); 33*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == float2x2(1, 2, 3, 2)); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker // Multiplication performs a proper matrix multiply. 37*c8dee2aaSAndroid Build Coastguard Worker { 38*c8dee2aaSAndroid Build Coastguard Worker float2x2 m = float2x2(1, 2, 7, 4); 39*c8dee2aaSAndroid Build Coastguard Worker m *= float2x2(3, 5, 3, 2); 40*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == float2x2(38, 26, 17, 14)); 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker { 43*c8dee2aaSAndroid Build Coastguard Worker float3x3 m = float3x3(10, 4, 2, 20, 5, 3, 10, 6, 5); 44*c8dee2aaSAndroid Build Coastguard Worker m *= float3x3(3, 3, 4, 2, 3, 4, 4, 9, 2); 45*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == float3x3(130, 51, 35, 120, 47, 33, 240, 73, 45)); 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker return ok; 49*c8dee2aaSAndroid Build Coastguard Worker} 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Workerbool test_matrix_op_matrix_half() { 52*c8dee2aaSAndroid Build Coastguard Worker bool ok = true; 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker // Addition, subtraction and division operate componentwise. 55*c8dee2aaSAndroid Build Coastguard Worker { 56*c8dee2aaSAndroid Build Coastguard Worker const half3x3 splat_4 = half3x3(4, 4, 4, 4, 4, 4, 4, 4, 4); 57*c8dee2aaSAndroid Build Coastguard Worker const half3x3 splat_2 = half3x3(2, 2, 2, 2, 2, 2, 2, 2, 2); 58*c8dee2aaSAndroid Build Coastguard Worker half3x3 m; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker m = half3x3(2); m += splat_4; ok = ok && (m == half3x3(6, 4, 4, 4, 6, 4, 4, 4, 6)); 61*c8dee2aaSAndroid Build Coastguard Worker m = half3x3(2); m -= splat_4; ok = ok && (m == half3x3(-2,-4,-4,-4,-2,-4,-4,-4,-2)); 62*c8dee2aaSAndroid Build Coastguard Worker m = half3x3(2); m /= splat_4; ok = ok && (m == half3x3(0.5)); 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker m = splat_4; m += half3x3(2); ok = ok && (m == half3x3(6, 4, 4, 4, 6, 4, 4, 4, 6)); 65*c8dee2aaSAndroid Build Coastguard Worker m = splat_4; m -= half3x3(2); ok = ok && (m == half3x3(2, 4, 4, 4, 2, 4, 4, 4, 2)); 66*c8dee2aaSAndroid Build Coastguard Worker m = splat_4; m /= splat_2; ok = ok && (m == half3x3(2, 2, 2, 2, 2, 2, 2, 2 ,2)); 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker { 69*c8dee2aaSAndroid Build Coastguard Worker half4x4 m = half4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); 70*c8dee2aaSAndroid Build Coastguard Worker m += half4x4(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1); 71*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == half4x4(17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17)); 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker { 74*c8dee2aaSAndroid Build Coastguard Worker half2x2 m = half2x2(10, 20, 30, 40); 75*c8dee2aaSAndroid Build Coastguard Worker m -= half2x2(1, 2, 3, 4); 76*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == half2x2(9, 18, 27, 36)); 77*c8dee2aaSAndroid Build Coastguard Worker } 78*c8dee2aaSAndroid Build Coastguard Worker { 79*c8dee2aaSAndroid Build Coastguard Worker half2x2 m = half2x2(2, 4, 6, 8); 80*c8dee2aaSAndroid Build Coastguard Worker m /= half2x2(2, 2, 2, 4); 81*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == half2x2(1, 2, 3, 2)); 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker // Multiplication performs a proper matrix multiply. 85*c8dee2aaSAndroid Build Coastguard Worker { 86*c8dee2aaSAndroid Build Coastguard Worker half2x2 m = half2x2(1, 2, 7, 4); 87*c8dee2aaSAndroid Build Coastguard Worker m *= half2x2(3, 5, 3, 2); 88*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == half2x2(38, 26, 17, 14)); 89*c8dee2aaSAndroid Build Coastguard Worker } 90*c8dee2aaSAndroid Build Coastguard Worker { 91*c8dee2aaSAndroid Build Coastguard Worker half3x3 m = half3x3(10, 4, 2, 20, 5, 3, 10, 6, 5); 92*c8dee2aaSAndroid Build Coastguard Worker m *= half3x3(3, 3, 4, 2, 3, 4, 4, 9, 2); 93*c8dee2aaSAndroid Build Coastguard Worker ok = ok && (m == half3x3(130, 51, 35, 120, 47, 33, 240, 73, 45)); 94*c8dee2aaSAndroid Build Coastguard Worker } 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker return ok; 97*c8dee2aaSAndroid Build Coastguard Worker} 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) { 100*c8dee2aaSAndroid Build Coastguard Worker return (test_matrix_op_matrix_float() && test_matrix_op_matrix_half()) ? colorGreen : colorRed; 101*c8dee2aaSAndroid Build Coastguard Worker} 102