xref: /aosp_15_r20/external/skia/resources/sksl/folding/StructFieldFolding.rts (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorRed, colorGreen;
2*c8dee2aaSAndroid Build Coastguard Worker
3*c8dee2aaSAndroid Build Coastguard Workerstruct S {
4*c8dee2aaSAndroid Build Coastguard Worker    int a, b, c;
5*c8dee2aaSAndroid Build Coastguard Worker};
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Workervoid check_array_1(int[1]) {}
8*c8dee2aaSAndroid Build Coastguard Workervoid check_array_2(int[2]) {}
9*c8dee2aaSAndroid Build Coastguard Workervoid check_array_3(int[3]) {}
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Workerbool test() {
12*c8dee2aaSAndroid Build Coastguard Worker    const S x  = S(1, 2, 3);
13*c8dee2aaSAndroid Build Coastguard Worker    const S xx = S(1, 2, 3);
14*c8dee2aaSAndroid Build Coastguard Worker    const S y  = S(1, 2, 4);
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker    int a[x.a];
17*c8dee2aaSAndroid Build Coastguard Worker    int b[x.b];
18*c8dee2aaSAndroid Build Coastguard Worker    int c[x.c];
19*c8dee2aaSAndroid Build Coastguard Worker    check_array_1(a);
20*c8dee2aaSAndroid Build Coastguard Worker    check_array_2(b);
21*c8dee2aaSAndroid Build Coastguard Worker    check_array_3(c);
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker    // Structs with elements lacking side-effects can be optimized.
24*c8dee2aaSAndroid Build Coastguard Worker    int two = 2;
25*c8dee2aaSAndroid Build Coastguard Worker    int flatten0 = S(x.a, two, 3).a;
26*c8dee2aaSAndroid Build Coastguard Worker    int flatten1 = S(x.a, two, 3).b;
27*c8dee2aaSAndroid Build Coastguard Worker    int flatten2 = S(x.a, two, 3).c;
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker    return (x == xx) && !(x != xx) && (x != y) && !(x == y) && (x.a == y.a) &&
30*c8dee2aaSAndroid Build Coastguard Worker           (flatten0 == x.a) && (flatten1 == x.b) && (flatten2 == x.c);
31*c8dee2aaSAndroid Build Coastguard Worker}
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) {
34*c8dee2aaSAndroid Build Coastguard Worker    return test() ? colorGreen : colorRed;
35*c8dee2aaSAndroid Build Coastguard Worker}
36