xref: /aosp_15_r20/external/skia/tests/sksl/intrinsics/Modf.metal (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1#include <metal_stdlib>
2#include <simd/simd.h>
3#ifdef __clang__
4#pragma clang diagnostic ignored "-Wall"
5#endif
6using namespace metal;
7struct Uniforms {
8    half4 colorGreen;
9    half4 colorRed;
10};
11struct Inputs {
12};
13struct Outputs {
14    half4 sk_FragColor [[color(0)]];
15};
16fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
17    Outputs _out;
18    (void)_out;
19    float _skTemp0;
20    float _skTemp1;
21    float2 _skTemp2;
22    float2 _skTemp3;
23    float3 _skTemp4;
24    float3 _skTemp5;
25    float4 _skTemp6;
26    float4 _skTemp7;
27    float4 value = float4(2.5, -2.5, 8.0, -0.125);
28    const float4 expectedWhole = float4(2.0, -2.0, 8.0, 0.0);
29    const float4 expectedFraction = float4(0.5, -0.5, 0.0, -0.125);
30    bool4 ok = bool4(false);
31    float4 whole;
32    float4 fraction;
33    fraction.x = ((_skTemp1 = modf(value.x, _skTemp0)), (whole.x = _skTemp0), _skTemp1);
34    ok.x = whole.x == 2.0 && fraction.x == 0.5;
35    fraction.xy = ((_skTemp3 = modf(value.xy, _skTemp2)), (whole.xy = _skTemp2), _skTemp3);
36    ok.y = all(whole.xy == float2(2.0, -2.0)) && all(fraction.xy == float2(0.5, -0.5));
37    fraction.xyz = ((_skTemp5 = modf(value.xyz, _skTemp4)), (whole.xyz = _skTemp4), _skTemp5);
38    ok.z = all(whole.xyz == float3(2.0, -2.0, 8.0)) && all(fraction.xyz == float3(0.5, -0.5, 0.0));
39    fraction = ((_skTemp7 = modf(value, _skTemp6)), (whole = _skTemp6), _skTemp7);
40    ok.w = all(whole == expectedWhole) && all(fraction == expectedFraction);
41    _out.sk_FragColor = all(ok) ? _uniforms.colorGreen : _uniforms.colorRed;
42    return _out;
43}
44