xref: /aosp_15_r20/external/skia/resources/sksl/intrinsics/FaceForward.sksl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 N, I, NRef;
2*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen, colorRed;
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 xy) {
5*c8dee2aaSAndroid Build Coastguard Worker    // These cannot be evaluated at compile-time since the intermediate values would overflow.
6*c8dee2aaSAndroid Build Coastguard Worker    float  huge  = faceforward(       1,         1e30,         1e30);
7*c8dee2aaSAndroid Build Coastguard Worker    float2 huge2 = faceforward(float2(1), float2(1e30), float2(1e30));
8*c8dee2aaSAndroid Build Coastguard Worker    float3 huge3 = faceforward(float3(1), float3(1e30), float3(1e30));
9*c8dee2aaSAndroid Build Coastguard Worker    float4 huge4 = faceforward(float4(1), float4(1e30), float4(1e30));
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker    // We don't care about the results; they're used here to prevent them from being optimized away.
12*c8dee2aaSAndroid Build Coastguard Worker    half4 expectedPos = half4(huge.xxxx  + huge2.xxxx);
13*c8dee2aaSAndroid Build Coastguard Worker    half4 expectedNeg = half4(huge3.xxxx + huge4.xxxx);
14*c8dee2aaSAndroid Build Coastguard Worker
15*c8dee2aaSAndroid Build Coastguard Worker    const half4 constN    = half4(1, 2, 3, 4);
16*c8dee2aaSAndroid Build Coastguard Worker    const half4 constI    = half4(1, 1, -100, 1);
17*c8dee2aaSAndroid Build Coastguard Worker    const half4 constNRef = half4(1);
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker    expectedPos =  half4(1, 2, 3, 4);
20*c8dee2aaSAndroid Build Coastguard Worker    expectedNeg = -half4(1, 2, 3, 4);
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker    return (faceforward(N.x,         I.x,         NRef.x        ) == expectedNeg.x    &&
23*c8dee2aaSAndroid Build Coastguard Worker            faceforward(N.xy,        I.xy,        NRef.xy       ) == expectedNeg.xy   &&
24*c8dee2aaSAndroid Build Coastguard Worker            faceforward(N.xyz,       I.xyz,       NRef.xyz      ) == expectedPos.xyz  &&
25*c8dee2aaSAndroid Build Coastguard Worker            faceforward(N.xyzw,      I.xyzw,      NRef.xyzw     ) == expectedPos.xyzw &&
26*c8dee2aaSAndroid Build Coastguard Worker            faceforward(constN.x,    constI.x,    constNRef.x   ) == expectedNeg.x    &&
27*c8dee2aaSAndroid Build Coastguard Worker            faceforward(constN.xy,   constI.xy,   constNRef.xy  ) == expectedNeg.xy   &&
28*c8dee2aaSAndroid Build Coastguard Worker            faceforward(constN.xyz,  constI.xyz,  constNRef.xyz ) == expectedPos.xyz  &&
29*c8dee2aaSAndroid Build Coastguard Worker            faceforward(constN.xyzw, constI.xyzw, constNRef.xyzw) == expectedPos.xyzw) ? colorGreen
30*c8dee2aaSAndroid Build Coastguard Worker                                                                                       : colorRed;
31*c8dee2aaSAndroid Build Coastguard Worker}
32