xref: /aosp_15_r20/external/skia/tests/sksl/shared/StructsInFunctions.wgsl (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workerdiagnostic(off, derivative_uniformity);
2*c8dee2aaSAndroid Build Coastguard Workerdiagnostic(off, chromium.unreachable_code);
3*c8dee2aaSAndroid Build Coastguard Workerstruct FSOut {
4*c8dee2aaSAndroid Build Coastguard Worker  @location(0) sk_FragColor: vec4<f32>,
5*c8dee2aaSAndroid Build Coastguard Worker};
6*c8dee2aaSAndroid Build Coastguard Workerstruct _GlobalUniforms {
7*c8dee2aaSAndroid Build Coastguard Worker  colorRed: vec4<f32>,
8*c8dee2aaSAndroid Build Coastguard Worker  colorGreen: vec4<f32>,
9*c8dee2aaSAndroid Build Coastguard Worker};
10*c8dee2aaSAndroid Build Coastguard Worker@binding(0) @group(0) var<uniform> _globalUniforms: _GlobalUniforms;
11*c8dee2aaSAndroid Build Coastguard Workerstruct S {
12*c8dee2aaSAndroid Build Coastguard Worker  x: f32,
13*c8dee2aaSAndroid Build Coastguard Worker  y: i32,
14*c8dee2aaSAndroid Build Coastguard Worker};
15*c8dee2aaSAndroid Build Coastguard Workerstruct Nested {
16*c8dee2aaSAndroid Build Coastguard Worker  a: S,
17*c8dee2aaSAndroid Build Coastguard Worker  b: S,
18*c8dee2aaSAndroid Build Coastguard Worker};
19*c8dee2aaSAndroid Build Coastguard Workerstruct Compound {
20*c8dee2aaSAndroid Build Coastguard Worker  f4: vec4<f32>,
21*c8dee2aaSAndroid Build Coastguard Worker  i3: vec3<i32>,
22*c8dee2aaSAndroid Build Coastguard Worker};
23*c8dee2aaSAndroid Build Coastguard Workerfn returns_a_struct_S() -> S {
24*c8dee2aaSAndroid Build Coastguard Worker  {
25*c8dee2aaSAndroid Build Coastguard Worker    var s: S;
26*c8dee2aaSAndroid Build Coastguard Worker    s.x = 1.0;
27*c8dee2aaSAndroid Build Coastguard Worker    s.y = 2;
28*c8dee2aaSAndroid Build Coastguard Worker    return s;
29*c8dee2aaSAndroid Build Coastguard Worker  }
30*c8dee2aaSAndroid Build Coastguard Worker}
31*c8dee2aaSAndroid Build Coastguard Workerfn constructs_a_struct_S() -> S {
32*c8dee2aaSAndroid Build Coastguard Worker  {
33*c8dee2aaSAndroid Build Coastguard Worker    return S(2.0, 3);
34*c8dee2aaSAndroid Build Coastguard Worker  }
35*c8dee2aaSAndroid Build Coastguard Worker}
36*c8dee2aaSAndroid Build Coastguard Workerfn accepts_a_struct_fS(s: S) -> f32 {
37*c8dee2aaSAndroid Build Coastguard Worker  {
38*c8dee2aaSAndroid Build Coastguard Worker    return s.x + f32(s.y);
39*c8dee2aaSAndroid Build Coastguard Worker  }
40*c8dee2aaSAndroid Build Coastguard Worker}
41*c8dee2aaSAndroid Build Coastguard Workerfn modifies_a_struct_vS(s: ptr<function, S>) {
42*c8dee2aaSAndroid Build Coastguard Worker  {
43*c8dee2aaSAndroid Build Coastguard Worker    (*s).x = (*s).x + f32(1);
44*c8dee2aaSAndroid Build Coastguard Worker    (*s).y = (*s).y + i32(1);
45*c8dee2aaSAndroid Build Coastguard Worker  }
46*c8dee2aaSAndroid Build Coastguard Worker}
47*c8dee2aaSAndroid Build Coastguard Workerfn _skslMain(coords: vec2<f32>) -> vec4<f32> {
48*c8dee2aaSAndroid Build Coastguard Worker  {
49*c8dee2aaSAndroid Build Coastguard Worker    let _skTemp0 = returns_a_struct_S();
50*c8dee2aaSAndroid Build Coastguard Worker    var s: S = _skTemp0;
51*c8dee2aaSAndroid Build Coastguard Worker    let _skTemp1 = accepts_a_struct_fS(s);
52*c8dee2aaSAndroid Build Coastguard Worker    let x: f32 = _skTemp1;
53*c8dee2aaSAndroid Build Coastguard Worker    var _skTemp2: S = s;
54*c8dee2aaSAndroid Build Coastguard Worker    modifies_a_struct_vS(&_skTemp2);
55*c8dee2aaSAndroid Build Coastguard Worker    s = _skTemp2;
56*c8dee2aaSAndroid Build Coastguard Worker    let _skTemp3 = constructs_a_struct_S();
57*c8dee2aaSAndroid Build Coastguard Worker    let expected: S = _skTemp3;
58*c8dee2aaSAndroid Build Coastguard Worker    var n1: Nested;
59*c8dee2aaSAndroid Build Coastguard Worker    var n2: Nested;
60*c8dee2aaSAndroid Build Coastguard Worker    var n3: Nested;
61*c8dee2aaSAndroid Build Coastguard Worker    let _skTemp4 = returns_a_struct_S();
62*c8dee2aaSAndroid Build Coastguard Worker    n1.a = _skTemp4;
63*c8dee2aaSAndroid Build Coastguard Worker    n1.b = n1.a;
64*c8dee2aaSAndroid Build Coastguard Worker    n2 = n1;
65*c8dee2aaSAndroid Build Coastguard Worker    n3 = n2;
66*c8dee2aaSAndroid Build Coastguard Worker    var _skTemp5: S = n3.b;
67*c8dee2aaSAndroid Build Coastguard Worker    modifies_a_struct_vS(&_skTemp5);
68*c8dee2aaSAndroid Build Coastguard Worker    n3.b = _skTemp5;
69*c8dee2aaSAndroid Build Coastguard Worker    const c1: Compound = Compound(vec4<f32>(1.0, 2.0, 3.0, 4.0), vec3<i32>(5, 6, 7));
70*c8dee2aaSAndroid Build Coastguard Worker    let c2: Compound = Compound(vec4<f32>(f32(_globalUniforms.colorGreen.y), 2.0, 3.0, 4.0), vec3<i32>(5, 6, 7));
71*c8dee2aaSAndroid Build Coastguard Worker    let c3: Compound = Compound(vec4<f32>(f32(_globalUniforms.colorGreen.x), 2.0, 3.0, 4.0), vec3<i32>(5, 6, 7));
72*c8dee2aaSAndroid Build Coastguard Worker    var _skTemp6: bool;
73*c8dee2aaSAndroid Build Coastguard Worker    const _skTemp7 = S(2.0, 3);
74*c8dee2aaSAndroid Build Coastguard Worker    if ((((x == 3.0) && (s.x == 2.0)) && (s.y == 3)) && ((s.x == expected.x) && (s.y == expected.y))) && ((s.x == _skTemp7.x) && (s.y == _skTemp7.y)) {
75*c8dee2aaSAndroid Build Coastguard Worker      let _skTemp8 = returns_a_struct_S();
76*c8dee2aaSAndroid Build Coastguard Worker      let _skTemp9 = _skTemp8;
77*c8dee2aaSAndroid Build Coastguard Worker      _skTemp6 = ((s.x != _skTemp9.x) || (s.y != _skTemp9.y));
78*c8dee2aaSAndroid Build Coastguard Worker    } else {
79*c8dee2aaSAndroid Build Coastguard Worker      _skTemp6 = false;
80*c8dee2aaSAndroid Build Coastguard Worker    }
81*c8dee2aaSAndroid Build Coastguard Worker    const _skTemp10 = Nested(S(1.0, 2), S(2.0, 3));
82*c8dee2aaSAndroid Build Coastguard Worker    let valid: bool = ((((_skTemp6 && (((n1.a.x == n2.a.x) && (n1.a.y == n2.a.y)) && ((n1.b.x == n2.b.x) && (n1.b.y == n2.b.y)))) && (((n1.a.x != n3.a.x) || (n1.a.y != n3.a.y)) || ((n1.b.x != n3.b.x) || (n1.b.y != n3.b.y)))) && (((n3.a.x == _skTemp10.a.x) && (n3.a.y == _skTemp10.a.y)) && ((n3.b.x == _skTemp10.b.x) && (n3.b.y == _skTemp10.b.y)))) && (all(c1.f4 == c2.f4) && all(c1.i3 == c2.i3))) && (any(c2.f4 != c3.f4) || any(c2.i3 != c3.i3));
83*c8dee2aaSAndroid Build Coastguard Worker    return select(_globalUniforms.colorRed, _globalUniforms.colorGreen, vec4<bool>(valid));
84*c8dee2aaSAndroid Build Coastguard Worker  }
85*c8dee2aaSAndroid Build Coastguard Worker}
86*c8dee2aaSAndroid Build Coastguard Worker@fragment fn main() -> FSOut {
87*c8dee2aaSAndroid Build Coastguard Worker  var _stageOut: FSOut;
88*c8dee2aaSAndroid Build Coastguard Worker  _stageOut.sk_FragColor = _skslMain(/*fragcoord*/ vec2<f32>());
89*c8dee2aaSAndroid Build Coastguard Worker  return _stageOut;
90*c8dee2aaSAndroid Build Coastguard Worker}
91