xref: /aosp_15_r20/external/skia/tests/sksl/shared/MatrixScalarMath.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;
7constant const int minus = 2;
8constant const int star = 3;
9constant const int slash = 4;
10struct Uniforms {
11    half4 colorGreen;
12    half4 colorRed;
13    float4 testInputs;
14};
15struct Inputs {
16};
17struct Outputs {
18    half4 sk_FragColor [[color(0)]];
19};
20
21float4 float4_from_float2x2(float2x2 x) {
22    return float4(x[0].xy, x[1].xy);
23}
24bool test_bifffff22(Uniforms _uniforms, int op, float m11, float m12, float m21, float m22, float2x2 expected) {
25    float one = float(_uniforms.colorRed.x);
26    float2x2 m2 = float2x2(float2(m11 * one, m12 * one), float2(m21 * one, m22 * one));
27    switch (op) {
28        case 1:
29            m2 = (float2x2(1.0, 1.0, 1.0, 1.0) * 1.0) + m2;
30            break;
31        case 2:
32            m2 -= (float2x2(1.0, 1.0, 1.0, 1.0) * 1.0);
33            break;
34        case 3:
35            m2 *= 2.0;
36            break;
37        case 4:
38            m2 = m2 * 0.5;
39            break;
40    }
41    return ((m2[0].x == expected[0].x && m2[0].y == expected[0].y) && m2[1].x == expected[1].x) && m2[1].y == expected[1].y;
42}
43bool divisionTest_b(Uniforms _uniforms) {
44    float ten = float(_uniforms.colorRed.x * 10.0h);
45    float2x2 mat = float2x2(float2(ten), float2(ten));
46    float2x2 div = mat * (1.0 / _uniforms.testInputs.x);
47    mat *= 1.0 / _uniforms.testInputs.x;
48    return all((abs(float4_from_float2x2(div) + float4(8.0)) < float4(0.01))) && all((abs(float4_from_float2x2(mat) + float4(8.0)) < float4(0.01)));
49}
50fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
51    Outputs _out;
52    (void)_out;
53    float f1 = float(_uniforms.colorGreen.y);
54    float f2 = float(2.0h * _uniforms.colorGreen.y);
55    float f3 = float(3.0h * _uniforms.colorGreen.y);
56    float f4 = float(4.0h * _uniforms.colorGreen.y);
57    float2x2 _0_expected = float2x2(float2(f1 + 1.0, f2 + 1.0), float2(f3 + 1.0, f4 + 1.0));
58    float _1_one = float(_uniforms.colorRed.x);
59    float2x2 _2_m2 = float2x2(float2(f1 * _1_one, f2 * _1_one), float2(f3 * _1_one, f4 * _1_one));
60    {
61        _2_m2 = (float2x2(1.0, 1.0, 1.0, 1.0) * 1.0) + _2_m2;
62    }
63    _out.sk_FragColor = ((((((_2_m2[0].x == _0_expected[0].x && _2_m2[0].y == _0_expected[0].y) && _2_m2[1].x == _0_expected[1].x) && _2_m2[1].y == _0_expected[1].y) && test_bifffff22(_uniforms, minus, f1, f2, f3, f4, float2x2(float2(f1 - 1.0, f2 - 1.0), float2(f3 - 1.0, f4 - 1.0)))) && test_bifffff22(_uniforms, star, f1, f2, f3, f4, float2x2(float2(f1 * 2.0, f2 * 2.0), float2(f3 * 2.0, f4 * 2.0)))) && test_bifffff22(_uniforms, slash, f1, f2, f3, f4, float2x2(float2(f1 * 0.5, f2 * 0.5), float2(f3 * 0.5, f4 * 0.5)))) && divisionTest_b(_uniforms) ? _uniforms.colorGreen : _uniforms.colorRed;
64    return _out;
65}
66