xref: /aosp_15_r20/external/skia/resources/sksl/runtime/RecursiveComparison_Structs.rts (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen, colorRed;
2*c8dee2aaSAndroid Build Coastguard Worker
3*c8dee2aaSAndroid Build Coastguard Workerstruct S {float f1; float f2; float f3; };
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Workerbool test_same_structs(bool eq, float f1, float f2, float f3) {
6*c8dee2aaSAndroid Build Coastguard Worker    float one = colorGreen.r + 1;
7*c8dee2aaSAndroid Build Coastguard Worker    S a; a.f1 = f1;       a.f2 = f2;       a.f3 = f3;
8*c8dee2aaSAndroid Build Coastguard Worker    S b; b.f1 = f1 * one; b.f2 = f2 * one; b.f3 = f3 * one;
9*c8dee2aaSAndroid Build Coastguard Worker    return eq ? a == b : a != b;
10*c8dee2aaSAndroid Build Coastguard Worker}
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Workerbool test_diff_structs(bool eq, float f1, float f2, float f3) {
13*c8dee2aaSAndroid Build Coastguard Worker    float two = colorGreen.r + 2;
14*c8dee2aaSAndroid Build Coastguard Worker    S a; a.f1 = f1;       a.f2 = f2;       a.f3 = f3;
15*c8dee2aaSAndroid Build Coastguard Worker    S b; b.f1 = f1 * two; b.f2 = f2 * two; b.f3 = f3;
16*c8dee2aaSAndroid Build Coastguard Worker    return eq ? a == b : a != b;
17*c8dee2aaSAndroid Build Coastguard Worker}
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Workervec4 main(vec2 coords) {
20*c8dee2aaSAndroid Build Coastguard Worker
21*c8dee2aaSAndroid Build Coastguard Worker    float NAN1 = colorGreen.r/colorGreen.b;
22*c8dee2aaSAndroid Build Coastguard Worker    float NAN2 = colorGreen.b/colorGreen.r;
23*c8dee2aaSAndroid Build Coastguard Worker    float ZP = +colorGreen.r*colorGreen.b;
24*c8dee2aaSAndroid Build Coastguard Worker    float ZM = -colorGreen.r*colorGreen.b;
25*c8dee2aaSAndroid Build Coastguard Worker    float F42 = colorGreen.g * 42.0;
26*c8dee2aaSAndroid Build Coastguard Worker    float F43 = colorGreen.g * 43.0;
27*c8dee2aaSAndroid Build Coastguard Worker    float F44 = colorGreen.g * 44.0;
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker    bool EQ = true;     // Tests for ==
30*c8dee2aaSAndroid Build Coastguard Worker    bool NE = false;    // Tests for !=
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker    return  true
33*c8dee2aaSAndroid Build Coastguard Worker            && test_same_structs(EQ, F42, ZM, ZP)      // equal, including -0 and +0 values
34*c8dee2aaSAndroid Build Coastguard Worker            && !test_same_structs(NE, F42, ZM, ZP)     // not (not equal)
35*c8dee2aaSAndroid Build Coastguard Worker            && test_same_structs(NE, F42, NAN1, NAN2)  // NA values always not equal
36*c8dee2aaSAndroid Build Coastguard Worker            && !test_same_structs(EQ, F42, NAN1, NAN2)
37*c8dee2aaSAndroid Build Coastguard Worker            && test_diff_structs(NE, F42, F43, F44)    // one of the normal values not equal
38*c8dee2aaSAndroid Build Coastguard Worker            && !test_diff_structs(EQ, F42, F43, F44)
39*c8dee2aaSAndroid Build Coastguard Worker            && test_diff_structs(NE, NAN1, ZM, ZP)     // one of the normal values not equal
40*c8dee2aaSAndroid Build Coastguard Worker            && !test_diff_structs(EQ, NAN1, ZM, ZP)
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker           ? colorGreen : colorRed;
43*c8dee2aaSAndroid Build Coastguard Worker}
44