xref: /aosp_15_r20/external/skia/resources/sksl/folding/VectorScalarFolding.rts (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorRed, colorGreen;
2*c8dee2aaSAndroid Build Coastguard Workeruniform half  unknownInput;
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard Workerbool test_half() {
5*c8dee2aaSAndroid Build Coastguard Worker    bool ok = true;
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Worker    // Vector op scalar
8*c8dee2aaSAndroid Build Coastguard Worker    half4 x = half4(half2(1), half2(2, 3)) + 5;
9*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(6, 6, 7, 8));
10*c8dee2aaSAndroid Build Coastguard Worker    x = half4(8, half3(10)) - 1;
11*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(7, 9, 9, 9));
12*c8dee2aaSAndroid Build Coastguard Worker    x = half4(half2(8), half2(9)) + 1;
13*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(9, 9, 10, 10));
14*c8dee2aaSAndroid Build Coastguard Worker    x.xyz = half3(2) * 3;
15*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(6, 6, 6, 10));
16*c8dee2aaSAndroid Build Coastguard Worker    x.xy = half2(12) / 4;
17*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(3, 3, 6, 10));
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker    // (Vector op scalar).swizzle
20*c8dee2aaSAndroid Build Coastguard Worker    x = (half4(12) / 2).yxwz;
21*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(6));
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker    // Scalar op vector
24*c8dee2aaSAndroid Build Coastguard Worker    x = 5 + half4(half2(1), half2(2, 3));
25*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(6, 6, 7, 8));
26*c8dee2aaSAndroid Build Coastguard Worker    x = 1 - half4(8, half3(10));
27*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(-7, -9, -9, -9));
28*c8dee2aaSAndroid Build Coastguard Worker    x = 1 + half4(half2(8), half2(9));
29*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(9, 9, 10, 10));
30*c8dee2aaSAndroid Build Coastguard Worker    x.xyz = 3 * half3(2);
31*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(6, 6, 6, 10));
32*c8dee2aaSAndroid Build Coastguard Worker    x.xy = 4 / half2(0.5);
33*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(8, 8, 6, 10));
34*c8dee2aaSAndroid Build Coastguard Worker    x = 20 / half4(10, 20, 40, 80);
35*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(2, 1, 0.5, 0.25));
36*c8dee2aaSAndroid Build Coastguard Worker
37*c8dee2aaSAndroid Build Coastguard Worker    // (Scalar op vector).swizzle
38*c8dee2aaSAndroid Build Coastguard Worker    x = (12 / half4(2)).yxwz;
39*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(6));
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker    // Vector op unknown scalar
42*c8dee2aaSAndroid Build Coastguard Worker    half  unknown = unknownInput;
43*c8dee2aaSAndroid Build Coastguard Worker    x = half4(0) + unknown;
44*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
45*c8dee2aaSAndroid Build Coastguard Worker    x = half4(0) * unknown;
46*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(0));
47*c8dee2aaSAndroid Build Coastguard Worker    x = half4(0) / unknown;
48*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(0));
49*c8dee2aaSAndroid Build Coastguard Worker    x = half4(1) * unknown;
50*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
51*c8dee2aaSAndroid Build Coastguard Worker
52*c8dee2aaSAndroid Build Coastguard Worker    // Unknown scalar op vector
53*c8dee2aaSAndroid Build Coastguard Worker    x = unknown * half4(1);
54*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
55*c8dee2aaSAndroid Build Coastguard Worker    x = unknown + half4(0);
56*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
57*c8dee2aaSAndroid Build Coastguard Worker    x = unknown - half4(0);
58*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
59*c8dee2aaSAndroid Build Coastguard Worker    x = unknown / half4(1);
60*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
61*c8dee2aaSAndroid Build Coastguard Worker
62*c8dee2aaSAndroid Build Coastguard Worker    // Scalar op unknown vector
63*c8dee2aaSAndroid Build Coastguard Worker    x = 0 + half4(unknown);
64*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
65*c8dee2aaSAndroid Build Coastguard Worker    x = 0 * half4(unknown);
66*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(0));
67*c8dee2aaSAndroid Build Coastguard Worker    x = 0 / half4(unknown);  // this should NOT optimize away
68*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(0));
69*c8dee2aaSAndroid Build Coastguard Worker    x = 1 * half4(unknown);
70*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard Worker    // X = Unknown op scalar
73*c8dee2aaSAndroid Build Coastguard Worker    x = half4(unknown) + 0;
74*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
75*c8dee2aaSAndroid Build Coastguard Worker    x = half4(unknown) * 0;
76*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(0));
77*c8dee2aaSAndroid Build Coastguard Worker    x = half4(unknown) * 1;
78*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
79*c8dee2aaSAndroid Build Coastguard Worker    x = half4(unknown) - 0;
80*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard Worker    // X op= scalar.
83*c8dee2aaSAndroid Build Coastguard Worker    x = half4(unknown);
84*c8dee2aaSAndroid Build Coastguard Worker    x += 1;
85*c8dee2aaSAndroid Build Coastguard Worker    x += 0;
86*c8dee2aaSAndroid Build Coastguard Worker    x -= 1;
87*c8dee2aaSAndroid Build Coastguard Worker    x -= 0;
88*c8dee2aaSAndroid Build Coastguard Worker    x *= 1;
89*c8dee2aaSAndroid Build Coastguard Worker    x /= 1;
90*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
91*c8dee2aaSAndroid Build Coastguard Worker
92*c8dee2aaSAndroid Build Coastguard Worker    // X = X op scalar.
93*c8dee2aaSAndroid Build Coastguard Worker    x = half4(unknown);
94*c8dee2aaSAndroid Build Coastguard Worker    x = x + 1;
95*c8dee2aaSAndroid Build Coastguard Worker    x = x + 0;
96*c8dee2aaSAndroid Build Coastguard Worker    x = x - 1;
97*c8dee2aaSAndroid Build Coastguard Worker    x = x - 0;
98*c8dee2aaSAndroid Build Coastguard Worker    x = x * 1;
99*c8dee2aaSAndroid Build Coastguard Worker    x = x / 1;
100*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == half4(unknown));
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Worker    return ok;
103*c8dee2aaSAndroid Build Coastguard Worker}
104*c8dee2aaSAndroid Build Coastguard Worker
105*c8dee2aaSAndroid Build Coastguard Workerbool test_int() {
106*c8dee2aaSAndroid Build Coastguard Worker    bool ok = true;
107*c8dee2aaSAndroid Build Coastguard Worker
108*c8dee2aaSAndroid Build Coastguard Worker    // Vector op scalar
109*c8dee2aaSAndroid Build Coastguard Worker    int4 x = int4(int2(1), int2(2, 3)) + 5;
110*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(6, 6, 7, 8));
111*c8dee2aaSAndroid Build Coastguard Worker    x = int4(8, int3(10)) - 1;
112*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(7, 9, 9, 9));
113*c8dee2aaSAndroid Build Coastguard Worker    x = int4(int2(8), int2(9)) + 1;
114*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(9, 9, 10, 10));
115*c8dee2aaSAndroid Build Coastguard Worker    x.xyz = int3(2) * 3;
116*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(6, 6, 6, 10));
117*c8dee2aaSAndroid Build Coastguard Worker    x.xy = int2(12) / 4;
118*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(3, 3, 6, 10));
119*c8dee2aaSAndroid Build Coastguard Worker
120*c8dee2aaSAndroid Build Coastguard Worker    // (Vector op scalar).swizzle
121*c8dee2aaSAndroid Build Coastguard Worker    x = (int4(12) / 2).yxwz;
122*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(6));
123*c8dee2aaSAndroid Build Coastguard Worker
124*c8dee2aaSAndroid Build Coastguard Worker    // Scalar op vector
125*c8dee2aaSAndroid Build Coastguard Worker    x = 5 + int4(int2(1), int2(2, 3));
126*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(6, 6, 7, 8));
127*c8dee2aaSAndroid Build Coastguard Worker    x = 1 - int4(8, int3(10));
128*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(-7, -9, -9, -9));
129*c8dee2aaSAndroid Build Coastguard Worker    x = 1 + int4(int2(8), int2(9));
130*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(9, 9, 10, 10));
131*c8dee2aaSAndroid Build Coastguard Worker    x.xyz = 3 * int3(2);
132*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(6, 6, 6, 10));
133*c8dee2aaSAndroid Build Coastguard Worker    x.xy = 16 / int2(2);
134*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(8, 8, 6, 10));
135*c8dee2aaSAndroid Build Coastguard Worker    x = 2000 / int4(10, 20, 40, 80);
136*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(200, 100, 50, 25));
137*c8dee2aaSAndroid Build Coastguard Worker
138*c8dee2aaSAndroid Build Coastguard Worker    // (Scalar op vector).swizzle
139*c8dee2aaSAndroid Build Coastguard Worker    x = (12 / int4(2)).yxwz;
140*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(6));
141*c8dee2aaSAndroid Build Coastguard Worker
142*c8dee2aaSAndroid Build Coastguard Worker    // Vector op unknown scalar
143*c8dee2aaSAndroid Build Coastguard Worker    int  unknown = int(unknownInput);
144*c8dee2aaSAndroid Build Coastguard Worker    x = int4(0) + unknown;
145*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
146*c8dee2aaSAndroid Build Coastguard Worker    x = int4(0) * unknown;
147*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(0));
148*c8dee2aaSAndroid Build Coastguard Worker    x = int4(0) / unknown;
149*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(0));
150*c8dee2aaSAndroid Build Coastguard Worker    x = int4(1) * unknown;
151*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
152*c8dee2aaSAndroid Build Coastguard Worker
153*c8dee2aaSAndroid Build Coastguard Worker    // Unknown scalar op vector
154*c8dee2aaSAndroid Build Coastguard Worker    x = unknown * int4(1);
155*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
156*c8dee2aaSAndroid Build Coastguard Worker    x = unknown + int4(0);
157*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
158*c8dee2aaSAndroid Build Coastguard Worker    x = unknown - int4(0);
159*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
160*c8dee2aaSAndroid Build Coastguard Worker    x = unknown / int4(1);
161*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
162*c8dee2aaSAndroid Build Coastguard Worker
163*c8dee2aaSAndroid Build Coastguard Worker    // Scalar op unknown vector
164*c8dee2aaSAndroid Build Coastguard Worker    x = 0 + int4(unknown);
165*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
166*c8dee2aaSAndroid Build Coastguard Worker    x = 0 * int4(unknown);
167*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(0));
168*c8dee2aaSAndroid Build Coastguard Worker    x = 0 / int4(unknown);
169*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(0));
170*c8dee2aaSAndroid Build Coastguard Worker    x = 1 * int4(unknown);
171*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
172*c8dee2aaSAndroid Build Coastguard Worker
173*c8dee2aaSAndroid Build Coastguard Worker    // Unknown vector op scalar
174*c8dee2aaSAndroid Build Coastguard Worker    x = int4(unknown) + 0;
175*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
176*c8dee2aaSAndroid Build Coastguard Worker    x = int4(unknown) * 0;
177*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(0));
178*c8dee2aaSAndroid Build Coastguard Worker    x = int4(unknown) * 1;
179*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
180*c8dee2aaSAndroid Build Coastguard Worker    x = int4(unknown) - 0;
181*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
182*c8dee2aaSAndroid Build Coastguard Worker
183*c8dee2aaSAndroid Build Coastguard Worker    // X op= scalar.
184*c8dee2aaSAndroid Build Coastguard Worker    x = int4(unknown);
185*c8dee2aaSAndroid Build Coastguard Worker    x += 1;
186*c8dee2aaSAndroid Build Coastguard Worker    x += 0;
187*c8dee2aaSAndroid Build Coastguard Worker    x -= 1;
188*c8dee2aaSAndroid Build Coastguard Worker    x -= 0;
189*c8dee2aaSAndroid Build Coastguard Worker    x *= 1;
190*c8dee2aaSAndroid Build Coastguard Worker    x /= 1;
191*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
192*c8dee2aaSAndroid Build Coastguard Worker
193*c8dee2aaSAndroid Build Coastguard Worker    // X = X op scalar.
194*c8dee2aaSAndroid Build Coastguard Worker    x = int4(unknown);
195*c8dee2aaSAndroid Build Coastguard Worker    x = x + 1;
196*c8dee2aaSAndroid Build Coastguard Worker    x = x + 0;
197*c8dee2aaSAndroid Build Coastguard Worker    x = x - 1;
198*c8dee2aaSAndroid Build Coastguard Worker    x = x - 0;
199*c8dee2aaSAndroid Build Coastguard Worker    x = x * 1;
200*c8dee2aaSAndroid Build Coastguard Worker    x = x / 1;
201*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && (x == int4(unknown));
202*c8dee2aaSAndroid Build Coastguard Worker
203*c8dee2aaSAndroid Build Coastguard Worker    return ok;
204*c8dee2aaSAndroid Build Coastguard Worker}
205*c8dee2aaSAndroid Build Coastguard Worker
206*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) {
207*c8dee2aaSAndroid Build Coastguard Worker    return test_half() && test_int() ? colorGreen : colorRed;
208*c8dee2aaSAndroid Build Coastguard Worker}
209