xref: /aosp_15_r20/external/skia/resources/sksl/folding/PreserveSideEffects.rts (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen, colorRed;
2*c8dee2aaSAndroid Build Coastguard Worker
3*c8dee2aaSAndroid Build Coastguard Worker// These tests verify that constructor expressions with side-effects do not get folded away.
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Workerbool test_vector() {
6*c8dee2aaSAndroid Build Coastguard Worker    bool ok = true;
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker    float num = 0.0;
9*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float2(++num, 0).y == 0.0;  // num => 1
10*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float2(0, ++num).x == 0.0;  // num => 2
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float3(++num, float2(1, 0)).yz == float2(1, 0);  // num => 3
13*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float3(float2(1, 0), ++num).xy == float2(1, 0);  // num => 4
14*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float3(float2(++num, 1), 0).yz == float2(1, 0);  // num => 5
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float4(++num, float3(1, 0, 0)).yzw == float3(1, 0, 0);  // num => 6
17*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float4(1, ++num, float2(1, 0)).x == 1.0;  // num => 7
18*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float4(float2(1, 0), ++num, 1).w == 1.0;  // num => 8
19*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float4(float2(1, 0), float2(1, ++num)).xyz == float3(1, 0, 1);  // num => 9
20*c8dee2aaSAndroid Build Coastguard Worker
21*c8dee2aaSAndroid Build Coastguard Worker    return ok && num == 9.0;
22*c8dee2aaSAndroid Build Coastguard Worker}
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Workerbool test_matrix() {
25*c8dee2aaSAndroid Build Coastguard Worker    bool ok = true;
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker    float num = 0.0;
28*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float2x2(1, 2, 3, ++num)[0] == float2(1, 2);  // num => 1
29*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float2x2(float2(++num), 3, 4)[1] == float2(3, 4);  // num => 2
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float3x3(float3(1), float3(++num), float3(0))[0] == float3(1);  // num => 3
32*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float3x3(float3(1), float3(++num), float3(0))[2] == float3(0);  // num => 4
33*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float3x3(float3(++num), float3(1), float3(0))[1] == float3(1);  // num => 5
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float3x3(1, 2, 3, 4, 5, ++num, 7, 8, 9)[0] == float3(1, 2, 3);  // num => 6
36*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float3x3(1, 2, 3, 4, 5, 6, num++, 8, 9)[1] == float3(4, 5, 6);  // num => 7
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker    // num => 8
39*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float4x4(float4(++num), float4(1), float4(2), float4(3))[1] == float4(1);
40*c8dee2aaSAndroid Build Coastguard Worker    // num => 9
41*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float4x4(float4(1), float4(++num), float4(2), float4(3))[2] == float4(2);
42*c8dee2aaSAndroid Build Coastguard Worker    // num => 10
43*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float4x4(float4(1), float4(1), float4(++num), float4(3))[3] == float4(3);
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker    ok = ok && float4x4(1,  2,      3, 4,
46*c8dee2aaSAndroid Build Coastguard Worker                        5,  6,      7, 8,
47*c8dee2aaSAndroid Build Coastguard Worker                        9,  10,    11, 12,
48*c8dee2aaSAndroid Build Coastguard Worker                        13, 14, ++num, 16)[3].xy == float2(13, 14); // num => 11
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker    return ok && num == 11.0;
51*c8dee2aaSAndroid Build Coastguard Worker}
52*c8dee2aaSAndroid Build Coastguard Worker
53*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) {
54*c8dee2aaSAndroid Build Coastguard Worker    return test_vector() && test_matrix() ? colorGreen : colorRed;
55*c8dee2aaSAndroid Build Coastguard Worker}
56