xref: /aosp_15_r20/external/skia/resources/sksl/inliner/TrivialArgumentsInlineDirectly.sksl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen;
2*c8dee2aaSAndroid Build Coastguard Workeruniform half unknownInput;
3*c8dee2aaSAndroid Build Coastguard Workeruniform half2x2 testMatrix2x2;
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Workerstruct S {
6*c8dee2aaSAndroid Build Coastguard Worker    half4 ah4[1];
7*c8dee2aaSAndroid Build Coastguard Worker    half ah[1];
8*c8dee2aaSAndroid Build Coastguard Worker    half4 h4;
9*c8dee2aaSAndroid Build Coastguard Worker    half h;
10*c8dee2aaSAndroid Build Coastguard Worker};
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Workerstruct S4 {
13*c8dee2aaSAndroid Build Coastguard Worker    half a, b, c, d;
14*c8dee2aaSAndroid Build Coastguard Worker};
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Workerstruct S5 {
17*c8dee2aaSAndroid Build Coastguard Worker    half a, b, c, d, e;
18*c8dee2aaSAndroid Build Coastguard Worker};
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker// Each helper function needs to reference the variable multiple times, because if it's only read
21*c8dee2aaSAndroid Build Coastguard Worker// from once, it is inlined directly whether or not it is trivial.
22*c8dee2aaSAndroid Build Coastguard Workerhalf4 funcb(bool b) {
23*c8dee2aaSAndroid Build Coastguard Worker    return half4(b, b, b, !b);
24*c8dee2aaSAndroid Build Coastguard Worker}
25*c8dee2aaSAndroid Build Coastguard Worker
26*c8dee2aaSAndroid Build Coastguard Workerhalf4 func1(half h) {
27*c8dee2aaSAndroid Build Coastguard Worker    return h.xxxx * h.xxxx;
28*c8dee2aaSAndroid Build Coastguard Worker}
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Workerhalf4 func2(half2 h2) {
31*c8dee2aaSAndroid Build Coastguard Worker    return h2.xyxy * h2.yxyx;
32*c8dee2aaSAndroid Build Coastguard Worker}
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Workerhalf4 func3(half3 h3) {
35*c8dee2aaSAndroid Build Coastguard Worker    return h3.xyzx * h3.xyzx;
36*c8dee2aaSAndroid Build Coastguard Worker}
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Workerhalf4 func4(half4 h4) {
39*c8dee2aaSAndroid Build Coastguard Worker    return h4 * h4;
40*c8dee2aaSAndroid Build Coastguard Worker}
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Workerhalf2x2 func2x2(half2x2 m) {
43*c8dee2aaSAndroid Build Coastguard Worker    return m * m[0][0];
44*c8dee2aaSAndroid Build Coastguard Worker}
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Workerhalf4 funcS4(S4 s) {
47*c8dee2aaSAndroid Build Coastguard Worker    return half4(s.a, s.b, s.c, 1) * s.d;
48*c8dee2aaSAndroid Build Coastguard Worker}
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Workerhalf4 funcS5(S5 s) {
51*c8dee2aaSAndroid Build Coastguard Worker    return half4(s.a, s.b, s.c, s.d) * s.e;
52*c8dee2aaSAndroid Build Coastguard Worker}
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Workernoinline void keepAlive(inout half f) {}
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) {
57*c8dee2aaSAndroid Build Coastguard Worker    S s;
58*c8dee2aaSAndroid Build Coastguard Worker    s.ah4[0] = half4(unknownInput);
59*c8dee2aaSAndroid Build Coastguard Worker    s.ah[0] = unknownInput;
60*c8dee2aaSAndroid Build Coastguard Worker    s.h4 = half4(unknownInput);
61*c8dee2aaSAndroid Build Coastguard Worker    s.h = unknownInput;
62*c8dee2aaSAndroid Build Coastguard Worker
63*c8dee2aaSAndroid Build Coastguard Worker    S as[1];
64*c8dee2aaSAndroid Build Coastguard Worker    as[0].ah4[0] = half4(unknownInput);
65*c8dee2aaSAndroid Build Coastguard Worker
66*c8dee2aaSAndroid Build Coastguard Worker    bool b = bool(unknownInput);
67*c8dee2aaSAndroid Build Coastguard Worker    int i = int(unknownInput);
68*c8dee2aaSAndroid Build Coastguard Worker    int4 i4 = i.xxxx;
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker    // These expressions are considered "trivial" and will be cloned directly into the inlined
71*c8dee2aaSAndroid Build Coastguard Worker    // function without a temporary variable.
72*c8dee2aaSAndroid Build Coastguard Worker    half4 var;
73*c8dee2aaSAndroid Build Coastguard Worker    half2x2 mat;
74*c8dee2aaSAndroid Build Coastguard Worker    var = func1(+s.h);                    // field access (unary + is optimized away)
75*c8dee2aaSAndroid Build Coastguard Worker    var = funcb(b);                       // variable reference
76*c8dee2aaSAndroid Build Coastguard Worker    var = func2(s.ah4[0].yw);             // var, field access, array index, swizzle
77*c8dee2aaSAndroid Build Coastguard Worker    var = func2(as[0].ah4[0].xy);         // var, array index, field access, array index, swizzle
78*c8dee2aaSAndroid Build Coastguard Worker    var = func3(s.h4.zzz);                // var, field access, swizzle
79*c8dee2aaSAndroid Build Coastguard Worker    var = func3(colorGreen.xyz);          // var, swizzle
80*c8dee2aaSAndroid Build Coastguard Worker    var = func3(s.h.xxx);                 // var, field access, splat ctor (from scalar swizzle)
81*c8dee2aaSAndroid Build Coastguard Worker    var = func4(half4(s.h));              // var, splat, field access
82*c8dee2aaSAndroid Build Coastguard Worker    var = func4(s.ah4[0].xxxy);           // var, field access, array index, swizzle
83*c8dee2aaSAndroid Build Coastguard Worker    var = func4(colorGreen);              // variable reference
84*c8dee2aaSAndroid Build Coastguard Worker    var = func4(half4(1, 2, 3, 4));       // compound ctor, compile-time constant
85*c8dee2aaSAndroid Build Coastguard Worker    var = func1(half(i));                 // scalar-cast ctor, variable
86*c8dee2aaSAndroid Build Coastguard Worker    var = func4(half4(i4));               // compound-cast ctor, variable
87*c8dee2aaSAndroid Build Coastguard Worker    var = funcS4(S4(1, 2, 3, 4));         // struct with slotCount <= 4
88*c8dee2aaSAndroid Build Coastguard Worker    mat = func2x2(half2x2(unknownInput)); // diagonal matrix, variable reference
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker    // These expressions are considered "non-trivial" and will be placed in a temporary variable
91*c8dee2aaSAndroid Build Coastguard Worker    // when inlining occurs.
92*c8dee2aaSAndroid Build Coastguard Worker    var = func4(half4(testMatrix2x2));             // compound ctor, not compile-time constant
93*c8dee2aaSAndroid Build Coastguard Worker    mat = func2x2(half2x2(colorGreen));            // compound ctor, not compile-time constant
94*c8dee2aaSAndroid Build Coastguard Worker    mat = func2x2(half2x2(half3x3(unknownInput))); // matrix resize, diagonal matrix, var
95*c8dee2aaSAndroid Build Coastguard Worker    var = func4(half4(1, 2, 3, unknownInput));     // compound ctor, not compile-time constant
96*c8dee2aaSAndroid Build Coastguard Worker    var = funcS5(S5(1, 2, 3, 4, 5));               // struct with slotCount > 4
97*c8dee2aaSAndroid Build Coastguard Worker    var = func1(-s.h);                             // unary minus, var, field access
98*c8dee2aaSAndroid Build Coastguard Worker    var = funcb(!b);                               // prefix expression, var
99*c8dee2aaSAndroid Build Coastguard Worker//  var = func2(as[i].h4.yw);                      // (non-constant array index disallowed in ES2)
100*c8dee2aaSAndroid Build Coastguard Worker    var = func3(s.h4.yyy + s.h4.zzz);              // binary expression
101*c8dee2aaSAndroid Build Coastguard Worker    var = func4(s.h4.y001);                        // compound ctor, not compile-time constant
102*c8dee2aaSAndroid Build Coastguard Worker
103*c8dee2aaSAndroid Build Coastguard Worker    keepAlive(var[0]);
104*c8dee2aaSAndroid Build Coastguard Worker    keepAlive(mat[0][0]);
105*c8dee2aaSAndroid Build Coastguard Worker
106*c8dee2aaSAndroid Build Coastguard Worker    return colorGreen;
107*c8dee2aaSAndroid Build Coastguard Worker}
108