xref: /aosp_15_r20/external/skia/resources/sksl/intrinsics/IsNan.sksl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workeruniform half4 testInputs;  // equals (-1.25, 0, 0.75, 2.25)
2*c8dee2aaSAndroid Build Coastguard Workeruniform half4 colorGreen, colorRed;
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard Workerhalf4 main(float2 coords) {
5*c8dee2aaSAndroid Build Coastguard Worker    // NOTE: the ES3 spec does not mandate NaN support. This test may not succeed on some GPUs.
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Worker    half4 valueIsNaN    = 0 / testInputs.yyyy;
8*c8dee2aaSAndroid Build Coastguard Worker    half4 valueIsNumber = 1 / testInputs;
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker    return (    (isnan(valueIsNaN.x))       &&
11*c8dee2aaSAndroid Build Coastguard Worker             all(isnan(valueIsNaN.xy))      &&
12*c8dee2aaSAndroid Build Coastguard Worker             all(isnan(valueIsNaN.xyz))     &&
13*c8dee2aaSAndroid Build Coastguard Worker             all(isnan(valueIsNaN.xyzw))    &&
14*c8dee2aaSAndroid Build Coastguard Worker            !   (isnan(valueIsNumber.x))    &&
15*c8dee2aaSAndroid Build Coastguard Worker            !any(isnan(valueIsNumber.xy))   &&
16*c8dee2aaSAndroid Build Coastguard Worker            !any(isnan(valueIsNumber.xyz))  &&
17*c8dee2aaSAndroid Build Coastguard Worker            !any(isnan(valueIsNumber.xyzw))) ? colorGreen : colorRed;
18*c8dee2aaSAndroid Build Coastguard Worker}
19