xref: /aosp_15_r20/external/skia/tests/sksl/shared/StructsInFunctions.metal (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker#include <metal_stdlib>
2*c8dee2aaSAndroid Build Coastguard Worker#include <simd/simd.h>
3*c8dee2aaSAndroid Build Coastguard Worker#ifdef __clang__
4*c8dee2aaSAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wall"
5*c8dee2aaSAndroid Build Coastguard Worker#endif
6*c8dee2aaSAndroid Build Coastguard Workerusing namespace metal;
7*c8dee2aaSAndroid Build Coastguard Workerstruct S {
8*c8dee2aaSAndroid Build Coastguard Worker    float x;
9*c8dee2aaSAndroid Build Coastguard Worker    int y;
10*c8dee2aaSAndroid Build Coastguard Worker};
11*c8dee2aaSAndroid Build Coastguard Workerstruct Nested {
12*c8dee2aaSAndroid Build Coastguard Worker    S a;
13*c8dee2aaSAndroid Build Coastguard Worker    S b;
14*c8dee2aaSAndroid Build Coastguard Worker};
15*c8dee2aaSAndroid Build Coastguard Workerstruct Compound {
16*c8dee2aaSAndroid Build Coastguard Worker    float4 f4;
17*c8dee2aaSAndroid Build Coastguard Worker    int3 i3;
18*c8dee2aaSAndroid Build Coastguard Worker};
19*c8dee2aaSAndroid Build Coastguard Workerstruct Uniforms {
20*c8dee2aaSAndroid Build Coastguard Worker    half4 colorRed;
21*c8dee2aaSAndroid Build Coastguard Worker    half4 colorGreen;
22*c8dee2aaSAndroid Build Coastguard Worker};
23*c8dee2aaSAndroid Build Coastguard Workerstruct Inputs {
24*c8dee2aaSAndroid Build Coastguard Worker};
25*c8dee2aaSAndroid Build Coastguard Workerstruct Outputs {
26*c8dee2aaSAndroid Build Coastguard Worker    half4 sk_FragColor [[color(0)]];
27*c8dee2aaSAndroid Build Coastguard Worker};
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(thread const S& left, thread const S& right);
30*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(thread const S& left, thread const S& right);
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(thread const Nested& left, thread const Nested& right);
33*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(thread const Nested& left, thread const Nested& right);
34*c8dee2aaSAndroid Build Coastguard Worker
35*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(thread const Compound& left, thread const Compound& right);
36*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(thread const Compound& left, thread const Compound& right);
37*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(thread const S& left, thread const S& right) {
38*c8dee2aaSAndroid Build Coastguard Worker    return all(left.x == right.x) &&
39*c8dee2aaSAndroid Build Coastguard Worker           all(left.y == right.y);
40*c8dee2aaSAndroid Build Coastguard Worker}
41*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(thread const S& left, thread const S& right) {
42*c8dee2aaSAndroid Build Coastguard Worker    return !(left == right);
43*c8dee2aaSAndroid Build Coastguard Worker}
44*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(thread const Nested& left, thread const Nested& right) {
45*c8dee2aaSAndroid Build Coastguard Worker    return all(left.a == right.a) &&
46*c8dee2aaSAndroid Build Coastguard Worker           all(left.b == right.b);
47*c8dee2aaSAndroid Build Coastguard Worker}
48*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(thread const Nested& left, thread const Nested& right) {
49*c8dee2aaSAndroid Build Coastguard Worker    return !(left == right);
50*c8dee2aaSAndroid Build Coastguard Worker}
51*c8dee2aaSAndroid Build Coastguard Workerthread bool operator==(thread const Compound& left, thread const Compound& right) {
52*c8dee2aaSAndroid Build Coastguard Worker    return all(left.f4 == right.f4) &&
53*c8dee2aaSAndroid Build Coastguard Worker           all(left.i3 == right.i3);
54*c8dee2aaSAndroid Build Coastguard Worker}
55*c8dee2aaSAndroid Build Coastguard Workerthread bool operator!=(thread const Compound& left, thread const Compound& right) {
56*c8dee2aaSAndroid Build Coastguard Worker    return !(left == right);
57*c8dee2aaSAndroid Build Coastguard Worker}
58*c8dee2aaSAndroid Build Coastguard WorkerS returns_a_struct_S() {
59*c8dee2aaSAndroid Build Coastguard Worker    S s;
60*c8dee2aaSAndroid Build Coastguard Worker    s.x = 1.0;
61*c8dee2aaSAndroid Build Coastguard Worker    s.y = 2;
62*c8dee2aaSAndroid Build Coastguard Worker    return s;
63*c8dee2aaSAndroid Build Coastguard Worker}
64*c8dee2aaSAndroid Build Coastguard WorkerS constructs_a_struct_S() {
65*c8dee2aaSAndroid Build Coastguard Worker    return S{2.0, 3};
66*c8dee2aaSAndroid Build Coastguard Worker}
67*c8dee2aaSAndroid Build Coastguard Workerfloat accepts_a_struct_fS(S s) {
68*c8dee2aaSAndroid Build Coastguard Worker    return s.x + float(s.y);
69*c8dee2aaSAndroid Build Coastguard Worker}
70*c8dee2aaSAndroid Build Coastguard Workervoid modifies_a_struct_vS(thread S& s) {
71*c8dee2aaSAndroid Build Coastguard Worker    s.x++;
72*c8dee2aaSAndroid Build Coastguard Worker    s.y++;
73*c8dee2aaSAndroid Build Coastguard Worker}
74*c8dee2aaSAndroid Build Coastguard Workerfragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
75*c8dee2aaSAndroid Build Coastguard Worker    Outputs _out;
76*c8dee2aaSAndroid Build Coastguard Worker    (void)_out;
77*c8dee2aaSAndroid Build Coastguard Worker    S _skTemp0;
78*c8dee2aaSAndroid Build Coastguard Worker    S _skTemp1;
79*c8dee2aaSAndroid Build Coastguard Worker    S s = returns_a_struct_S();
80*c8dee2aaSAndroid Build Coastguard Worker    float x = accepts_a_struct_fS(s);
81*c8dee2aaSAndroid Build Coastguard Worker    ((modifies_a_struct_vS((_skTemp0 = s))), (s = _skTemp0));
82*c8dee2aaSAndroid Build Coastguard Worker    S expected = constructs_a_struct_S();
83*c8dee2aaSAndroid Build Coastguard Worker    Nested n1;
84*c8dee2aaSAndroid Build Coastguard Worker    Nested n2;
85*c8dee2aaSAndroid Build Coastguard Worker    Nested n3;
86*c8dee2aaSAndroid Build Coastguard Worker    n1.a = returns_a_struct_S();
87*c8dee2aaSAndroid Build Coastguard Worker    n1.b = n1.a;
88*c8dee2aaSAndroid Build Coastguard Worker    n2 = n1;
89*c8dee2aaSAndroid Build Coastguard Worker    n3 = n2;
90*c8dee2aaSAndroid Build Coastguard Worker    ((modifies_a_struct_vS((_skTemp1 = n3.b))), (n3.b = _skTemp1));
91*c8dee2aaSAndroid Build Coastguard Worker    Compound c1 = Compound{float4(1.0, 2.0, 3.0, 4.0), int3(5, 6, 7)};
92*c8dee2aaSAndroid Build Coastguard Worker    Compound c2 = Compound{float4(float(_uniforms.colorGreen.y), 2.0, 3.0, 4.0), int3(5, 6, 7)};
93*c8dee2aaSAndroid Build Coastguard Worker    Compound c3 = Compound{float4(float(_uniforms.colorGreen.x), 2.0, 3.0, 4.0), int3(5, 6, 7)};
94*c8dee2aaSAndroid Build Coastguard Worker    bool valid = (((((((((x == 3.0 && s.x == 2.0) && s.y == 3) && s == expected) && s == S{2.0, 3}) && s != returns_a_struct_S()) && n1 == n2) && n1 != n3) && n3 == Nested{S{1.0, 2}, S{2.0, 3}}) && c1 == c2) && c2 != c3;
95*c8dee2aaSAndroid Build Coastguard Worker    _out.sk_FragColor = valid ? _uniforms.colorGreen : _uniforms.colorRed;
96*c8dee2aaSAndroid Build Coastguard Worker    return _out;
97*c8dee2aaSAndroid Build Coastguard Worker}
98