xref: /aosp_15_r20/external/skia/tests/sksl/shared/MatrixScalarMath.glsl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker
2*c8dee2aaSAndroid Build Coastguard Workerout vec4 sk_FragColor;
3*c8dee2aaSAndroid Build Coastguard Workeruniform vec4 colorGreen;
4*c8dee2aaSAndroid Build Coastguard Workeruniform vec4 colorRed;
5*c8dee2aaSAndroid Build Coastguard Workeruniform vec4 testInputs;
6*c8dee2aaSAndroid Build Coastguard Workerconst int minus = 2;
7*c8dee2aaSAndroid Build Coastguard Workerconst int star = 3;
8*c8dee2aaSAndroid Build Coastguard Workerconst int slash = 4;
9*c8dee2aaSAndroid Build Coastguard Workerbool test_bifffff22(int op, float m11, float m12, float m21, float m22, mat2 expected) {
10*c8dee2aaSAndroid Build Coastguard Worker    float one = colorRed.x;
11*c8dee2aaSAndroid Build Coastguard Worker    mat2 m2 = mat2(m11 * one, m12 * one, m21 * one, m22 * one);
12*c8dee2aaSAndroid Build Coastguard Worker    switch (op) {
13*c8dee2aaSAndroid Build Coastguard Worker        case 1:
14*c8dee2aaSAndroid Build Coastguard Worker            m2 = 1.0 + m2;
15*c8dee2aaSAndroid Build Coastguard Worker            break;
16*c8dee2aaSAndroid Build Coastguard Worker        case 2:
17*c8dee2aaSAndroid Build Coastguard Worker            m2 -= 1.0;
18*c8dee2aaSAndroid Build Coastguard Worker            break;
19*c8dee2aaSAndroid Build Coastguard Worker        case 3:
20*c8dee2aaSAndroid Build Coastguard Worker            m2 *= 2.0;
21*c8dee2aaSAndroid Build Coastguard Worker            break;
22*c8dee2aaSAndroid Build Coastguard Worker        case 4:
23*c8dee2aaSAndroid Build Coastguard Worker            m2 = m2 * 0.5;
24*c8dee2aaSAndroid Build Coastguard Worker            break;
25*c8dee2aaSAndroid Build Coastguard Worker    }
26*c8dee2aaSAndroid Build Coastguard Worker    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;
27*c8dee2aaSAndroid Build Coastguard Worker}
28*c8dee2aaSAndroid Build Coastguard Workerbool divisionTest_b() {
29*c8dee2aaSAndroid Build Coastguard Worker    float ten = colorRed.x * 10.0;
30*c8dee2aaSAndroid Build Coastguard Worker    mat2 mat = mat2(vec2(ten), vec2(ten));
31*c8dee2aaSAndroid Build Coastguard Worker    mat2 div = mat * (1.0 / testInputs.x);
32*c8dee2aaSAndroid Build Coastguard Worker    mat *= 1.0 / testInputs.x;
33*c8dee2aaSAndroid Build Coastguard Worker    return all(lessThan(abs(vec4(div) + vec4(8.0)), vec4(0.01))) && all(lessThan(abs(vec4(mat) + vec4(8.0)), vec4(0.01)));
34*c8dee2aaSAndroid Build Coastguard Worker}
35*c8dee2aaSAndroid Build Coastguard Workervec4 main() {
36*c8dee2aaSAndroid Build Coastguard Worker    float f1 = colorGreen.y;
37*c8dee2aaSAndroid Build Coastguard Worker    float f2 = 2.0 * colorGreen.y;
38*c8dee2aaSAndroid Build Coastguard Worker    float f3 = 3.0 * colorGreen.y;
39*c8dee2aaSAndroid Build Coastguard Worker    float f4 = 4.0 * colorGreen.y;
40*c8dee2aaSAndroid Build Coastguard Worker    mat2 _0_expected = mat2(f1 + 1.0, f2 + 1.0, f3 + 1.0, f4 + 1.0);
41*c8dee2aaSAndroid Build Coastguard Worker    float _1_one = colorRed.x;
42*c8dee2aaSAndroid Build Coastguard Worker    mat2 _2_m2 = mat2(f1 * _1_one, f2 * _1_one, f3 * _1_one, f4 * _1_one);
43*c8dee2aaSAndroid Build Coastguard Worker    {
44*c8dee2aaSAndroid Build Coastguard Worker        _2_m2 = 1.0 + _2_m2;
45*c8dee2aaSAndroid Build Coastguard Worker    }
46*c8dee2aaSAndroid Build Coastguard Worker    return ((((((_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(minus, f1, f2, f3, f4, mat2(f1 - 1.0, f2 - 1.0, f3 - 1.0, f4 - 1.0))) && test_bifffff22(star, f1, f2, f3, f4, mat2(f1 * 2.0, f2 * 2.0, f3 * 2.0, f4 * 2.0))) && test_bifffff22(slash, f1, f2, f3, f4, mat2(f1 * 0.5, f2 * 0.5, f3 * 0.5, f4 * 0.5))) && divisionTest_b() ? colorGreen : colorRed;
47*c8dee2aaSAndroid Build Coastguard Worker}
48