xref: /aosp_15_r20/external/skia/resources/sksl/shared/MatrixEquality.sksl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen, colorRed;
2*c8dee2aaSAndroid Build Coastguard Workeruniform half2x2 testMatrix2x2;
3*c8dee2aaSAndroid Build Coastguard Workeruniform half3x3 testMatrix3x3;
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Workerbool test_equality() {
6*c8dee2aaSAndroid Build Coastguard Worker    bool ok = true;
7*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && testMatrix2x2 == half2x2(1,2,3,4);
8*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && testMatrix3x3 == half3x3(1,2,3,4,5,6,7,8,9);
9*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && testMatrix2x2 != half2x2(100);
10*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && testMatrix3x3 != half3x3(9,8,7,6,5,4,3,2,1);
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Worker    // Similar tests (focused on constant-folding) can also be found in folding/MatrixFoldingES2.
13*c8dee2aaSAndroid Build Coastguard Worker    float zero = colorGreen.r;
14*c8dee2aaSAndroid Build Coastguard Worker    float one  = colorGreen.g;
15*c8dee2aaSAndroid Build Coastguard Worker    float two  = 2 * one;
16*c8dee2aaSAndroid Build Coastguard Worker    float nine = 9 * one;
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float2x2(float2(one, zero), float2(zero, one)) ==
19*c8dee2aaSAndroid Build Coastguard Worker                 float2x2(float2(1.0, 0.0),  float2(0.0, 1.0)));
20*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && !(float2x2(float2(one, zero), float2(one, one)) ==
21*c8dee2aaSAndroid Build Coastguard Worker                 float2x2(float2(1.0, 0.0),  float2(0.0, 1.0)));
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  ( float2x2(one)  == float2x2(1));
24*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && !( float2x2(one)  == float2x2(0));
25*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  ( float2x2(-one) == -float2x2(1));
26*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  ( float2x2(zero) == -float2x2(0));
27*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (-float2x2(-one) ==  float2x2(1));
28*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (-float2x2(zero) == -float2x2(-0));
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float2x2(one) == float2x2(float2(1.0, 0.0), float2(0.0, 1.0)));
31*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && !(float2x2(two) == float2x2(float2(1.0, 0.0), float2(0.0, 1.0)));
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && !(float2x2(one) != float2x2(1));
34*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float2x2(one) != float2x2(0));
35*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float3x3(float3(one,zero,zero), float3(zero,one,zero), float3(zero,zero,one)) ==
36*c8dee2aaSAndroid Build Coastguard Worker                 float3x3(float2x2(1.0)));
37*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float3x3(float3(nine,zero,zero), float3(zero,nine,zero), float3(zero,zero,one)) ==
38*c8dee2aaSAndroid Build Coastguard Worker                 float3x3(float2x2(9.0)));
39*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float3x3(one) == float3x3(float2x2(1.0)));
40*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float3x3(float3(nine).x00, float3(nine).0x0, float3(one).00x) ==
41*c8dee2aaSAndroid Build Coastguard Worker                 float3x3(float2x2(9.0)));
42*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float2x2(float3x3(one)) == float2x2(1.0));
43*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float2x2(float3x3(one)) == float2x2(1.0));
44*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float2x2(float4(one, zero, zero, one)) == float2x2(1.0));
45*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float2x2(one, zero, float2(zero, one)) == float2x2(1.0));
46*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float2x2(float2(one, zero), zero, one) == float2x2(1.0));
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float4(testMatrix2x2) * float4(one))  == float4(1, 2, 3, 4);
49*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float4(testMatrix2x2) * float4(one))  == float4(testMatrix2x2);
50*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (float4(testMatrix2x2) * float4(zero)) == float4(0);
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker    // TODO: enable this section when RP index expressions are more flexible
53*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float2x2(nine)[0] == float2(9.0, 0.0));
54*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float2x2(nine)[1] == float2(0.0, 9.0));
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float2x2(nine)[0][0] == 9.0);
57*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float2x2(nine)[0][1] == 0.0);
58*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float2x2(nine)[1][0] == 0.0);
59*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float2x2(nine)[1][1] == 9.0);
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker    float3x3 m = float3x3(one, two, 3, 4, 5, 6, 7, 8, nine);
62*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[0] == float3(1, 2, 3));
63*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[1] == float3(4, 5, 6));
64*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[2] == float3(7, 8, 9));
65*c8dee2aaSAndroid Build Coastguard Worker
66*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[0][0] == 1);
67*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[0][1] == 2);
68*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[0][2] == 3);
69*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[1][0] == 4);
70*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[1][1] == 5);
71*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[1][2] == 6);
72*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[2][0] == 7);
73*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[2][1] == 8);
74*c8dee2aaSAndroid Build Coastguard Worker    ok = ok &&  (m[2][2] == 9);
75*c8dee2aaSAndroid Build Coastguard Worker
76*c8dee2aaSAndroid Build Coastguard Worker    // TODO: enable this section when RP index expressions are more flexible
77*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float3x3(one, two, 3, 4, 5, 6, 7, 8, nine)[0] == float3(1, 2, 3));
78*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float3x3(one, two, 3, 4, 5, 6, 7, 8, nine)[1] == float3(4, 5, 6));
79*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok &&  (float3x3(one, two, 3, 4, 5, 6, 7, 8, nine)[2] == float3(7, 8, 9));
80*c8dee2aaSAndroid Build Coastguard Worker//
81*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok && float4x4(half3x3(testMatrix2x2))[0] == float4(one,   two, zero, zero);
82*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok && float4x4(half3x3(testMatrix2x2))[1] == float4(  3,     4, zero, zero);
83*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok && float4x4(half3x3(testMatrix2x2))[2] == float4(zero, zero,  one, zero);
84*c8dee2aaSAndroid Build Coastguard Worker//  ok = ok && float4x4(half3x3(testMatrix2x2))[3] == float4(zero, zero, zero,  one);
85*c8dee2aaSAndroid Build Coastguard Worker
86*c8dee2aaSAndroid Build Coastguard Worker    return ok;
87*c8dee2aaSAndroid Build Coastguard Worker}
88*c8dee2aaSAndroid Build Coastguard Worker
89*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) {
90*c8dee2aaSAndroid Build Coastguard Worker    return test_equality() ? colorGreen : colorRed;
91*c8dee2aaSAndroid Build Coastguard Worker}
92