1bf215546Sopenharmony_ci# encoding=utf-8
2bf215546Sopenharmony_ci# Copyright © 2019 Google
3bf215546Sopenharmony_ci
4bf215546Sopenharmony_ci# Permission is hereby granted, free of charge, to any person obtaining a copy
5bf215546Sopenharmony_ci# of this software and associated documentation files (the "Software"), to deal
6bf215546Sopenharmony_ci# in the Software without restriction, including without limitation the rights
7bf215546Sopenharmony_ci# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8bf215546Sopenharmony_ci# copies of the Software, and to permit persons to whom the Software is
9bf215546Sopenharmony_ci# furnished to do so, subject to the following conditions:
10bf215546Sopenharmony_ci
11bf215546Sopenharmony_ci# The above copyright notice and this permission notice shall be included in
12bf215546Sopenharmony_ci# all copies or substantial portions of the Software.
13bf215546Sopenharmony_ci
14bf215546Sopenharmony_ci# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15bf215546Sopenharmony_ci# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16bf215546Sopenharmony_ci# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17bf215546Sopenharmony_ci# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18bf215546Sopenharmony_ci# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19bf215546Sopenharmony_ci# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20bf215546Sopenharmony_ci# SOFTWARE.
21bf215546Sopenharmony_ci
22bf215546Sopenharmony_ciimport sys
23bf215546Sopenharmony_ciimport subprocess
24bf215546Sopenharmony_ciimport tempfile
25bf215546Sopenharmony_ciimport re
26bf215546Sopenharmony_cifrom collections import namedtuple
27bf215546Sopenharmony_ci
28bf215546Sopenharmony_ci
29bf215546Sopenharmony_ciTest = namedtuple("Test", "name source match_re")
30bf215546Sopenharmony_ci
31bf215546Sopenharmony_ci
32bf215546Sopenharmony_ciTESTS = [
33bf215546Sopenharmony_ci    Test("f32 simple division",
34bf215546Sopenharmony_ci         """
35bf215546Sopenharmony_ci         uniform mediump float a, b;
36bf215546Sopenharmony_ci
37bf215546Sopenharmony_ci         void main()
38bf215546Sopenharmony_ci         {
39bf215546Sopenharmony_ci                 gl_FragColor.rgba = vec4(a / b);
40bf215546Sopenharmony_ci         }
41bf215546Sopenharmony_ci         """,
42bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
43bf215546Sopenharmony_ci    Test("i32 simple division",
44bf215546Sopenharmony_ci         """
45bf215546Sopenharmony_ci         #version 300 es
46bf215546Sopenharmony_ci         precision mediump float;
47bf215546Sopenharmony_ci         precision mediump int;
48bf215546Sopenharmony_ci         uniform mediump int a, b;
49bf215546Sopenharmony_ci
50bf215546Sopenharmony_ci         out vec4 color;
51bf215546Sopenharmony_ci
52bf215546Sopenharmony_ci         void main()
53bf215546Sopenharmony_ci         {
54bf215546Sopenharmony_ci                 color = vec4(a / b);
55bf215546Sopenharmony_ci         }
56bf215546Sopenharmony_ci         """,
57bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
58bf215546Sopenharmony_ci    Test("u32 simple division",
59bf215546Sopenharmony_ci         """
60bf215546Sopenharmony_ci         #version 300 es
61bf215546Sopenharmony_ci         precision mediump float;
62bf215546Sopenharmony_ci         precision mediump int;
63bf215546Sopenharmony_ci         uniform mediump uint a, b;
64bf215546Sopenharmony_ci
65bf215546Sopenharmony_ci         out vec4 color;
66bf215546Sopenharmony_ci
67bf215546Sopenharmony_ci         void main()
68bf215546Sopenharmony_ci         {
69bf215546Sopenharmony_ci                 color = vec4(a / b);
70bf215546Sopenharmony_ci         }
71bf215546Sopenharmony_ci         """,
72bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
73bf215546Sopenharmony_ci    Test("dot",
74bf215546Sopenharmony_ci         """
75bf215546Sopenharmony_ci         uniform mediump vec2 a, b;
76bf215546Sopenharmony_ci
77bf215546Sopenharmony_ci         void main()
78bf215546Sopenharmony_ci         {
79bf215546Sopenharmony_ci                 gl_FragColor.rgba = vec4(dot(a, b));
80bf215546Sopenharmony_ci         }
81bf215546Sopenharmony_ci         """,
82bf215546Sopenharmony_ci         r'\(expression +float16_t +dot\b'),
83bf215546Sopenharmony_ci    Test("f32 array with const index",
84bf215546Sopenharmony_ci         """
85bf215546Sopenharmony_ci         precision mediump float;
86bf215546Sopenharmony_ci
87bf215546Sopenharmony_ci         uniform float in_simple[2];
88bf215546Sopenharmony_ci
89bf215546Sopenharmony_ci         void main()
90bf215546Sopenharmony_ci         {
91bf215546Sopenharmony_ci                 gl_FragColor = vec4(in_simple[0] / in_simple[1]);
92bf215546Sopenharmony_ci         }
93bf215546Sopenharmony_ci         """,
94bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
95bf215546Sopenharmony_ci    Test("i32 array with const index",
96bf215546Sopenharmony_ci         """
97bf215546Sopenharmony_ci         #version 300 es
98bf215546Sopenharmony_ci         precision mediump float;
99bf215546Sopenharmony_ci         precision mediump int;
100bf215546Sopenharmony_ci
101bf215546Sopenharmony_ci         uniform int in_simple[2];
102bf215546Sopenharmony_ci
103bf215546Sopenharmony_ci         out vec4 color;
104bf215546Sopenharmony_ci
105bf215546Sopenharmony_ci         void main()
106bf215546Sopenharmony_ci         {
107bf215546Sopenharmony_ci                 color = vec4(in_simple[0] / in_simple[1]);
108bf215546Sopenharmony_ci         }
109bf215546Sopenharmony_ci         """,
110bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
111bf215546Sopenharmony_ci    Test("u32 array with const index",
112bf215546Sopenharmony_ci         """
113bf215546Sopenharmony_ci         #version 300 es
114bf215546Sopenharmony_ci         precision mediump float;
115bf215546Sopenharmony_ci         precision mediump int;
116bf215546Sopenharmony_ci
117bf215546Sopenharmony_ci         uniform uint in_simple[2];
118bf215546Sopenharmony_ci
119bf215546Sopenharmony_ci         out vec4 color;
120bf215546Sopenharmony_ci
121bf215546Sopenharmony_ci         void main()
122bf215546Sopenharmony_ci         {
123bf215546Sopenharmony_ci                 color = vec4(in_simple[0] / in_simple[1]);
124bf215546Sopenharmony_ci         }
125bf215546Sopenharmony_ci         """,
126bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
127bf215546Sopenharmony_ci    Test("f32 array with uniform index",
128bf215546Sopenharmony_ci         """
129bf215546Sopenharmony_ci         precision mediump float;
130bf215546Sopenharmony_ci
131bf215546Sopenharmony_ci         uniform float in_simple[2];
132bf215546Sopenharmony_ci         uniform int i0, i1;
133bf215546Sopenharmony_ci
134bf215546Sopenharmony_ci         void main()
135bf215546Sopenharmony_ci         {
136bf215546Sopenharmony_ci                 gl_FragColor = vec4(in_simple[i0] / in_simple[i1]);
137bf215546Sopenharmony_ci         }
138bf215546Sopenharmony_ci         """,
139bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
140bf215546Sopenharmony_ci    Test("i32 array with uniform index",
141bf215546Sopenharmony_ci         """
142bf215546Sopenharmony_ci         #version 300 es
143bf215546Sopenharmony_ci         precision mediump float;
144bf215546Sopenharmony_ci         precision mediump int;
145bf215546Sopenharmony_ci
146bf215546Sopenharmony_ci         uniform int in_simple[2];
147bf215546Sopenharmony_ci         uniform int i0, i1;
148bf215546Sopenharmony_ci
149bf215546Sopenharmony_ci         out vec4 color;
150bf215546Sopenharmony_ci
151bf215546Sopenharmony_ci         void main()
152bf215546Sopenharmony_ci         {
153bf215546Sopenharmony_ci                 color = vec4(in_simple[i0] / in_simple[i1]);
154bf215546Sopenharmony_ci         }
155bf215546Sopenharmony_ci         """,
156bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
157bf215546Sopenharmony_ci    Test("u32 array with uniform index",
158bf215546Sopenharmony_ci         """
159bf215546Sopenharmony_ci         #version 300 es
160bf215546Sopenharmony_ci         precision mediump float;
161bf215546Sopenharmony_ci         precision mediump int;
162bf215546Sopenharmony_ci
163bf215546Sopenharmony_ci         uniform uint in_simple[2];
164bf215546Sopenharmony_ci         uniform int i0, i1;
165bf215546Sopenharmony_ci
166bf215546Sopenharmony_ci         out vec4 color;
167bf215546Sopenharmony_ci
168bf215546Sopenharmony_ci         void main()
169bf215546Sopenharmony_ci         {
170bf215546Sopenharmony_ci                 color = vec4(in_simple[i0] / in_simple[i1]);
171bf215546Sopenharmony_ci         }
172bf215546Sopenharmony_ci         """,
173bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
174bf215546Sopenharmony_ci    Test("f32 array-of-array with const index",
175bf215546Sopenharmony_ci         """
176bf215546Sopenharmony_ci         #version 310 es
177bf215546Sopenharmony_ci         precision mediump float;
178bf215546Sopenharmony_ci
179bf215546Sopenharmony_ci         uniform float in_aoa[2][2];
180bf215546Sopenharmony_ci
181bf215546Sopenharmony_ci         layout(location = 0) out float out_color;
182bf215546Sopenharmony_ci
183bf215546Sopenharmony_ci         void main()
184bf215546Sopenharmony_ci         {
185bf215546Sopenharmony_ci                 out_color = in_aoa[0][0] / in_aoa[1][1];
186bf215546Sopenharmony_ci         }
187bf215546Sopenharmony_ci         """,
188bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
189bf215546Sopenharmony_ci    Test("i32 array-of-array with const index",
190bf215546Sopenharmony_ci         """
191bf215546Sopenharmony_ci         #version 310 es
192bf215546Sopenharmony_ci         precision mediump float;
193bf215546Sopenharmony_ci         precision mediump int;
194bf215546Sopenharmony_ci
195bf215546Sopenharmony_ci         uniform int in_aoa[2][2];
196bf215546Sopenharmony_ci
197bf215546Sopenharmony_ci         layout(location = 0) out highp int out_color;
198bf215546Sopenharmony_ci
199bf215546Sopenharmony_ci         void main()
200bf215546Sopenharmony_ci         {
201bf215546Sopenharmony_ci                 out_color = in_aoa[0][0] / in_aoa[1][1];
202bf215546Sopenharmony_ci         }
203bf215546Sopenharmony_ci         """,
204bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
205bf215546Sopenharmony_ci    Test("u32 array-of-array with const index",
206bf215546Sopenharmony_ci         """
207bf215546Sopenharmony_ci         #version 310 es
208bf215546Sopenharmony_ci         precision mediump float;
209bf215546Sopenharmony_ci         precision mediump int;
210bf215546Sopenharmony_ci
211bf215546Sopenharmony_ci         uniform uint in_aoa[2][2];
212bf215546Sopenharmony_ci
213bf215546Sopenharmony_ci         layout(location = 0) out highp uint out_color;
214bf215546Sopenharmony_ci
215bf215546Sopenharmony_ci         void main()
216bf215546Sopenharmony_ci         {
217bf215546Sopenharmony_ci                 out_color = in_aoa[0][0] / in_aoa[1][1];
218bf215546Sopenharmony_ci         }
219bf215546Sopenharmony_ci         """,
220bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
221bf215546Sopenharmony_ci    Test("f32 array-of-array with uniform index",
222bf215546Sopenharmony_ci         """
223bf215546Sopenharmony_ci         #version 310 es
224bf215546Sopenharmony_ci         precision mediump float;
225bf215546Sopenharmony_ci
226bf215546Sopenharmony_ci         uniform float in_aoa[2][2];
227bf215546Sopenharmony_ci         uniform int i0, i1;
228bf215546Sopenharmony_ci
229bf215546Sopenharmony_ci         layout(location = 0) out float out_color;
230bf215546Sopenharmony_ci
231bf215546Sopenharmony_ci         void main()
232bf215546Sopenharmony_ci         {
233bf215546Sopenharmony_ci                 out_color = in_aoa[i0][i0] / in_aoa[i1][i1];
234bf215546Sopenharmony_ci         }
235bf215546Sopenharmony_ci         """,
236bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
237bf215546Sopenharmony_ci    Test("i32 array-of-array with uniform index",
238bf215546Sopenharmony_ci         """
239bf215546Sopenharmony_ci         #version 310 es
240bf215546Sopenharmony_ci         precision mediump float;
241bf215546Sopenharmony_ci         precision mediump int;
242bf215546Sopenharmony_ci
243bf215546Sopenharmony_ci         uniform int in_aoa[2][2];
244bf215546Sopenharmony_ci         uniform int i0, i1;
245bf215546Sopenharmony_ci
246bf215546Sopenharmony_ci         layout(location = 0) out highp int out_color;
247bf215546Sopenharmony_ci
248bf215546Sopenharmony_ci         void main()
249bf215546Sopenharmony_ci         {
250bf215546Sopenharmony_ci                 out_color = in_aoa[i0][i0] / in_aoa[i1][i1];
251bf215546Sopenharmony_ci         }
252bf215546Sopenharmony_ci         """,
253bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
254bf215546Sopenharmony_ci    Test("u32 array-of-array with uniform index",
255bf215546Sopenharmony_ci         """
256bf215546Sopenharmony_ci         #version 310 es
257bf215546Sopenharmony_ci         precision mediump float;
258bf215546Sopenharmony_ci         precision mediump int;
259bf215546Sopenharmony_ci
260bf215546Sopenharmony_ci         uniform uint in_aoa[2][2];
261bf215546Sopenharmony_ci         uniform int i0, i1;
262bf215546Sopenharmony_ci
263bf215546Sopenharmony_ci         layout(location = 0) out highp uint out_color;
264bf215546Sopenharmony_ci
265bf215546Sopenharmony_ci         void main()
266bf215546Sopenharmony_ci         {
267bf215546Sopenharmony_ci                 out_color = in_aoa[i0][i0] / in_aoa[i1][i1];
268bf215546Sopenharmony_ci         }
269bf215546Sopenharmony_ci         """,
270bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
271bf215546Sopenharmony_ci    Test("f32 array index",
272bf215546Sopenharmony_ci         """
273bf215546Sopenharmony_ci         uniform mediump float a, b;
274bf215546Sopenharmony_ci         uniform mediump float values[2];
275bf215546Sopenharmony_ci
276bf215546Sopenharmony_ci         void main()
277bf215546Sopenharmony_ci         {
278bf215546Sopenharmony_ci                 gl_FragColor.rgba = vec4(values[int(a / b)]);
279bf215546Sopenharmony_ci         }
280bf215546Sopenharmony_ci         """,
281bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
282bf215546Sopenharmony_ci    Test("i32 array index",
283bf215546Sopenharmony_ci         """
284bf215546Sopenharmony_ci         #version 310 es
285bf215546Sopenharmony_ci         precision mediump float;
286bf215546Sopenharmony_ci         precision mediump int;
287bf215546Sopenharmony_ci
288bf215546Sopenharmony_ci         uniform mediump int a, b;
289bf215546Sopenharmony_ci         uniform mediump int values[2];
290bf215546Sopenharmony_ci
291bf215546Sopenharmony_ci         out highp int color;
292bf215546Sopenharmony_ci
293bf215546Sopenharmony_ci         void main()
294bf215546Sopenharmony_ci         {
295bf215546Sopenharmony_ci                 color = values[a / b];
296bf215546Sopenharmony_ci         }
297bf215546Sopenharmony_ci         """,
298bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
299bf215546Sopenharmony_ci    Test("f32 function",
300bf215546Sopenharmony_ci         """
301bf215546Sopenharmony_ci         precision mediump float;
302bf215546Sopenharmony_ci
303bf215546Sopenharmony_ci         uniform float a, b;
304bf215546Sopenharmony_ci
305bf215546Sopenharmony_ci         mediump float
306bf215546Sopenharmony_ci         get_a()
307bf215546Sopenharmony_ci         {
308bf215546Sopenharmony_ci                 return a;
309bf215546Sopenharmony_ci         }
310bf215546Sopenharmony_ci
311bf215546Sopenharmony_ci         float
312bf215546Sopenharmony_ci         get_b()
313bf215546Sopenharmony_ci         {
314bf215546Sopenharmony_ci                 return b;
315bf215546Sopenharmony_ci         }
316bf215546Sopenharmony_ci
317bf215546Sopenharmony_ci         void main()
318bf215546Sopenharmony_ci         {
319bf215546Sopenharmony_ci                 gl_FragColor = vec4(get_a() / get_b());
320bf215546Sopenharmony_ci         }
321bf215546Sopenharmony_ci         """,
322bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
323bf215546Sopenharmony_ci    Test("i32 function",
324bf215546Sopenharmony_ci         """
325bf215546Sopenharmony_ci         #version 310 es
326bf215546Sopenharmony_ci         precision mediump float;
327bf215546Sopenharmony_ci         precision mediump int;
328bf215546Sopenharmony_ci
329bf215546Sopenharmony_ci         uniform int a, b;
330bf215546Sopenharmony_ci
331bf215546Sopenharmony_ci         mediump int
332bf215546Sopenharmony_ci         get_a()
333bf215546Sopenharmony_ci         {
334bf215546Sopenharmony_ci                 return a;
335bf215546Sopenharmony_ci         }
336bf215546Sopenharmony_ci
337bf215546Sopenharmony_ci         int
338bf215546Sopenharmony_ci         get_b()
339bf215546Sopenharmony_ci         {
340bf215546Sopenharmony_ci                 return b;
341bf215546Sopenharmony_ci         }
342bf215546Sopenharmony_ci
343bf215546Sopenharmony_ci         out highp int color;
344bf215546Sopenharmony_ci
345bf215546Sopenharmony_ci         void main()
346bf215546Sopenharmony_ci         {
347bf215546Sopenharmony_ci                 color = get_a() / get_b();
348bf215546Sopenharmony_ci         }
349bf215546Sopenharmony_ci         """,
350bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
351bf215546Sopenharmony_ci    Test("u32 function",
352bf215546Sopenharmony_ci         """
353bf215546Sopenharmony_ci         #version 310 es
354bf215546Sopenharmony_ci         precision mediump float;
355bf215546Sopenharmony_ci         precision mediump int;
356bf215546Sopenharmony_ci
357bf215546Sopenharmony_ci         uniform uint a, b;
358bf215546Sopenharmony_ci
359bf215546Sopenharmony_ci         mediump uint
360bf215546Sopenharmony_ci         get_a()
361bf215546Sopenharmony_ci         {
362bf215546Sopenharmony_ci                 return a;
363bf215546Sopenharmony_ci         }
364bf215546Sopenharmony_ci
365bf215546Sopenharmony_ci         uint
366bf215546Sopenharmony_ci         get_b()
367bf215546Sopenharmony_ci         {
368bf215546Sopenharmony_ci                 return b;
369bf215546Sopenharmony_ci         }
370bf215546Sopenharmony_ci
371bf215546Sopenharmony_ci         out highp uint color;
372bf215546Sopenharmony_ci
373bf215546Sopenharmony_ci         void main()
374bf215546Sopenharmony_ci         {
375bf215546Sopenharmony_ci                 color = get_a() / get_b();
376bf215546Sopenharmony_ci         }
377bf215546Sopenharmony_ci         """,
378bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
379bf215546Sopenharmony_ci    Test("f32 function mediump args",
380bf215546Sopenharmony_ci         """
381bf215546Sopenharmony_ci         precision mediump float;
382bf215546Sopenharmony_ci
383bf215546Sopenharmony_ci         uniform float a, b;
384bf215546Sopenharmony_ci
385bf215546Sopenharmony_ci         mediump float
386bf215546Sopenharmony_ci         do_div(float x, float y)
387bf215546Sopenharmony_ci         {
388bf215546Sopenharmony_ci                 return x / y;
389bf215546Sopenharmony_ci         }
390bf215546Sopenharmony_ci
391bf215546Sopenharmony_ci         void main()
392bf215546Sopenharmony_ci         {
393bf215546Sopenharmony_ci                 gl_FragColor = vec4(do_div(a, b));
394bf215546Sopenharmony_ci         }
395bf215546Sopenharmony_ci         """,
396bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
397bf215546Sopenharmony_ci    Test("i32 function mediump args",
398bf215546Sopenharmony_ci         """
399bf215546Sopenharmony_ci         #version 310 es
400bf215546Sopenharmony_ci         precision mediump float;
401bf215546Sopenharmony_ci         precision mediump int;
402bf215546Sopenharmony_ci
403bf215546Sopenharmony_ci         uniform int a, b;
404bf215546Sopenharmony_ci
405bf215546Sopenharmony_ci         mediump int
406bf215546Sopenharmony_ci         do_div(int x, int y)
407bf215546Sopenharmony_ci         {
408bf215546Sopenharmony_ci                 return x / y;
409bf215546Sopenharmony_ci         }
410bf215546Sopenharmony_ci
411bf215546Sopenharmony_ci         out highp int color;
412bf215546Sopenharmony_ci
413bf215546Sopenharmony_ci         void main()
414bf215546Sopenharmony_ci         {
415bf215546Sopenharmony_ci                 color = do_div(a, b);
416bf215546Sopenharmony_ci         }
417bf215546Sopenharmony_ci         """,
418bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
419bf215546Sopenharmony_ci    Test("u32 function mediump args",
420bf215546Sopenharmony_ci         """
421bf215546Sopenharmony_ci         #version 310 es
422bf215546Sopenharmony_ci         precision mediump float;
423bf215546Sopenharmony_ci         precision mediump int;
424bf215546Sopenharmony_ci
425bf215546Sopenharmony_ci         uniform uint a, b;
426bf215546Sopenharmony_ci
427bf215546Sopenharmony_ci         mediump uint
428bf215546Sopenharmony_ci         do_div(uint x, uint y)
429bf215546Sopenharmony_ci         {
430bf215546Sopenharmony_ci                 return x / y;
431bf215546Sopenharmony_ci         }
432bf215546Sopenharmony_ci
433bf215546Sopenharmony_ci         out highp uint color;
434bf215546Sopenharmony_ci
435bf215546Sopenharmony_ci         void main()
436bf215546Sopenharmony_ci         {
437bf215546Sopenharmony_ci                 color = do_div(a, b);
438bf215546Sopenharmony_ci         }
439bf215546Sopenharmony_ci         """,
440bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
441bf215546Sopenharmony_ci    Test("f32 function highp args",
442bf215546Sopenharmony_ci         """
443bf215546Sopenharmony_ci         precision mediump float;
444bf215546Sopenharmony_ci
445bf215546Sopenharmony_ci         uniform float a, b;
446bf215546Sopenharmony_ci
447bf215546Sopenharmony_ci         mediump float
448bf215546Sopenharmony_ci         do_div(highp float x, highp float y)
449bf215546Sopenharmony_ci         {
450bf215546Sopenharmony_ci                 return x / y;
451bf215546Sopenharmony_ci         }
452bf215546Sopenharmony_ci
453bf215546Sopenharmony_ci         void main()
454bf215546Sopenharmony_ci         {
455bf215546Sopenharmony_ci                 gl_FragColor = vec4(do_div(a, b));
456bf215546Sopenharmony_ci         }
457bf215546Sopenharmony_ci         """,
458bf215546Sopenharmony_ci         r'\(expression +float +/'),
459bf215546Sopenharmony_ci    Test("i32 function highp args",
460bf215546Sopenharmony_ci         """
461bf215546Sopenharmony_ci         #version 310 es
462bf215546Sopenharmony_ci         precision mediump float;
463bf215546Sopenharmony_ci         precision mediump int;
464bf215546Sopenharmony_ci
465bf215546Sopenharmony_ci         uniform int a, b;
466bf215546Sopenharmony_ci
467bf215546Sopenharmony_ci         mediump int
468bf215546Sopenharmony_ci         do_div(highp int x, highp int y)
469bf215546Sopenharmony_ci         {
470bf215546Sopenharmony_ci                 return x / y;
471bf215546Sopenharmony_ci         }
472bf215546Sopenharmony_ci
473bf215546Sopenharmony_ci         out highp int color;
474bf215546Sopenharmony_ci
475bf215546Sopenharmony_ci         void main()
476bf215546Sopenharmony_ci         {
477bf215546Sopenharmony_ci                  color = do_div(a, b);
478bf215546Sopenharmony_ci         }
479bf215546Sopenharmony_ci         """,
480bf215546Sopenharmony_ci         r'\(expression +int +/'),
481bf215546Sopenharmony_ci    Test("u32 function highp args",
482bf215546Sopenharmony_ci         """
483bf215546Sopenharmony_ci         #version 310 es
484bf215546Sopenharmony_ci         precision mediump float;
485bf215546Sopenharmony_ci         precision mediump int;
486bf215546Sopenharmony_ci
487bf215546Sopenharmony_ci         uniform uint a, b;
488bf215546Sopenharmony_ci
489bf215546Sopenharmony_ci         mediump uint
490bf215546Sopenharmony_ci         do_div(highp uint x, highp uint y)
491bf215546Sopenharmony_ci         {
492bf215546Sopenharmony_ci                 return x / y;
493bf215546Sopenharmony_ci         }
494bf215546Sopenharmony_ci
495bf215546Sopenharmony_ci         out highp uint color;
496bf215546Sopenharmony_ci
497bf215546Sopenharmony_ci         void main()
498bf215546Sopenharmony_ci         {
499bf215546Sopenharmony_ci                  color = do_div(a, b);
500bf215546Sopenharmony_ci         }
501bf215546Sopenharmony_ci         """,
502bf215546Sopenharmony_ci         r'\(expression +uint +/'),
503bf215546Sopenharmony_ci    Test("f32 function inout different precision highp",
504bf215546Sopenharmony_ci         """
505bf215546Sopenharmony_ci         uniform mediump float a, b;
506bf215546Sopenharmony_ci
507bf215546Sopenharmony_ci         void
508bf215546Sopenharmony_ci         do_div(inout highp float x, highp float y)
509bf215546Sopenharmony_ci         {
510bf215546Sopenharmony_ci                 x = x / y;
511bf215546Sopenharmony_ci         }
512bf215546Sopenharmony_ci
513bf215546Sopenharmony_ci         void main()
514bf215546Sopenharmony_ci         {
515bf215546Sopenharmony_ci                 mediump float temp = a;
516bf215546Sopenharmony_ci                 do_div(temp, b);
517bf215546Sopenharmony_ci                 gl_FragColor = vec4(temp);
518bf215546Sopenharmony_ci         }
519bf215546Sopenharmony_ci         """,
520bf215546Sopenharmony_ci         r'\(expression +float +/'),
521bf215546Sopenharmony_ci    Test("i32 function inout different precision highp",
522bf215546Sopenharmony_ci         """
523bf215546Sopenharmony_ci         #version 310 es
524bf215546Sopenharmony_ci         uniform mediump int a, b;
525bf215546Sopenharmony_ci
526bf215546Sopenharmony_ci         void
527bf215546Sopenharmony_ci         do_div(inout highp int x, highp int y)
528bf215546Sopenharmony_ci         {
529bf215546Sopenharmony_ci                 x = x / y;
530bf215546Sopenharmony_ci         }
531bf215546Sopenharmony_ci
532bf215546Sopenharmony_ci         out mediump int color;
533bf215546Sopenharmony_ci
534bf215546Sopenharmony_ci         void main()
535bf215546Sopenharmony_ci         {
536bf215546Sopenharmony_ci                 mediump int temp = a;
537bf215546Sopenharmony_ci                 do_div(temp, b);
538bf215546Sopenharmony_ci                 color = temp;
539bf215546Sopenharmony_ci         }
540bf215546Sopenharmony_ci         """,
541bf215546Sopenharmony_ci         r'\(expression +int +/'),
542bf215546Sopenharmony_ci    Test("u32 function inout different precision highp",
543bf215546Sopenharmony_ci         """
544bf215546Sopenharmony_ci         #version 310 es
545bf215546Sopenharmony_ci         uniform mediump uint a, b;
546bf215546Sopenharmony_ci
547bf215546Sopenharmony_ci         void
548bf215546Sopenharmony_ci         do_div(inout highp uint x, highp uint y)
549bf215546Sopenharmony_ci         {
550bf215546Sopenharmony_ci                 x = x / y;
551bf215546Sopenharmony_ci         }
552bf215546Sopenharmony_ci
553bf215546Sopenharmony_ci         out mediump uint color;
554bf215546Sopenharmony_ci
555bf215546Sopenharmony_ci         void main()
556bf215546Sopenharmony_ci         {
557bf215546Sopenharmony_ci                 mediump uint temp = a;
558bf215546Sopenharmony_ci                 do_div(temp, b);
559bf215546Sopenharmony_ci                 color = temp;
560bf215546Sopenharmony_ci         }
561bf215546Sopenharmony_ci         """,
562bf215546Sopenharmony_ci         r'\(expression +uint +/'),
563bf215546Sopenharmony_ci    Test("f32 function inout different precision mediump",
564bf215546Sopenharmony_ci         """
565bf215546Sopenharmony_ci         uniform highp float a, b;
566bf215546Sopenharmony_ci
567bf215546Sopenharmony_ci         void
568bf215546Sopenharmony_ci         do_div(inout mediump float x, mediump float y)
569bf215546Sopenharmony_ci         {
570bf215546Sopenharmony_ci                 x = x / y;
571bf215546Sopenharmony_ci         }
572bf215546Sopenharmony_ci
573bf215546Sopenharmony_ci         void main()
574bf215546Sopenharmony_ci         {
575bf215546Sopenharmony_ci                 highp float temp = a;
576bf215546Sopenharmony_ci                 do_div(temp, b);
577bf215546Sopenharmony_ci                 gl_FragColor = vec4(temp);
578bf215546Sopenharmony_ci         }
579bf215546Sopenharmony_ci         """,
580bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
581bf215546Sopenharmony_ci    Test("i32 function inout different precision mediump",
582bf215546Sopenharmony_ci         """
583bf215546Sopenharmony_ci         #version 310 es
584bf215546Sopenharmony_ci         uniform highp int a, b;
585bf215546Sopenharmony_ci
586bf215546Sopenharmony_ci         out highp int color;
587bf215546Sopenharmony_ci
588bf215546Sopenharmony_ci         void
589bf215546Sopenharmony_ci         do_div(inout mediump int x, mediump int y)
590bf215546Sopenharmony_ci         {
591bf215546Sopenharmony_ci                 x = x / y;
592bf215546Sopenharmony_ci         }
593bf215546Sopenharmony_ci
594bf215546Sopenharmony_ci         void main()
595bf215546Sopenharmony_ci         {
596bf215546Sopenharmony_ci                 highp int temp = a;
597bf215546Sopenharmony_ci                 do_div(temp, b);
598bf215546Sopenharmony_ci                 color = temp;
599bf215546Sopenharmony_ci         }
600bf215546Sopenharmony_ci         """,
601bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
602bf215546Sopenharmony_ci    Test("u32 function inout different precision mediump",
603bf215546Sopenharmony_ci         """
604bf215546Sopenharmony_ci         #version 310 es
605bf215546Sopenharmony_ci         uniform highp uint a, b;
606bf215546Sopenharmony_ci
607bf215546Sopenharmony_ci         out highp uint color;
608bf215546Sopenharmony_ci
609bf215546Sopenharmony_ci         void
610bf215546Sopenharmony_ci         do_div(inout mediump uint x, mediump uint y)
611bf215546Sopenharmony_ci         {
612bf215546Sopenharmony_ci                 x = x / y;
613bf215546Sopenharmony_ci         }
614bf215546Sopenharmony_ci
615bf215546Sopenharmony_ci         void main()
616bf215546Sopenharmony_ci         {
617bf215546Sopenharmony_ci                 highp uint temp = a;
618bf215546Sopenharmony_ci                 do_div(temp, b);
619bf215546Sopenharmony_ci                 color = temp;
620bf215546Sopenharmony_ci         }
621bf215546Sopenharmony_ci         """,
622bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
623bf215546Sopenharmony_ci    Test("f32 if",
624bf215546Sopenharmony_ci         """
625bf215546Sopenharmony_ci         precision mediump float;
626bf215546Sopenharmony_ci
627bf215546Sopenharmony_ci         uniform float a, b;
628bf215546Sopenharmony_ci
629bf215546Sopenharmony_ci         void
630bf215546Sopenharmony_ci         main()
631bf215546Sopenharmony_ci         {
632bf215546Sopenharmony_ci                 if (a / b < 0.31)
633bf215546Sopenharmony_ci                         gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
634bf215546Sopenharmony_ci                 else
635bf215546Sopenharmony_ci                         gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
636bf215546Sopenharmony_ci         }
637bf215546Sopenharmony_ci         """,
638bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
639bf215546Sopenharmony_ci    Test("i32 if",
640bf215546Sopenharmony_ci         """
641bf215546Sopenharmony_ci         #version 310 es
642bf215546Sopenharmony_ci         precision mediump float;
643bf215546Sopenharmony_ci         precision mediump int;
644bf215546Sopenharmony_ci
645bf215546Sopenharmony_ci         uniform int a, b;
646bf215546Sopenharmony_ci
647bf215546Sopenharmony_ci         out vec4 color;
648bf215546Sopenharmony_ci
649bf215546Sopenharmony_ci         void
650bf215546Sopenharmony_ci         main()
651bf215546Sopenharmony_ci         {
652bf215546Sopenharmony_ci                 if (a / b < 10)
653bf215546Sopenharmony_ci                         color = vec4(0.0, 1.0, 0.0, 1.0);
654bf215546Sopenharmony_ci                 else
655bf215546Sopenharmony_ci                         color = vec4(1.0, 0.0, 0.0, 1.0);
656bf215546Sopenharmony_ci         }
657bf215546Sopenharmony_ci         """,
658bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
659bf215546Sopenharmony_ci    Test("u32 if",
660bf215546Sopenharmony_ci         """
661bf215546Sopenharmony_ci         #version 310 es
662bf215546Sopenharmony_ci         precision mediump float;
663bf215546Sopenharmony_ci         precision mediump int;
664bf215546Sopenharmony_ci
665bf215546Sopenharmony_ci         uniform uint a, b;
666bf215546Sopenharmony_ci
667bf215546Sopenharmony_ci         out vec4 color;
668bf215546Sopenharmony_ci
669bf215546Sopenharmony_ci         void
670bf215546Sopenharmony_ci         main()
671bf215546Sopenharmony_ci         {
672bf215546Sopenharmony_ci                 if (a / b < 10u)
673bf215546Sopenharmony_ci                         color = vec4(0.0, 1.0, 0.0, 1.0);
674bf215546Sopenharmony_ci                 else
675bf215546Sopenharmony_ci                         color = vec4(1.0, 0.0, 0.0, 1.0);
676bf215546Sopenharmony_ci         }
677bf215546Sopenharmony_ci         """,
678bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
679bf215546Sopenharmony_ci    Test("matrix",
680bf215546Sopenharmony_ci         """
681bf215546Sopenharmony_ci         precision mediump float;
682bf215546Sopenharmony_ci
683bf215546Sopenharmony_ci         uniform vec2 a;
684bf215546Sopenharmony_ci         uniform mat2 b;
685bf215546Sopenharmony_ci
686bf215546Sopenharmony_ci         void main()
687bf215546Sopenharmony_ci         {
688bf215546Sopenharmony_ci             gl_FragColor = vec4(b * a, 0.0, 0.0);
689bf215546Sopenharmony_ci         }
690bf215546Sopenharmony_ci         """,
691bf215546Sopenharmony_ci         r'\(expression +f16vec2 \* \(var_ref b\) \(var_ref a\)'),
692bf215546Sopenharmony_ci    Test("f32 simple struct deref",
693bf215546Sopenharmony_ci         """
694bf215546Sopenharmony_ci         precision mediump float;
695bf215546Sopenharmony_ci
696bf215546Sopenharmony_ci         struct simple {
697bf215546Sopenharmony_ci                 float a, b;
698bf215546Sopenharmony_ci         };
699bf215546Sopenharmony_ci
700bf215546Sopenharmony_ci         uniform simple in_simple;
701bf215546Sopenharmony_ci
702bf215546Sopenharmony_ci         void main()
703bf215546Sopenharmony_ci         {
704bf215546Sopenharmony_ci                 gl_FragColor = vec4(in_simple.a / in_simple.b);
705bf215546Sopenharmony_ci         }
706bf215546Sopenharmony_ci         """,
707bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
708bf215546Sopenharmony_ci    Test("i32 simple struct deref",
709bf215546Sopenharmony_ci         """
710bf215546Sopenharmony_ci         #version 310 es
711bf215546Sopenharmony_ci         precision mediump float;
712bf215546Sopenharmony_ci         precision mediump int;
713bf215546Sopenharmony_ci
714bf215546Sopenharmony_ci         struct simple {
715bf215546Sopenharmony_ci                 int a, b;
716bf215546Sopenharmony_ci         };
717bf215546Sopenharmony_ci
718bf215546Sopenharmony_ci         uniform simple in_simple;
719bf215546Sopenharmony_ci
720bf215546Sopenharmony_ci         out highp int color;
721bf215546Sopenharmony_ci
722bf215546Sopenharmony_ci         void main()
723bf215546Sopenharmony_ci         {
724bf215546Sopenharmony_ci                 color = in_simple.a / in_simple.b;
725bf215546Sopenharmony_ci         }
726bf215546Sopenharmony_ci         """,
727bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
728bf215546Sopenharmony_ci    Test("u32 simple struct deref",
729bf215546Sopenharmony_ci         """
730bf215546Sopenharmony_ci         #version 310 es
731bf215546Sopenharmony_ci         precision mediump float;
732bf215546Sopenharmony_ci         precision mediump int;
733bf215546Sopenharmony_ci
734bf215546Sopenharmony_ci         struct simple {
735bf215546Sopenharmony_ci                 uint a, b;
736bf215546Sopenharmony_ci         };
737bf215546Sopenharmony_ci
738bf215546Sopenharmony_ci         uniform simple in_simple;
739bf215546Sopenharmony_ci
740bf215546Sopenharmony_ci         out highp uint color;
741bf215546Sopenharmony_ci
742bf215546Sopenharmony_ci         void main()
743bf215546Sopenharmony_ci         {
744bf215546Sopenharmony_ci                 color = in_simple.a / in_simple.b;
745bf215546Sopenharmony_ci         }
746bf215546Sopenharmony_ci         """,
747bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
748bf215546Sopenharmony_ci    Test("f32 embedded struct deref",
749bf215546Sopenharmony_ci         """
750bf215546Sopenharmony_ci         precision mediump float;
751bf215546Sopenharmony_ci
752bf215546Sopenharmony_ci         struct simple {
753bf215546Sopenharmony_ci                 float a, b;
754bf215546Sopenharmony_ci         };
755bf215546Sopenharmony_ci
756bf215546Sopenharmony_ci         struct embedded {
757bf215546Sopenharmony_ci                 simple a, b;
758bf215546Sopenharmony_ci         };
759bf215546Sopenharmony_ci
760bf215546Sopenharmony_ci         uniform embedded in_embedded;
761bf215546Sopenharmony_ci
762bf215546Sopenharmony_ci         void main()
763bf215546Sopenharmony_ci         {
764bf215546Sopenharmony_ci                 gl_FragColor = vec4(in_embedded.a.a / in_embedded.b.b);
765bf215546Sopenharmony_ci         }
766bf215546Sopenharmony_ci         """,
767bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
768bf215546Sopenharmony_ci    Test("i32 embedded struct deref",
769bf215546Sopenharmony_ci         """
770bf215546Sopenharmony_ci         #version 310 es
771bf215546Sopenharmony_ci         precision mediump float;
772bf215546Sopenharmony_ci         precision mediump int;
773bf215546Sopenharmony_ci
774bf215546Sopenharmony_ci         struct simple {
775bf215546Sopenharmony_ci                 int a, b;
776bf215546Sopenharmony_ci         };
777bf215546Sopenharmony_ci
778bf215546Sopenharmony_ci         struct embedded {
779bf215546Sopenharmony_ci                 simple a, b;
780bf215546Sopenharmony_ci         };
781bf215546Sopenharmony_ci
782bf215546Sopenharmony_ci         uniform embedded in_embedded;
783bf215546Sopenharmony_ci
784bf215546Sopenharmony_ci         out highp int color;
785bf215546Sopenharmony_ci
786bf215546Sopenharmony_ci         void main()
787bf215546Sopenharmony_ci         {
788bf215546Sopenharmony_ci                 color = in_embedded.a.a / in_embedded.b.b;
789bf215546Sopenharmony_ci         }
790bf215546Sopenharmony_ci         """,
791bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
792bf215546Sopenharmony_ci    Test("u32 embedded struct deref",
793bf215546Sopenharmony_ci         """
794bf215546Sopenharmony_ci         #version 310 es
795bf215546Sopenharmony_ci         precision mediump float;
796bf215546Sopenharmony_ci         precision mediump int;
797bf215546Sopenharmony_ci
798bf215546Sopenharmony_ci         struct simple {
799bf215546Sopenharmony_ci                 uint a, b;
800bf215546Sopenharmony_ci         };
801bf215546Sopenharmony_ci
802bf215546Sopenharmony_ci         struct embedded {
803bf215546Sopenharmony_ci                 simple a, b;
804bf215546Sopenharmony_ci         };
805bf215546Sopenharmony_ci
806bf215546Sopenharmony_ci         uniform embedded in_embedded;
807bf215546Sopenharmony_ci
808bf215546Sopenharmony_ci         out highp uint color;
809bf215546Sopenharmony_ci
810bf215546Sopenharmony_ci         void main()
811bf215546Sopenharmony_ci         {
812bf215546Sopenharmony_ci                 color = in_embedded.a.a / in_embedded.b.b;
813bf215546Sopenharmony_ci         }
814bf215546Sopenharmony_ci         """,
815bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
816bf215546Sopenharmony_ci    Test("f32 arrayed struct deref",
817bf215546Sopenharmony_ci         """
818bf215546Sopenharmony_ci         precision mediump float;
819bf215546Sopenharmony_ci
820bf215546Sopenharmony_ci         struct simple {
821bf215546Sopenharmony_ci                 float a, b;
822bf215546Sopenharmony_ci         };
823bf215546Sopenharmony_ci
824bf215546Sopenharmony_ci         struct arrayed {
825bf215546Sopenharmony_ci                 simple a[2];
826bf215546Sopenharmony_ci         };
827bf215546Sopenharmony_ci
828bf215546Sopenharmony_ci         uniform arrayed in_arrayed;
829bf215546Sopenharmony_ci
830bf215546Sopenharmony_ci         void main()
831bf215546Sopenharmony_ci         {
832bf215546Sopenharmony_ci                 gl_FragColor = vec4(in_arrayed.a[0].a / in_arrayed.a[1].b);
833bf215546Sopenharmony_ci         }
834bf215546Sopenharmony_ci         """,
835bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
836bf215546Sopenharmony_ci    Test("i32 arrayed struct deref",
837bf215546Sopenharmony_ci         """
838bf215546Sopenharmony_ci         #version 310 es
839bf215546Sopenharmony_ci         precision mediump float;
840bf215546Sopenharmony_ci         precision mediump int;
841bf215546Sopenharmony_ci
842bf215546Sopenharmony_ci         struct simple {
843bf215546Sopenharmony_ci                 int a, b;
844bf215546Sopenharmony_ci         };
845bf215546Sopenharmony_ci
846bf215546Sopenharmony_ci         struct arrayed {
847bf215546Sopenharmony_ci                 simple a[2];
848bf215546Sopenharmony_ci         };
849bf215546Sopenharmony_ci
850bf215546Sopenharmony_ci         uniform arrayed in_arrayed;
851bf215546Sopenharmony_ci
852bf215546Sopenharmony_ci         out highp int color;
853bf215546Sopenharmony_ci
854bf215546Sopenharmony_ci         void main()
855bf215546Sopenharmony_ci         {
856bf215546Sopenharmony_ci                 color = in_arrayed.a[0].a / in_arrayed.a[1].b;
857bf215546Sopenharmony_ci         }
858bf215546Sopenharmony_ci         """,
859bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
860bf215546Sopenharmony_ci    Test("u32 arrayed struct deref",
861bf215546Sopenharmony_ci         """
862bf215546Sopenharmony_ci         #version 310 es
863bf215546Sopenharmony_ci         precision mediump float;
864bf215546Sopenharmony_ci         precision mediump int;
865bf215546Sopenharmony_ci
866bf215546Sopenharmony_ci         struct simple {
867bf215546Sopenharmony_ci                 uint a, b;
868bf215546Sopenharmony_ci         };
869bf215546Sopenharmony_ci
870bf215546Sopenharmony_ci         struct arrayed {
871bf215546Sopenharmony_ci                 simple a[2];
872bf215546Sopenharmony_ci         };
873bf215546Sopenharmony_ci
874bf215546Sopenharmony_ci         uniform arrayed in_arrayed;
875bf215546Sopenharmony_ci
876bf215546Sopenharmony_ci         out highp uint color;
877bf215546Sopenharmony_ci
878bf215546Sopenharmony_ci         void main()
879bf215546Sopenharmony_ci         {
880bf215546Sopenharmony_ci                 color = in_arrayed.a[0].a / in_arrayed.a[1].b;
881bf215546Sopenharmony_ci         }
882bf215546Sopenharmony_ci         """,
883bf215546Sopenharmony_ci         r'\(expression +uint16_t +/'),
884bf215546Sopenharmony_ci    Test("f32 mixed precision not lowered",
885bf215546Sopenharmony_ci         """
886bf215546Sopenharmony_ci         uniform mediump float a;
887bf215546Sopenharmony_ci         uniform highp float b;
888bf215546Sopenharmony_ci
889bf215546Sopenharmony_ci         void main()
890bf215546Sopenharmony_ci         {
891bf215546Sopenharmony_ci                 gl_FragColor = vec4(a / b);
892bf215546Sopenharmony_ci         }
893bf215546Sopenharmony_ci         """,
894bf215546Sopenharmony_ci         r'\(expression +float +/'),
895bf215546Sopenharmony_ci    Test("i32 mixed precision not lowered",
896bf215546Sopenharmony_ci         """
897bf215546Sopenharmony_ci         #version 310 es
898bf215546Sopenharmony_ci         uniform mediump int a;
899bf215546Sopenharmony_ci         uniform highp int b;
900bf215546Sopenharmony_ci
901bf215546Sopenharmony_ci         out mediump int color;
902bf215546Sopenharmony_ci
903bf215546Sopenharmony_ci         void main()
904bf215546Sopenharmony_ci         {
905bf215546Sopenharmony_ci                 color = a / b;
906bf215546Sopenharmony_ci         }
907bf215546Sopenharmony_ci         """,
908bf215546Sopenharmony_ci         r'\(expression +int +/'),
909bf215546Sopenharmony_ci    Test("u32 mixed precision not lowered",
910bf215546Sopenharmony_ci         """
911bf215546Sopenharmony_ci         #version 310 es
912bf215546Sopenharmony_ci         uniform mediump uint a;
913bf215546Sopenharmony_ci         uniform highp uint b;
914bf215546Sopenharmony_ci
915bf215546Sopenharmony_ci         out mediump uint color;
916bf215546Sopenharmony_ci
917bf215546Sopenharmony_ci         void main()
918bf215546Sopenharmony_ci         {
919bf215546Sopenharmony_ci                 color = a / b;
920bf215546Sopenharmony_ci         }
921bf215546Sopenharmony_ci         """,
922bf215546Sopenharmony_ci         r'\(expression +uint +/'),
923bf215546Sopenharmony_ci    Test("f32 sampler array",
924bf215546Sopenharmony_ci         """
925bf215546Sopenharmony_ci         #version 320 es
926bf215546Sopenharmony_ci         precision mediump float;
927bf215546Sopenharmony_ci         precision mediump int;
928bf215546Sopenharmony_ci
929bf215546Sopenharmony_ci         uniform sampler2D tex[2];
930bf215546Sopenharmony_ci         // highp shouldn't affect the return value of texture2D
931bf215546Sopenharmony_ci         uniform highp vec2 coord;
932bf215546Sopenharmony_ci         uniform float divisor;
933bf215546Sopenharmony_ci         uniform int index;
934bf215546Sopenharmony_ci
935bf215546Sopenharmony_ci         out highp vec4 color;
936bf215546Sopenharmony_ci
937bf215546Sopenharmony_ci         void main()
938bf215546Sopenharmony_ci         {
939bf215546Sopenharmony_ci                 color = texture2D(tex[index], coord) / divisor;
940bf215546Sopenharmony_ci         }
941bf215546Sopenharmony_ci         """,
942bf215546Sopenharmony_ci         r'\(expression +f16vec4 +/.*\(tex +f16vec4 +'),
943bf215546Sopenharmony_ci    Test("f32 texture sample",
944bf215546Sopenharmony_ci         """
945bf215546Sopenharmony_ci         precision mediump float;
946bf215546Sopenharmony_ci
947bf215546Sopenharmony_ci         uniform sampler2D tex;
948bf215546Sopenharmony_ci         // highp shouldn't affect the return value of texture2D
949bf215546Sopenharmony_ci         uniform highp vec2 coord;
950bf215546Sopenharmony_ci         uniform float divisor;
951bf215546Sopenharmony_ci
952bf215546Sopenharmony_ci         void main()
953bf215546Sopenharmony_ci         {
954bf215546Sopenharmony_ci                 gl_FragColor = texture2D(tex, coord) / divisor;
955bf215546Sopenharmony_ci         }
956bf215546Sopenharmony_ci         """,
957bf215546Sopenharmony_ci         r'\(expression +f16vec4 +/.*\(tex +f16vec4 +'),
958bf215546Sopenharmony_ci    Test("i32 texture sample",
959bf215546Sopenharmony_ci         """
960bf215546Sopenharmony_ci         #version 310 es
961bf215546Sopenharmony_ci         precision mediump float;
962bf215546Sopenharmony_ci         precision mediump int;
963bf215546Sopenharmony_ci
964bf215546Sopenharmony_ci         uniform mediump isampler2D tex;
965bf215546Sopenharmony_ci         // highp shouldn't affect the return value of texture
966bf215546Sopenharmony_ci         uniform highp vec2 coord;
967bf215546Sopenharmony_ci         uniform int divisor;
968bf215546Sopenharmony_ci
969bf215546Sopenharmony_ci         out highp ivec4 color;
970bf215546Sopenharmony_ci
971bf215546Sopenharmony_ci         void main()
972bf215546Sopenharmony_ci         {
973bf215546Sopenharmony_ci                 color = texture(tex, coord) / divisor;
974bf215546Sopenharmony_ci         }
975bf215546Sopenharmony_ci         """,
976bf215546Sopenharmony_ci         r'\(expression +i16vec4 +/.*\(tex +i16vec4 +'),
977bf215546Sopenharmony_ci    Test("u32 texture sample",
978bf215546Sopenharmony_ci         """
979bf215546Sopenharmony_ci         #version 310 es
980bf215546Sopenharmony_ci         precision mediump float;
981bf215546Sopenharmony_ci         precision mediump int;
982bf215546Sopenharmony_ci
983bf215546Sopenharmony_ci         uniform mediump usampler2D tex;
984bf215546Sopenharmony_ci         // highp shouldn't affect the return value of texture
985bf215546Sopenharmony_ci         uniform highp vec2 coord;
986bf215546Sopenharmony_ci         uniform uint divisor;
987bf215546Sopenharmony_ci
988bf215546Sopenharmony_ci         out highp uvec4 color;
989bf215546Sopenharmony_ci
990bf215546Sopenharmony_ci         void main()
991bf215546Sopenharmony_ci         {
992bf215546Sopenharmony_ci                 color = texture(tex, coord) / divisor;
993bf215546Sopenharmony_ci         }
994bf215546Sopenharmony_ci         """,
995bf215546Sopenharmony_ci         r'\(expression +u16vec4 +/.*\(tex +u16vec4 +'),
996bf215546Sopenharmony_ci    Test("f32 image array",
997bf215546Sopenharmony_ci         """
998bf215546Sopenharmony_ci         #version 320 es
999bf215546Sopenharmony_ci         precision mediump float;
1000bf215546Sopenharmony_ci
1001bf215546Sopenharmony_ci         layout(rgba16f) readonly uniform mediump image2D img[2];
1002bf215546Sopenharmony_ci         // highp shouldn't affect the return value of imageLoad
1003bf215546Sopenharmony_ci         uniform highp ivec2 coord;
1004bf215546Sopenharmony_ci         uniform float divisor;
1005bf215546Sopenharmony_ci
1006bf215546Sopenharmony_ci         out highp vec4 color;
1007bf215546Sopenharmony_ci
1008bf215546Sopenharmony_ci         void main()
1009bf215546Sopenharmony_ci         {
1010bf215546Sopenharmony_ci                 color = imageLoad(img[1], coord) / divisor;
1011bf215546Sopenharmony_ci         }
1012bf215546Sopenharmony_ci         """,
1013bf215546Sopenharmony_ci         r'\(expression +f16vec4 +/'),
1014bf215546Sopenharmony_ci    Test("f32 image load",
1015bf215546Sopenharmony_ci         """
1016bf215546Sopenharmony_ci         #version 310 es
1017bf215546Sopenharmony_ci         precision mediump float;
1018bf215546Sopenharmony_ci         precision mediump int;
1019bf215546Sopenharmony_ci
1020bf215546Sopenharmony_ci         layout(rgba16f) readonly uniform mediump image2D img;
1021bf215546Sopenharmony_ci         // highp shouldn't affect the return value of imageLoad
1022bf215546Sopenharmony_ci         uniform highp ivec2 coord;
1023bf215546Sopenharmony_ci         uniform float divisor;
1024bf215546Sopenharmony_ci
1025bf215546Sopenharmony_ci         out highp vec4 color;
1026bf215546Sopenharmony_ci
1027bf215546Sopenharmony_ci         void main()
1028bf215546Sopenharmony_ci         {
1029bf215546Sopenharmony_ci                 color = imageLoad(img, coord) / divisor;
1030bf215546Sopenharmony_ci         }
1031bf215546Sopenharmony_ci         """,
1032bf215546Sopenharmony_ci         r'\(expression +f16vec4 +/'),
1033bf215546Sopenharmony_ci    Test("i32 image load",
1034bf215546Sopenharmony_ci         """
1035bf215546Sopenharmony_ci         #version 310 es
1036bf215546Sopenharmony_ci         precision mediump float;
1037bf215546Sopenharmony_ci         precision mediump int;
1038bf215546Sopenharmony_ci
1039bf215546Sopenharmony_ci         layout(rgba16i) readonly uniform mediump iimage2D img;
1040bf215546Sopenharmony_ci         // highp shouldn't affect the return value of imageLoad
1041bf215546Sopenharmony_ci         uniform highp ivec2 coord;
1042bf215546Sopenharmony_ci         uniform int divisor;
1043bf215546Sopenharmony_ci
1044bf215546Sopenharmony_ci         out highp ivec4 color;
1045bf215546Sopenharmony_ci
1046bf215546Sopenharmony_ci         void main()
1047bf215546Sopenharmony_ci         {
1048bf215546Sopenharmony_ci                 color = imageLoad(img, coord) / divisor;
1049bf215546Sopenharmony_ci         }
1050bf215546Sopenharmony_ci         """,
1051bf215546Sopenharmony_ci         r'\(expression +i16vec4 +/'),
1052bf215546Sopenharmony_ci    Test("u32 image load",
1053bf215546Sopenharmony_ci         """
1054bf215546Sopenharmony_ci         #version 310 es
1055bf215546Sopenharmony_ci         precision mediump float;
1056bf215546Sopenharmony_ci         precision mediump int;
1057bf215546Sopenharmony_ci
1058bf215546Sopenharmony_ci         layout(rgba16ui) readonly uniform mediump uimage2D img;
1059bf215546Sopenharmony_ci         // highp shouldn't affect the return value of imageLoad
1060bf215546Sopenharmony_ci         uniform highp ivec2 coord;
1061bf215546Sopenharmony_ci         uniform uint divisor;
1062bf215546Sopenharmony_ci
1063bf215546Sopenharmony_ci         out highp uvec4 color;
1064bf215546Sopenharmony_ci
1065bf215546Sopenharmony_ci         void main()
1066bf215546Sopenharmony_ci         {
1067bf215546Sopenharmony_ci                 color = imageLoad(img, coord) / divisor;
1068bf215546Sopenharmony_ci         }
1069bf215546Sopenharmony_ci         """,
1070bf215546Sopenharmony_ci         r'\(expression +u16vec4 +/'),
1071bf215546Sopenharmony_ci    Test("f32 expression in lvalue",
1072bf215546Sopenharmony_ci         """
1073bf215546Sopenharmony_ci         uniform mediump float a, b;
1074bf215546Sopenharmony_ci
1075bf215546Sopenharmony_ci         void main()
1076bf215546Sopenharmony_ci         {
1077bf215546Sopenharmony_ci                 gl_FragColor = vec4(1.0);
1078bf215546Sopenharmony_ci                 gl_FragColor[int(a / b)] = 0.5;
1079bf215546Sopenharmony_ci         }
1080bf215546Sopenharmony_ci         """,
1081bf215546Sopenharmony_ci         r'\(expression +float16_t +/'),
1082bf215546Sopenharmony_ci    Test("i32 expression in lvalue",
1083bf215546Sopenharmony_ci         """
1084bf215546Sopenharmony_ci         #version 310 es
1085bf215546Sopenharmony_ci         precision mediump float;
1086bf215546Sopenharmony_ci         precision mediump int;
1087bf215546Sopenharmony_ci
1088bf215546Sopenharmony_ci         uniform mediump int a, b;
1089bf215546Sopenharmony_ci
1090bf215546Sopenharmony_ci         out vec4 color;
1091bf215546Sopenharmony_ci
1092bf215546Sopenharmony_ci         void main()
1093bf215546Sopenharmony_ci         {
1094bf215546Sopenharmony_ci                 color = vec4(1.0);
1095bf215546Sopenharmony_ci                 color[a / b] = 0.5;
1096bf215546Sopenharmony_ci         }
1097bf215546Sopenharmony_ci         """,
1098bf215546Sopenharmony_ci         r'\(expression +int16_t +/'),
1099bf215546Sopenharmony_ci    Test("f32 builtin with const arg",
1100bf215546Sopenharmony_ci         """
1101bf215546Sopenharmony_ci         uniform mediump float a;
1102bf215546Sopenharmony_ci
1103bf215546Sopenharmony_ci         void main()
1104bf215546Sopenharmony_ci         {
1105bf215546Sopenharmony_ci                 gl_FragColor = vec4(min(a, 3.0));
1106bf215546Sopenharmony_ci         }
1107bf215546Sopenharmony_ci         """,
1108bf215546Sopenharmony_ci         r'\(expression +float16_t min'),
1109bf215546Sopenharmony_ci    Test("i32 builtin with const arg",
1110bf215546Sopenharmony_ci         """
1111bf215546Sopenharmony_ci         #version 310 es
1112bf215546Sopenharmony_ci         uniform mediump int a;
1113bf215546Sopenharmony_ci
1114bf215546Sopenharmony_ci         out highp int color;
1115bf215546Sopenharmony_ci
1116bf215546Sopenharmony_ci         void main()
1117bf215546Sopenharmony_ci         {
1118bf215546Sopenharmony_ci                 color = min(a, 3);
1119bf215546Sopenharmony_ci         }
1120bf215546Sopenharmony_ci         """,
1121bf215546Sopenharmony_ci         r'\(expression +int16_t min'),
1122bf215546Sopenharmony_ci    Test("u32 builtin with const arg",
1123bf215546Sopenharmony_ci         """
1124bf215546Sopenharmony_ci         #version 310 es
1125bf215546Sopenharmony_ci         uniform mediump uint a;
1126bf215546Sopenharmony_ci
1127bf215546Sopenharmony_ci         out highp uint color;
1128bf215546Sopenharmony_ci
1129bf215546Sopenharmony_ci         void main()
1130bf215546Sopenharmony_ci         {
1131bf215546Sopenharmony_ci                 color = min(a, 3u);
1132bf215546Sopenharmony_ci         }
1133bf215546Sopenharmony_ci         """,
1134bf215546Sopenharmony_ci         r'\(expression +uint16_t min'),
1135bf215546Sopenharmony_ci    Test("dFdx",
1136bf215546Sopenharmony_ci         """
1137bf215546Sopenharmony_ci         #version 300 es
1138bf215546Sopenharmony_ci         precision mediump float;
1139bf215546Sopenharmony_ci
1140bf215546Sopenharmony_ci         in vec4 var;
1141bf215546Sopenharmony_ci         out vec4 color;
1142bf215546Sopenharmony_ci
1143bf215546Sopenharmony_ci         void main()
1144bf215546Sopenharmony_ci         {
1145bf215546Sopenharmony_ci                 color = dFdx(var);
1146bf215546Sopenharmony_ci         }
1147bf215546Sopenharmony_ci         """,
1148bf215546Sopenharmony_ci         r'\(expression +f16vec4 +dFdx +\(expression +f16vec4'),
1149bf215546Sopenharmony_ci    Test("dFdy",
1150bf215546Sopenharmony_ci         """
1151bf215546Sopenharmony_ci         #version 300 es
1152bf215546Sopenharmony_ci         precision mediump float;
1153bf215546Sopenharmony_ci
1154bf215546Sopenharmony_ci         in vec4 var;
1155bf215546Sopenharmony_ci         out vec4 color;
1156bf215546Sopenharmony_ci
1157bf215546Sopenharmony_ci         void main()
1158bf215546Sopenharmony_ci         {
1159bf215546Sopenharmony_ci                 color = dFdy(var);
1160bf215546Sopenharmony_ci         }
1161bf215546Sopenharmony_ci         """,
1162bf215546Sopenharmony_ci         r'\(expression +f16vec4 +dFdy +\(expression +f16vec4'),
1163bf215546Sopenharmony_ci    Test("textureSize",
1164bf215546Sopenharmony_ci         """
1165bf215546Sopenharmony_ci         #version 310 es
1166bf215546Sopenharmony_ci         precision mediump float;
1167bf215546Sopenharmony_ci         precision mediump int;
1168bf215546Sopenharmony_ci
1169bf215546Sopenharmony_ci         uniform mediump sampler2D tex;
1170bf215546Sopenharmony_ci         out ivec2 color;
1171bf215546Sopenharmony_ci
1172bf215546Sopenharmony_ci         void main()
1173bf215546Sopenharmony_ci         {
1174bf215546Sopenharmony_ci                 color = textureSize(tex, 0) * ivec2(2);
1175bf215546Sopenharmony_ci         }
1176bf215546Sopenharmony_ci         """,
1177bf215546Sopenharmony_ci         r'expression ivec2 \* \(txs ivec2 \(var_ref tex'),
1178bf215546Sopenharmony_ci    Test("floatBitsToInt",
1179bf215546Sopenharmony_ci         """
1180bf215546Sopenharmony_ci         #version 310 es
1181bf215546Sopenharmony_ci         precision mediump float;
1182bf215546Sopenharmony_ci         precision mediump int;
1183bf215546Sopenharmony_ci
1184bf215546Sopenharmony_ci         uniform float val;
1185bf215546Sopenharmony_ci         out int color;
1186bf215546Sopenharmony_ci
1187bf215546Sopenharmony_ci         void main()
1188bf215546Sopenharmony_ci         {
1189bf215546Sopenharmony_ci                 color = floatBitsToInt(val + 1.0) + 1;
1190bf215546Sopenharmony_ci         }
1191bf215546Sopenharmony_ci         """,
1192bf215546Sopenharmony_ci         r'expression int bitcast_f2i \(expression float'),
1193bf215546Sopenharmony_ci    Test("floatBitsToUint",
1194bf215546Sopenharmony_ci         """
1195bf215546Sopenharmony_ci         #version 310 es
1196bf215546Sopenharmony_ci         precision mediump float;
1197bf215546Sopenharmony_ci         precision mediump int;
1198bf215546Sopenharmony_ci
1199bf215546Sopenharmony_ci         uniform float val;
1200bf215546Sopenharmony_ci         out uint color;
1201bf215546Sopenharmony_ci
1202bf215546Sopenharmony_ci         void main()
1203bf215546Sopenharmony_ci         {
1204bf215546Sopenharmony_ci                 color = floatBitsToUint(val + 1.0) + 1u;
1205bf215546Sopenharmony_ci         }
1206bf215546Sopenharmony_ci         """,
1207bf215546Sopenharmony_ci         r'expression uint bitcast_f2u \(expression float'),
1208bf215546Sopenharmony_ci    Test("intBitsToFloat",
1209bf215546Sopenharmony_ci         """
1210bf215546Sopenharmony_ci         #version 310 es
1211bf215546Sopenharmony_ci         precision mediump float;
1212bf215546Sopenharmony_ci         precision mediump int;
1213bf215546Sopenharmony_ci
1214bf215546Sopenharmony_ci         uniform int val;
1215bf215546Sopenharmony_ci         out float color;
1216bf215546Sopenharmony_ci
1217bf215546Sopenharmony_ci         void main()
1218bf215546Sopenharmony_ci         {
1219bf215546Sopenharmony_ci                 color = intBitsToFloat(val + 1) + 1.0;
1220bf215546Sopenharmony_ci         }
1221bf215546Sopenharmony_ci         """,
1222bf215546Sopenharmony_ci         r'expression float bitcast_i2f \(expression int'),
1223bf215546Sopenharmony_ci    Test("uintBitsToFloat",
1224bf215546Sopenharmony_ci         """
1225bf215546Sopenharmony_ci         #version 310 es
1226bf215546Sopenharmony_ci         precision mediump float;
1227bf215546Sopenharmony_ci         precision mediump int;
1228bf215546Sopenharmony_ci
1229bf215546Sopenharmony_ci         uniform uint val;
1230bf215546Sopenharmony_ci         out float color;
1231bf215546Sopenharmony_ci
1232bf215546Sopenharmony_ci         void main()
1233bf215546Sopenharmony_ci         {
1234bf215546Sopenharmony_ci                 color = uintBitsToFloat(val + 1u) + 1.0;
1235bf215546Sopenharmony_ci         }
1236bf215546Sopenharmony_ci         """,
1237bf215546Sopenharmony_ci         r'expression float bitcast_u2f \(expression uint'),
1238bf215546Sopenharmony_ci    Test("bitfieldReverse",
1239bf215546Sopenharmony_ci         """
1240bf215546Sopenharmony_ci         #version 310 es
1241bf215546Sopenharmony_ci         precision mediump float;
1242bf215546Sopenharmony_ci         precision mediump int;
1243bf215546Sopenharmony_ci
1244bf215546Sopenharmony_ci         uniform int val;
1245bf215546Sopenharmony_ci         out int color;
1246bf215546Sopenharmony_ci
1247bf215546Sopenharmony_ci         void main()
1248bf215546Sopenharmony_ci         {
1249bf215546Sopenharmony_ci                 color = bitfieldReverse(val + 1) + 1;
1250bf215546Sopenharmony_ci         }
1251bf215546Sopenharmony_ci         """,
1252bf215546Sopenharmony_ci         r'expression int bitfield_reverse \(expression int'),
1253bf215546Sopenharmony_ci    Test("frexp",
1254bf215546Sopenharmony_ci         """
1255bf215546Sopenharmony_ci         #version 310 es
1256bf215546Sopenharmony_ci         precision mediump float;
1257bf215546Sopenharmony_ci         precision mediump int;
1258bf215546Sopenharmony_ci
1259bf215546Sopenharmony_ci         uniform float val;
1260bf215546Sopenharmony_ci         out float color;
1261bf215546Sopenharmony_ci         out int color2;
1262bf215546Sopenharmony_ci
1263bf215546Sopenharmony_ci         void main()
1264bf215546Sopenharmony_ci         {
1265bf215546Sopenharmony_ci                 int y;
1266bf215546Sopenharmony_ci                 float x = frexp(val + 1.0, y);
1267bf215546Sopenharmony_ci                 color = x + 1.0;
1268bf215546Sopenharmony_ci                 color2 = y + 1;
1269bf215546Sopenharmony_ci         }
1270bf215546Sopenharmony_ci         """,
1271bf215546Sopenharmony_ci         r'assign  \(x\) \(var_ref x@2\)  \(expression float f162f'),
1272bf215546Sopenharmony_ci    Test("ldexp",
1273bf215546Sopenharmony_ci         """
1274bf215546Sopenharmony_ci         #version 310 es
1275bf215546Sopenharmony_ci         precision mediump float;
1276bf215546Sopenharmony_ci         precision mediump int;
1277bf215546Sopenharmony_ci
1278bf215546Sopenharmony_ci         uniform float val;
1279bf215546Sopenharmony_ci         uniform int exp;
1280bf215546Sopenharmony_ci         out float color;
1281bf215546Sopenharmony_ci
1282bf215546Sopenharmony_ci         void main()
1283bf215546Sopenharmony_ci         {
1284bf215546Sopenharmony_ci                 color = ldexp(val + 1.0, exp + 1) + 1.0;
1285bf215546Sopenharmony_ci         }
1286bf215546Sopenharmony_ci         """,
1287bf215546Sopenharmony_ci         r'expression float ldexp \(expression float'),
1288bf215546Sopenharmony_ci    Test("uaddCarry",
1289bf215546Sopenharmony_ci         """
1290bf215546Sopenharmony_ci         #version 310 es
1291bf215546Sopenharmony_ci         precision mediump float;
1292bf215546Sopenharmony_ci         precision mediump int;
1293bf215546Sopenharmony_ci
1294bf215546Sopenharmony_ci         uniform uint x, y;
1295bf215546Sopenharmony_ci         out uint color;
1296bf215546Sopenharmony_ci
1297bf215546Sopenharmony_ci         void main()
1298bf215546Sopenharmony_ci         {
1299bf215546Sopenharmony_ci                 lowp uint carry;
1300bf215546Sopenharmony_ci                 color = uaddCarry(x * 2u, y * 2u, carry) * 2u;
1301bf215546Sopenharmony_ci                 color *= carry;
1302bf215546Sopenharmony_ci         }
1303bf215546Sopenharmony_ci         """,
1304bf215546Sopenharmony_ci         r'expression uint \+ \(var_ref x\) \(var_ref y'),
1305bf215546Sopenharmony_ci    Test("usubBorrow",
1306bf215546Sopenharmony_ci         """
1307bf215546Sopenharmony_ci         #version 310 es
1308bf215546Sopenharmony_ci         precision mediump float;
1309bf215546Sopenharmony_ci         precision mediump int;
1310bf215546Sopenharmony_ci
1311bf215546Sopenharmony_ci         uniform uint x, y;
1312bf215546Sopenharmony_ci         out uint color;
1313bf215546Sopenharmony_ci
1314bf215546Sopenharmony_ci         void main()
1315bf215546Sopenharmony_ci         {
1316bf215546Sopenharmony_ci                 lowp uint borrow;
1317bf215546Sopenharmony_ci                 color = usubBorrow(x * 2u, y * 2u, borrow) * 2u;
1318bf215546Sopenharmony_ci                 color *= borrow;
1319bf215546Sopenharmony_ci         }
1320bf215546Sopenharmony_ci         """,
1321bf215546Sopenharmony_ci         r'expression uint \+ \(var_ref x\) \(expression uint neg'),
1322bf215546Sopenharmony_ci    Test("imulExtended",
1323bf215546Sopenharmony_ci         """
1324bf215546Sopenharmony_ci         #version 310 es
1325bf215546Sopenharmony_ci         precision mediump float;
1326bf215546Sopenharmony_ci         precision mediump int;
1327bf215546Sopenharmony_ci
1328bf215546Sopenharmony_ci         uniform int x, y;
1329bf215546Sopenharmony_ci         out int color;
1330bf215546Sopenharmony_ci
1331bf215546Sopenharmony_ci         void main()
1332bf215546Sopenharmony_ci         {
1333bf215546Sopenharmony_ci                 int msb, lsb;
1334bf215546Sopenharmony_ci                 imulExtended(x + 2, y + 2, msb, lsb);
1335bf215546Sopenharmony_ci                 color = msb + lsb;
1336bf215546Sopenharmony_ci         }
1337bf215546Sopenharmony_ci         """,
1338bf215546Sopenharmony_ci         r'expression int64_t \* \(expression int'),
1339bf215546Sopenharmony_ci    Test("umulExtended",
1340bf215546Sopenharmony_ci         """
1341bf215546Sopenharmony_ci         #version 310 es
1342bf215546Sopenharmony_ci         precision mediump float;
1343bf215546Sopenharmony_ci         precision mediump int;
1344bf215546Sopenharmony_ci
1345bf215546Sopenharmony_ci         uniform uint x, y;
1346bf215546Sopenharmony_ci         out uint color;
1347bf215546Sopenharmony_ci
1348bf215546Sopenharmony_ci         void main()
1349bf215546Sopenharmony_ci         {
1350bf215546Sopenharmony_ci                 uint msb, lsb;
1351bf215546Sopenharmony_ci                 umulExtended(x + 2u, y + 2u, msb, lsb);
1352bf215546Sopenharmony_ci                 color = msb + lsb;
1353bf215546Sopenharmony_ci         }
1354bf215546Sopenharmony_ci         """,
1355bf215546Sopenharmony_ci         r'expression uint64_t \* \(expression uint'),
1356bf215546Sopenharmony_ci    Test("unpackUnorm2x16",
1357bf215546Sopenharmony_ci         """
1358bf215546Sopenharmony_ci         #version 310 es
1359bf215546Sopenharmony_ci         precision mediump float;
1360bf215546Sopenharmony_ci         precision mediump int;
1361bf215546Sopenharmony_ci
1362bf215546Sopenharmony_ci         uniform uint val;
1363bf215546Sopenharmony_ci         out vec2 color;
1364bf215546Sopenharmony_ci
1365bf215546Sopenharmony_ci         void main()
1366bf215546Sopenharmony_ci         {
1367bf215546Sopenharmony_ci                 color = unpackUnorm2x16(val + 1u) + vec2(1.0);
1368bf215546Sopenharmony_ci         }
1369bf215546Sopenharmony_ci         """,
1370bf215546Sopenharmony_ci         r'expression vec2 unpackUnorm2x16 \(expression uint'),
1371bf215546Sopenharmony_ci    Test("unpackSnorm2x16",
1372bf215546Sopenharmony_ci         """
1373bf215546Sopenharmony_ci         #version 310 es
1374bf215546Sopenharmony_ci         precision mediump float;
1375bf215546Sopenharmony_ci         precision mediump int;
1376bf215546Sopenharmony_ci
1377bf215546Sopenharmony_ci         uniform uint val;
1378bf215546Sopenharmony_ci         out vec2 color;
1379bf215546Sopenharmony_ci
1380bf215546Sopenharmony_ci         void main()
1381bf215546Sopenharmony_ci         {
1382bf215546Sopenharmony_ci                 color = unpackSnorm2x16(val + 1u) + vec2(1.0);
1383bf215546Sopenharmony_ci         }
1384bf215546Sopenharmony_ci         """,
1385bf215546Sopenharmony_ci         r'expression vec2 unpackSnorm2x16 \(expression uint'),
1386bf215546Sopenharmony_ci    Test("packUnorm2x16",
1387bf215546Sopenharmony_ci         """
1388bf215546Sopenharmony_ci         #version 310 es
1389bf215546Sopenharmony_ci         precision mediump float;
1390bf215546Sopenharmony_ci         precision mediump int;
1391bf215546Sopenharmony_ci
1392bf215546Sopenharmony_ci         uniform vec2 val;
1393bf215546Sopenharmony_ci         out uint color;
1394bf215546Sopenharmony_ci
1395bf215546Sopenharmony_ci         void main()
1396bf215546Sopenharmony_ci         {
1397bf215546Sopenharmony_ci                 color = packUnorm2x16(val + vec2(1.0)) + 1u;
1398bf215546Sopenharmony_ci         }
1399bf215546Sopenharmony_ci         """,
1400bf215546Sopenharmony_ci         r'expression uint packUnorm2x16 \(expression vec2'),
1401bf215546Sopenharmony_ci    Test("packSnorm2x16",
1402bf215546Sopenharmony_ci         """
1403bf215546Sopenharmony_ci         #version 310 es
1404bf215546Sopenharmony_ci         precision mediump float;
1405bf215546Sopenharmony_ci         precision mediump int;
1406bf215546Sopenharmony_ci
1407bf215546Sopenharmony_ci         uniform vec2 val;
1408bf215546Sopenharmony_ci         out uint color;
1409bf215546Sopenharmony_ci
1410bf215546Sopenharmony_ci         void main()
1411bf215546Sopenharmony_ci         {
1412bf215546Sopenharmony_ci                 color = packSnorm2x16(val + vec2(1.0)) + 1u;
1413bf215546Sopenharmony_ci         }
1414bf215546Sopenharmony_ci         """,
1415bf215546Sopenharmony_ci         r'expression uint packSnorm2x16 \(expression vec2'),
1416bf215546Sopenharmony_ci    Test("packHalf2x16",
1417bf215546Sopenharmony_ci         """
1418bf215546Sopenharmony_ci         #version 310 es
1419bf215546Sopenharmony_ci         precision mediump float;
1420bf215546Sopenharmony_ci         precision mediump int;
1421bf215546Sopenharmony_ci
1422bf215546Sopenharmony_ci         uniform vec2 val;
1423bf215546Sopenharmony_ci         out uint color;
1424bf215546Sopenharmony_ci
1425bf215546Sopenharmony_ci         void main()
1426bf215546Sopenharmony_ci         {
1427bf215546Sopenharmony_ci                 color = packHalf2x16(val + vec2(1.0)) + 1u;
1428bf215546Sopenharmony_ci         }
1429bf215546Sopenharmony_ci         """,
1430bf215546Sopenharmony_ci         r'expression uint packHalf2x16 \(expression vec2'),
1431bf215546Sopenharmony_ci    Test("packUnorm4x8",
1432bf215546Sopenharmony_ci         """
1433bf215546Sopenharmony_ci         #version 310 es
1434bf215546Sopenharmony_ci         precision mediump float;
1435bf215546Sopenharmony_ci         precision mediump int;
1436bf215546Sopenharmony_ci
1437bf215546Sopenharmony_ci         uniform vec4 val;
1438bf215546Sopenharmony_ci         out uint color;
1439bf215546Sopenharmony_ci
1440bf215546Sopenharmony_ci         void main()
1441bf215546Sopenharmony_ci         {
1442bf215546Sopenharmony_ci                 color = packUnorm4x8(val + vec4(1.0)) + 1u;
1443bf215546Sopenharmony_ci         }
1444bf215546Sopenharmony_ci         """,
1445bf215546Sopenharmony_ci         r'expression uint packUnorm4x8 \(expression vec4'),
1446bf215546Sopenharmony_ci    Test("packSnorm4x8",
1447bf215546Sopenharmony_ci         """
1448bf215546Sopenharmony_ci         #version 310 es
1449bf215546Sopenharmony_ci         precision mediump float;
1450bf215546Sopenharmony_ci         precision mediump int;
1451bf215546Sopenharmony_ci
1452bf215546Sopenharmony_ci         uniform vec4 val;
1453bf215546Sopenharmony_ci         out uint color;
1454bf215546Sopenharmony_ci
1455bf215546Sopenharmony_ci         void main()
1456bf215546Sopenharmony_ci         {
1457bf215546Sopenharmony_ci                 color = packSnorm4x8(val + vec4(1.0)) + 1u;
1458bf215546Sopenharmony_ci         }
1459bf215546Sopenharmony_ci         """,
1460bf215546Sopenharmony_ci         r'expression uint packSnorm4x8 \(expression vec4'),
1461bf215546Sopenharmony_ci    Test("interpolateAtCentroid",
1462bf215546Sopenharmony_ci         """
1463bf215546Sopenharmony_ci         #version 320 es
1464bf215546Sopenharmony_ci         precision mediump float;
1465bf215546Sopenharmony_ci         precision mediump int;
1466bf215546Sopenharmony_ci
1467bf215546Sopenharmony_ci         in float val;
1468bf215546Sopenharmony_ci         out float color;
1469bf215546Sopenharmony_ci
1470bf215546Sopenharmony_ci         void main()
1471bf215546Sopenharmony_ci         {
1472bf215546Sopenharmony_ci                 color = interpolateAtCentroid(val) + 1.0;
1473bf215546Sopenharmony_ci         }
1474bf215546Sopenharmony_ci         """,
1475bf215546Sopenharmony_ci         r'expression float16_t interpolate_at_centroid \(expression float16_t'),
1476bf215546Sopenharmony_ci    Test("interpolateAtOffset",
1477bf215546Sopenharmony_ci         """
1478bf215546Sopenharmony_ci         #version 320 es
1479bf215546Sopenharmony_ci         precision mediump float;
1480bf215546Sopenharmony_ci         precision mediump int;
1481bf215546Sopenharmony_ci
1482bf215546Sopenharmony_ci         uniform highp vec2 offset;
1483bf215546Sopenharmony_ci         in float val;
1484bf215546Sopenharmony_ci         out float color;
1485bf215546Sopenharmony_ci
1486bf215546Sopenharmony_ci         void main()
1487bf215546Sopenharmony_ci         {
1488bf215546Sopenharmony_ci                 color = interpolateAtOffset(val, offset) + 1.0;
1489bf215546Sopenharmony_ci         }
1490bf215546Sopenharmony_ci         """,
1491bf215546Sopenharmony_ci         r'expression float16_t interpolate_at_offset \(expression float16_t'),
1492bf215546Sopenharmony_ci    Test("interpolateAtSample",
1493bf215546Sopenharmony_ci         """
1494bf215546Sopenharmony_ci         #version 320 es
1495bf215546Sopenharmony_ci         precision mediump float;
1496bf215546Sopenharmony_ci         precision mediump int;
1497bf215546Sopenharmony_ci
1498bf215546Sopenharmony_ci         uniform highp int sample_index;
1499bf215546Sopenharmony_ci         in float val;
1500bf215546Sopenharmony_ci         out float color;
1501bf215546Sopenharmony_ci
1502bf215546Sopenharmony_ci         void main()
1503bf215546Sopenharmony_ci         {
1504bf215546Sopenharmony_ci                 color = interpolateAtSample(val, sample_index) + 1.0;
1505bf215546Sopenharmony_ci         }
1506bf215546Sopenharmony_ci         """,
1507bf215546Sopenharmony_ci         r'expression float16_t interpolate_at_sample \(expression float16_t'),
1508bf215546Sopenharmony_ci    Test("bitfieldExtract",
1509bf215546Sopenharmony_ci         """
1510bf215546Sopenharmony_ci         #version 310 es
1511bf215546Sopenharmony_ci         precision mediump float;
1512bf215546Sopenharmony_ci         precision mediump int;
1513bf215546Sopenharmony_ci
1514bf215546Sopenharmony_ci         uniform highp int offset, bits;
1515bf215546Sopenharmony_ci         uniform int val;
1516bf215546Sopenharmony_ci         out int color;
1517bf215546Sopenharmony_ci
1518bf215546Sopenharmony_ci         void main()
1519bf215546Sopenharmony_ci         {
1520bf215546Sopenharmony_ci                 color = bitfieldExtract(val, offset, bits) + 1;
1521bf215546Sopenharmony_ci         }
1522bf215546Sopenharmony_ci         """,
1523bf215546Sopenharmony_ci         r'expression int16_t bitfield_extract \(expression int16_t'),
1524bf215546Sopenharmony_ci    Test("bitfieldInsert",
1525bf215546Sopenharmony_ci         """
1526bf215546Sopenharmony_ci         #version 310 es
1527bf215546Sopenharmony_ci         precision mediump float;
1528bf215546Sopenharmony_ci         precision mediump int;
1529bf215546Sopenharmony_ci
1530bf215546Sopenharmony_ci         uniform highp int offset, bits;
1531bf215546Sopenharmony_ci         uniform int val, val2;
1532bf215546Sopenharmony_ci         out int color;
1533bf215546Sopenharmony_ci
1534bf215546Sopenharmony_ci         void main()
1535bf215546Sopenharmony_ci         {
1536bf215546Sopenharmony_ci                 color = bitfieldInsert(val, val2, offset, bits) + 1;
1537bf215546Sopenharmony_ci         }
1538bf215546Sopenharmony_ci         """,
1539bf215546Sopenharmony_ci         r'expression int16_t bitfield_insert \(expression int16_t'),
1540bf215546Sopenharmony_ci    Test("bitCount",
1541bf215546Sopenharmony_ci         """
1542bf215546Sopenharmony_ci         #version 310 es
1543bf215546Sopenharmony_ci         precision mediump float;
1544bf215546Sopenharmony_ci         precision mediump int;
1545bf215546Sopenharmony_ci
1546bf215546Sopenharmony_ci         uniform highp int val;
1547bf215546Sopenharmony_ci         out int color;
1548bf215546Sopenharmony_ci
1549bf215546Sopenharmony_ci         void main()
1550bf215546Sopenharmony_ci         {
1551bf215546Sopenharmony_ci                 color = bitCount(val) + 1;
1552bf215546Sopenharmony_ci         }
1553bf215546Sopenharmony_ci         """,
1554bf215546Sopenharmony_ci         r'expression int16_t \+ \(expression int16_t i2imp \(expression int bit_count \(var_ref val'),
1555bf215546Sopenharmony_ci    Test("findLSB",
1556bf215546Sopenharmony_ci         """
1557bf215546Sopenharmony_ci         #version 310 es
1558bf215546Sopenharmony_ci         precision mediump float;
1559bf215546Sopenharmony_ci         precision mediump int;
1560bf215546Sopenharmony_ci
1561bf215546Sopenharmony_ci         uniform highp int val;
1562bf215546Sopenharmony_ci         out int color;
1563bf215546Sopenharmony_ci
1564bf215546Sopenharmony_ci         void main()
1565bf215546Sopenharmony_ci         {
1566bf215546Sopenharmony_ci                 color = findLSB(val) + 1;
1567bf215546Sopenharmony_ci         }
1568bf215546Sopenharmony_ci         """,
1569bf215546Sopenharmony_ci         r'expression int16_t \+ \(expression int16_t i2imp \(expression int find_lsb \(var_ref val'),
1570bf215546Sopenharmony_ci    Test("findMSB",
1571bf215546Sopenharmony_ci         """
1572bf215546Sopenharmony_ci         #version 310 es
1573bf215546Sopenharmony_ci         precision mediump float;
1574bf215546Sopenharmony_ci         precision mediump int;
1575bf215546Sopenharmony_ci
1576bf215546Sopenharmony_ci         uniform highp int val;
1577bf215546Sopenharmony_ci         out int color;
1578bf215546Sopenharmony_ci
1579bf215546Sopenharmony_ci         void main()
1580bf215546Sopenharmony_ci         {
1581bf215546Sopenharmony_ci                 color = findMSB(val) + 1;
1582bf215546Sopenharmony_ci         }
1583bf215546Sopenharmony_ci         """,
1584bf215546Sopenharmony_ci         r'expression int16_t \+ \(expression int16_t i2imp \(expression int find_msb \(var_ref val'),
1585bf215546Sopenharmony_ci    Test("unpackHalf2x16",
1586bf215546Sopenharmony_ci         """
1587bf215546Sopenharmony_ci         #version 310 es
1588bf215546Sopenharmony_ci         precision mediump float;
1589bf215546Sopenharmony_ci         precision mediump int;
1590bf215546Sopenharmony_ci
1591bf215546Sopenharmony_ci         uniform highp uint val;
1592bf215546Sopenharmony_ci         out vec2 color;
1593bf215546Sopenharmony_ci
1594bf215546Sopenharmony_ci         void main()
1595bf215546Sopenharmony_ci         {
1596bf215546Sopenharmony_ci                 color = unpackHalf2x16(val) + vec2(1.0);
1597bf215546Sopenharmony_ci         }
1598bf215546Sopenharmony_ci         """,
1599bf215546Sopenharmony_ci         r'expression f16vec2 \+ \(expression f16vec2 f2fmp \(expression vec2 unpackHalf2x16 \(var_ref val'),
1600bf215546Sopenharmony_ci    Test("unpackUnorm4x8",
1601bf215546Sopenharmony_ci         """
1602bf215546Sopenharmony_ci         #version 310 es
1603bf215546Sopenharmony_ci         precision mediump float;
1604bf215546Sopenharmony_ci         precision mediump int;
1605bf215546Sopenharmony_ci
1606bf215546Sopenharmony_ci         uniform highp uint val;
1607bf215546Sopenharmony_ci         out vec4 color;
1608bf215546Sopenharmony_ci
1609bf215546Sopenharmony_ci         void main()
1610bf215546Sopenharmony_ci         {
1611bf215546Sopenharmony_ci                 color = unpackUnorm4x8(val) + vec4(1.0);
1612bf215546Sopenharmony_ci         }
1613bf215546Sopenharmony_ci         """,
1614bf215546Sopenharmony_ci         r'expression f16vec4 \+ \(expression f16vec4 f2fmp \(expression vec4 unpackUnorm4x8 \(var_ref val'),
1615bf215546Sopenharmony_ci    Test("unpackSnorm4x8",
1616bf215546Sopenharmony_ci         """
1617bf215546Sopenharmony_ci         #version 310 es
1618bf215546Sopenharmony_ci         precision mediump float;
1619bf215546Sopenharmony_ci         precision mediump int;
1620bf215546Sopenharmony_ci
1621bf215546Sopenharmony_ci         uniform highp uint val;
1622bf215546Sopenharmony_ci         out vec4 color;
1623bf215546Sopenharmony_ci
1624bf215546Sopenharmony_ci         void main()
1625bf215546Sopenharmony_ci         {
1626bf215546Sopenharmony_ci                 color = unpackSnorm4x8(val) + vec4(1.0);
1627bf215546Sopenharmony_ci         }
1628bf215546Sopenharmony_ci         """,
1629bf215546Sopenharmony_ci         r'expression f16vec4 \+ \(expression f16vec4 f2fmp \(expression vec4 unpackSnorm4x8 \(var_ref val'),
1630bf215546Sopenharmony_ci    Test("f32 csel",
1631bf215546Sopenharmony_ci         """
1632bf215546Sopenharmony_ci         #version 300 es
1633bf215546Sopenharmony_ci         precision mediump float;
1634bf215546Sopenharmony_ci
1635bf215546Sopenharmony_ci         in vec4 var;
1636bf215546Sopenharmony_ci         out vec4 color;
1637bf215546Sopenharmony_ci
1638bf215546Sopenharmony_ci         void main()
1639bf215546Sopenharmony_ci         {
1640bf215546Sopenharmony_ci                 color = (var.x > var.y) ? var : vec4(10.0);
1641bf215546Sopenharmony_ci         }
1642bf215546Sopenharmony_ci         """,
1643bf215546Sopenharmony_ci         r'\(constant +f16vec4 \(10'),
1644bf215546Sopenharmony_ci    Test("i32 csel",
1645bf215546Sopenharmony_ci         """
1646bf215546Sopenharmony_ci         #version 310 es
1647bf215546Sopenharmony_ci         precision mediump int;
1648bf215546Sopenharmony_ci
1649bf215546Sopenharmony_ci         in flat ivec4 var;
1650bf215546Sopenharmony_ci         out ivec4 color;
1651bf215546Sopenharmony_ci
1652bf215546Sopenharmony_ci         void main()
1653bf215546Sopenharmony_ci         {
1654bf215546Sopenharmony_ci                 color = (var.x > var.y) ? var : ivec4(10);
1655bf215546Sopenharmony_ci         }
1656bf215546Sopenharmony_ci         """,
1657bf215546Sopenharmony_ci         r'\(constant +i16vec4 \(10'),
1658bf215546Sopenharmony_ci    Test("u32 csel",
1659bf215546Sopenharmony_ci         """
1660bf215546Sopenharmony_ci         #version 310 es
1661bf215546Sopenharmony_ci         precision mediump int;
1662bf215546Sopenharmony_ci
1663bf215546Sopenharmony_ci         in flat uvec4 var;
1664bf215546Sopenharmony_ci         out uvec4 color;
1665bf215546Sopenharmony_ci
1666bf215546Sopenharmony_ci         void main()
1667bf215546Sopenharmony_ci         {
1668bf215546Sopenharmony_ci                 color = (var.x > var.y) ? var : uvec4(10);
1669bf215546Sopenharmony_ci         }
1670bf215546Sopenharmony_ci         """,
1671bf215546Sopenharmony_ci         r'\(constant +u16vec4 \(10'),
1672bf215546Sopenharmony_ci    Test("f32 loop counter",
1673bf215546Sopenharmony_ci         """
1674bf215546Sopenharmony_ci         #version 300 es
1675bf215546Sopenharmony_ci         precision mediump float;
1676bf215546Sopenharmony_ci
1677bf215546Sopenharmony_ci         uniform float n, incr;
1678bf215546Sopenharmony_ci         out float color;
1679bf215546Sopenharmony_ci
1680bf215546Sopenharmony_ci         void main()
1681bf215546Sopenharmony_ci         {
1682bf215546Sopenharmony_ci                 color = 0.0;
1683bf215546Sopenharmony_ci                 for (float x = 0.0; x < n; x += incr)
1684bf215546Sopenharmony_ci                    color += x;
1685bf215546Sopenharmony_ci         }
1686bf215546Sopenharmony_ci         """,
1687bf215546Sopenharmony_ci         r'\(assign  \(x\) \(var_ref x\)  \(expression float16_t \+ \(var_ref x\) \(var_ref incr'),
1688bf215546Sopenharmony_ci    Test("i32 loop counter",
1689bf215546Sopenharmony_ci         """
1690bf215546Sopenharmony_ci         #version 310 es
1691bf215546Sopenharmony_ci         precision mediump float;
1692bf215546Sopenharmony_ci         precision mediump int;
1693bf215546Sopenharmony_ci
1694bf215546Sopenharmony_ci         uniform int n, incr;
1695bf215546Sopenharmony_ci         out int color;
1696bf215546Sopenharmony_ci
1697bf215546Sopenharmony_ci         void main()
1698bf215546Sopenharmony_ci         {
1699bf215546Sopenharmony_ci                 color = 0;
1700bf215546Sopenharmony_ci                 for (int x = 0; x < n; x += incr)
1701bf215546Sopenharmony_ci                    color += x;
1702bf215546Sopenharmony_ci         }
1703bf215546Sopenharmony_ci         """,
1704bf215546Sopenharmony_ci         r'\(assign  \(x\) \(var_ref x\)  \(expression int16_t \+ \(var_ref x\) \(expression int16_t i2imp \(var_ref incr'),
1705bf215546Sopenharmony_ci    Test("u32 loop counter",
1706bf215546Sopenharmony_ci         """
1707bf215546Sopenharmony_ci         #version 310 es
1708bf215546Sopenharmony_ci         precision mediump float;
1709bf215546Sopenharmony_ci         precision mediump int;
1710bf215546Sopenharmony_ci
1711bf215546Sopenharmony_ci         uniform uint n, incr;
1712bf215546Sopenharmony_ci         out uint color;
1713bf215546Sopenharmony_ci
1714bf215546Sopenharmony_ci         void main()
1715bf215546Sopenharmony_ci         {
1716bf215546Sopenharmony_ci                 color = 0u;
1717bf215546Sopenharmony_ci                 for (uint x = 0u; x < n; x += incr)
1718bf215546Sopenharmony_ci                    color += x;
1719bf215546Sopenharmony_ci         }
1720bf215546Sopenharmony_ci         """,
1721bf215546Sopenharmony_ci         r'\(assign  \(x\) \(var_ref x\)  \(expression uint16_t \+ \(var_ref x\) \(expression uint16_t u2ump \(var_ref incr'),
1722bf215546Sopenharmony_ci    Test("f32 temp array",
1723bf215546Sopenharmony_ci         """
1724bf215546Sopenharmony_ci         #version 300 es
1725bf215546Sopenharmony_ci         precision mediump float;
1726bf215546Sopenharmony_ci
1727bf215546Sopenharmony_ci         uniform float x,y;
1728bf215546Sopenharmony_ci         out float color;
1729bf215546Sopenharmony_ci
1730bf215546Sopenharmony_ci         void main()
1731bf215546Sopenharmony_ci         {
1732bf215546Sopenharmony_ci                 float a[2] = float[2](x, y);
1733bf215546Sopenharmony_ci                 if (x > 0.0)
1734bf215546Sopenharmony_ci                     a[1] = 3.0;
1735bf215546Sopenharmony_ci                 color = a[0] + a[1];
1736bf215546Sopenharmony_ci         }
1737bf215546Sopenharmony_ci         """,
1738bf215546Sopenharmony_ci         r'\(constant float16_t \(3'),
1739bf215546Sopenharmony_ci    Test("i32 temp array",
1740bf215546Sopenharmony_ci         """
1741bf215546Sopenharmony_ci         #version 310 es
1742bf215546Sopenharmony_ci         precision mediump int;
1743bf215546Sopenharmony_ci
1744bf215546Sopenharmony_ci         uniform int x,y;
1745bf215546Sopenharmony_ci         out int color;
1746bf215546Sopenharmony_ci
1747bf215546Sopenharmony_ci         void main()
1748bf215546Sopenharmony_ci         {
1749bf215546Sopenharmony_ci                 int a[2] = int[2](x, y);
1750bf215546Sopenharmony_ci                 if (x > 0)
1751bf215546Sopenharmony_ci                     a[1] = 3;
1752bf215546Sopenharmony_ci                 color = a[0] + a[1];
1753bf215546Sopenharmony_ci         }
1754bf215546Sopenharmony_ci         """,
1755bf215546Sopenharmony_ci         r'\(constant int16_t \(3'),
1756bf215546Sopenharmony_ci    Test("u32 temp array",
1757bf215546Sopenharmony_ci         """
1758bf215546Sopenharmony_ci         #version 310 es
1759bf215546Sopenharmony_ci         precision mediump int;
1760bf215546Sopenharmony_ci
1761bf215546Sopenharmony_ci         uniform uint x,y;
1762bf215546Sopenharmony_ci         out uint color;
1763bf215546Sopenharmony_ci
1764bf215546Sopenharmony_ci         void main()
1765bf215546Sopenharmony_ci         {
1766bf215546Sopenharmony_ci                 uint a[2] = uint[2](x, y);
1767bf215546Sopenharmony_ci                 if (x > 0u)
1768bf215546Sopenharmony_ci                     a[1] = 3u;
1769bf215546Sopenharmony_ci                 color = a[0] + a[1];
1770bf215546Sopenharmony_ci         }
1771bf215546Sopenharmony_ci         """,
1772bf215546Sopenharmony_ci         r'\(constant uint16_t \(3'),
1773bf215546Sopenharmony_ci    Test("f32 temp array of array",
1774bf215546Sopenharmony_ci         """
1775bf215546Sopenharmony_ci         #version 310 es
1776bf215546Sopenharmony_ci         precision mediump float;
1777bf215546Sopenharmony_ci
1778bf215546Sopenharmony_ci         uniform float x,y;
1779bf215546Sopenharmony_ci         out float color;
1780bf215546Sopenharmony_ci
1781bf215546Sopenharmony_ci         void main()
1782bf215546Sopenharmony_ci         {
1783bf215546Sopenharmony_ci                 float a[2][2] = float[2][2](float[2](x, y), float[2](x, y));
1784bf215546Sopenharmony_ci                 if (x > 0.0)
1785bf215546Sopenharmony_ci                     a[1][1] = 3.0;
1786bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1787bf215546Sopenharmony_ci         }
1788bf215546Sopenharmony_ci         """,
1789bf215546Sopenharmony_ci         r'\(constant float16_t \(3'),
1790bf215546Sopenharmony_ci    Test("i32 temp array of array",
1791bf215546Sopenharmony_ci         """
1792bf215546Sopenharmony_ci         #version 310 es
1793bf215546Sopenharmony_ci         precision mediump int;
1794bf215546Sopenharmony_ci
1795bf215546Sopenharmony_ci         uniform int x,y;
1796bf215546Sopenharmony_ci         out int color;
1797bf215546Sopenharmony_ci
1798bf215546Sopenharmony_ci         void main()
1799bf215546Sopenharmony_ci         {
1800bf215546Sopenharmony_ci                 int a[2][2] = int[2][2](int[2](x, y), int[2](x, y));
1801bf215546Sopenharmony_ci                 if (x > 0)
1802bf215546Sopenharmony_ci                     a[1][1] = 3;
1803bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1804bf215546Sopenharmony_ci         }
1805bf215546Sopenharmony_ci         """,
1806bf215546Sopenharmony_ci         r'\(constant int16_t \(3'),
1807bf215546Sopenharmony_ci    Test("u32 temp array of array",
1808bf215546Sopenharmony_ci         """
1809bf215546Sopenharmony_ci         #version 310 es
1810bf215546Sopenharmony_ci         precision mediump int;
1811bf215546Sopenharmony_ci
1812bf215546Sopenharmony_ci         uniform uint x,y;
1813bf215546Sopenharmony_ci         out uint color;
1814bf215546Sopenharmony_ci
1815bf215546Sopenharmony_ci         void main()
1816bf215546Sopenharmony_ci         {
1817bf215546Sopenharmony_ci                 uint a[2][2] = uint[2][2](uint[2](x, y), uint[2](x, y));
1818bf215546Sopenharmony_ci                 if (x > 0u)
1819bf215546Sopenharmony_ci                     a[1][1] = 3u;
1820bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1821bf215546Sopenharmony_ci         }
1822bf215546Sopenharmony_ci         """,
1823bf215546Sopenharmony_ci         r'\(constant uint16_t \(3'),
1824bf215546Sopenharmony_ci    Test("f32 temp array of array assigned from highp",
1825bf215546Sopenharmony_ci         """
1826bf215546Sopenharmony_ci         #version 310 es
1827bf215546Sopenharmony_ci         precision mediump float;
1828bf215546Sopenharmony_ci
1829bf215546Sopenharmony_ci         uniform float x,y;
1830bf215546Sopenharmony_ci         out float color;
1831bf215546Sopenharmony_ci
1832bf215546Sopenharmony_ci         void main()
1833bf215546Sopenharmony_ci         {
1834bf215546Sopenharmony_ci                 highp float b[2][2] = float[2][2](float[2](x, y), float[2](x, y));
1835bf215546Sopenharmony_ci                 float a[2][2];
1836bf215546Sopenharmony_ci                 a = b;
1837bf215546Sopenharmony_ci                 if (x > 0.0)
1838bf215546Sopenharmony_ci                     a[1][1] = 3.0;
1839bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1840bf215546Sopenharmony_ci         }
1841bf215546Sopenharmony_ci         """,
1842bf215546Sopenharmony_ci         r'\(constant float16_t \(3'),
1843bf215546Sopenharmony_ci    Test("i32 temp array of array assigned from highp",
1844bf215546Sopenharmony_ci         """
1845bf215546Sopenharmony_ci         #version 310 es
1846bf215546Sopenharmony_ci         precision mediump int;
1847bf215546Sopenharmony_ci
1848bf215546Sopenharmony_ci         uniform int x,y;
1849bf215546Sopenharmony_ci         out int color;
1850bf215546Sopenharmony_ci
1851bf215546Sopenharmony_ci         void main()
1852bf215546Sopenharmony_ci         {
1853bf215546Sopenharmony_ci                 highp int b[2][2] = int[2][2](int[2](x, y), int[2](x, y));
1854bf215546Sopenharmony_ci                 int a[2][2];
1855bf215546Sopenharmony_ci                 a = b;
1856bf215546Sopenharmony_ci                 if (x > 0)
1857bf215546Sopenharmony_ci                     a[1][1] = 3;
1858bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1859bf215546Sopenharmony_ci         }
1860bf215546Sopenharmony_ci         """,
1861bf215546Sopenharmony_ci         r'\(constant int16_t \(3'),
1862bf215546Sopenharmony_ci    Test("u32 temp array of array assigned from highp",
1863bf215546Sopenharmony_ci         """
1864bf215546Sopenharmony_ci         #version 310 es
1865bf215546Sopenharmony_ci         precision mediump int;
1866bf215546Sopenharmony_ci
1867bf215546Sopenharmony_ci         uniform uint x,y;
1868bf215546Sopenharmony_ci         out uint color;
1869bf215546Sopenharmony_ci
1870bf215546Sopenharmony_ci         void main()
1871bf215546Sopenharmony_ci         {
1872bf215546Sopenharmony_ci                 highp uint b[2][2] = uint[2][2](uint[2](x, y), uint[2](x, y));
1873bf215546Sopenharmony_ci                 uint a[2][2];
1874bf215546Sopenharmony_ci                 a = b;
1875bf215546Sopenharmony_ci                 if (x > 0u)
1876bf215546Sopenharmony_ci                     a[1][1] = 3u;
1877bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1878bf215546Sopenharmony_ci         }
1879bf215546Sopenharmony_ci         """,
1880bf215546Sopenharmony_ci         r'\(constant uint16_t \(3'),
1881bf215546Sopenharmony_ci    Test("f32 temp array of array assigned to highp",
1882bf215546Sopenharmony_ci         """
1883bf215546Sopenharmony_ci         #version 310 es
1884bf215546Sopenharmony_ci         precision mediump float;
1885bf215546Sopenharmony_ci
1886bf215546Sopenharmony_ci         uniform float x,y;
1887bf215546Sopenharmony_ci         out float color;
1888bf215546Sopenharmony_ci
1889bf215546Sopenharmony_ci         void main()
1890bf215546Sopenharmony_ci         {
1891bf215546Sopenharmony_ci                 float a[2][2] = float[2][2](float[2](x, y), float[2](x, y));
1892bf215546Sopenharmony_ci                 highp float b[2][2];
1893bf215546Sopenharmony_ci                 b = a;
1894bf215546Sopenharmony_ci                 a = b;
1895bf215546Sopenharmony_ci                 if (x > 0.0)
1896bf215546Sopenharmony_ci                     a[1][1] = 3.0;
1897bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1898bf215546Sopenharmony_ci         }
1899bf215546Sopenharmony_ci         """,
1900bf215546Sopenharmony_ci         r'\(constant float16_t \(3'),
1901bf215546Sopenharmony_ci    Test("i32 temp array of array assigned to highp",
1902bf215546Sopenharmony_ci         """
1903bf215546Sopenharmony_ci         #version 310 es
1904bf215546Sopenharmony_ci         precision mediump int;
1905bf215546Sopenharmony_ci
1906bf215546Sopenharmony_ci         uniform int x,y;
1907bf215546Sopenharmony_ci         out int color;
1908bf215546Sopenharmony_ci
1909bf215546Sopenharmony_ci         void main()
1910bf215546Sopenharmony_ci         {
1911bf215546Sopenharmony_ci                 int a[2][2] = int[2][2](int[2](x, y), int[2](x, y));
1912bf215546Sopenharmony_ci                 highp int b[2][2];
1913bf215546Sopenharmony_ci                 b = a;
1914bf215546Sopenharmony_ci                 a = b;
1915bf215546Sopenharmony_ci                 if (x > 0)
1916bf215546Sopenharmony_ci                     a[1][1] = 3;
1917bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1918bf215546Sopenharmony_ci         }
1919bf215546Sopenharmony_ci         """,
1920bf215546Sopenharmony_ci         r'\(constant int16_t \(3'),
1921bf215546Sopenharmony_ci    Test("u32 temp array of array assigned to highp",
1922bf215546Sopenharmony_ci         """
1923bf215546Sopenharmony_ci         #version 310 es
1924bf215546Sopenharmony_ci         precision mediump int;
1925bf215546Sopenharmony_ci
1926bf215546Sopenharmony_ci         uniform uint x,y;
1927bf215546Sopenharmony_ci         out uint color;
1928bf215546Sopenharmony_ci
1929bf215546Sopenharmony_ci         void main()
1930bf215546Sopenharmony_ci         {
1931bf215546Sopenharmony_ci                 uint a[2][2] = uint[2][2](uint[2](x, y), uint[2](x, y));
1932bf215546Sopenharmony_ci                 highp uint b[2][2];
1933bf215546Sopenharmony_ci                 b = a;
1934bf215546Sopenharmony_ci                 a = b;
1935bf215546Sopenharmony_ci                 if (x > 0u)
1936bf215546Sopenharmony_ci                     a[1][1] = 3u;
1937bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1938bf215546Sopenharmony_ci         }
1939bf215546Sopenharmony_ci         """,
1940bf215546Sopenharmony_ci         r'\(constant uint16_t \(3'),
1941bf215546Sopenharmony_ci    Test("f32 temp array of array returned by function",
1942bf215546Sopenharmony_ci         """
1943bf215546Sopenharmony_ci         #version 310 es
1944bf215546Sopenharmony_ci         precision mediump float;
1945bf215546Sopenharmony_ci
1946bf215546Sopenharmony_ci         uniform float x,y;
1947bf215546Sopenharmony_ci         out float color;
1948bf215546Sopenharmony_ci
1949bf215546Sopenharmony_ci         float[2][2] f(void)
1950bf215546Sopenharmony_ci         {
1951bf215546Sopenharmony_ci            return float[2][2](float[2](x, y), float[2](x, y));
1952bf215546Sopenharmony_ci         }
1953bf215546Sopenharmony_ci
1954bf215546Sopenharmony_ci         void main()
1955bf215546Sopenharmony_ci         {
1956bf215546Sopenharmony_ci                 float a[2][2] = f();
1957bf215546Sopenharmony_ci                 if (x > 0.0)
1958bf215546Sopenharmony_ci                     a[1][1] = 3.0;
1959bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1960bf215546Sopenharmony_ci         }
1961bf215546Sopenharmony_ci         """,
1962bf215546Sopenharmony_ci         r'\(constant float16_t \(3'),
1963bf215546Sopenharmony_ci    Test("i32 temp array of array returned by function",
1964bf215546Sopenharmony_ci         """
1965bf215546Sopenharmony_ci         #version 310 es
1966bf215546Sopenharmony_ci         precision mediump int;
1967bf215546Sopenharmony_ci
1968bf215546Sopenharmony_ci         uniform int x,y;
1969bf215546Sopenharmony_ci         out int color;
1970bf215546Sopenharmony_ci
1971bf215546Sopenharmony_ci         int[2][2] f(void)
1972bf215546Sopenharmony_ci         {
1973bf215546Sopenharmony_ci            return int[2][2](int[2](x, y), int[2](x, y));
1974bf215546Sopenharmony_ci         }
1975bf215546Sopenharmony_ci
1976bf215546Sopenharmony_ci         void main()
1977bf215546Sopenharmony_ci         {
1978bf215546Sopenharmony_ci                 int a[2][2] = f();
1979bf215546Sopenharmony_ci                 if (x > 0)
1980bf215546Sopenharmony_ci                     a[1][1] = 3;
1981bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
1982bf215546Sopenharmony_ci         }
1983bf215546Sopenharmony_ci         """,
1984bf215546Sopenharmony_ci         r'\(constant int16_t \(3'),
1985bf215546Sopenharmony_ci    Test("u32 temp array of array returned by function",
1986bf215546Sopenharmony_ci         """
1987bf215546Sopenharmony_ci         #version 310 es
1988bf215546Sopenharmony_ci         precision mediump int;
1989bf215546Sopenharmony_ci
1990bf215546Sopenharmony_ci         uniform uint x,y;
1991bf215546Sopenharmony_ci         out uint color;
1992bf215546Sopenharmony_ci
1993bf215546Sopenharmony_ci         uint[2][2] f(void)
1994bf215546Sopenharmony_ci         {
1995bf215546Sopenharmony_ci            return uint[2][2](uint[2](x, y), uint[2](x, y));
1996bf215546Sopenharmony_ci         }
1997bf215546Sopenharmony_ci
1998bf215546Sopenharmony_ci         void main()
1999bf215546Sopenharmony_ci         {
2000bf215546Sopenharmony_ci                 uint a[2][2] = f();
2001bf215546Sopenharmony_ci                 if (x > 0u)
2002bf215546Sopenharmony_ci                     a[1][1] = 3u;
2003bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2004bf215546Sopenharmony_ci         }
2005bf215546Sopenharmony_ci         """,
2006bf215546Sopenharmony_ci         r'\(constant uint16_t \(3'),
2007bf215546Sopenharmony_ci    Test("f32 temp array of array as function out",
2008bf215546Sopenharmony_ci         """
2009bf215546Sopenharmony_ci         #version 310 es
2010bf215546Sopenharmony_ci         precision mediump float;
2011bf215546Sopenharmony_ci
2012bf215546Sopenharmony_ci         uniform float x,y;
2013bf215546Sopenharmony_ci         out float color;
2014bf215546Sopenharmony_ci
2015bf215546Sopenharmony_ci         void f(out float[2][2] v)
2016bf215546Sopenharmony_ci         {
2017bf215546Sopenharmony_ci            v = float[2][2](float[2](x, y), float[2](x, y));
2018bf215546Sopenharmony_ci         }
2019bf215546Sopenharmony_ci
2020bf215546Sopenharmony_ci         void main()
2021bf215546Sopenharmony_ci         {
2022bf215546Sopenharmony_ci                 float a[2][2];
2023bf215546Sopenharmony_ci                 f(a);
2024bf215546Sopenharmony_ci                 if (x > 0.0)
2025bf215546Sopenharmony_ci                     a[1][1] = 3.0;
2026bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2027bf215546Sopenharmony_ci         }
2028bf215546Sopenharmony_ci         """,
2029bf215546Sopenharmony_ci         r'\(constant float16_t \(3'),
2030bf215546Sopenharmony_ci    Test("i32 temp array of array as function out",
2031bf215546Sopenharmony_ci         """
2032bf215546Sopenharmony_ci         #version 310 es
2033bf215546Sopenharmony_ci         precision mediump int;
2034bf215546Sopenharmony_ci
2035bf215546Sopenharmony_ci         uniform int x,y;
2036bf215546Sopenharmony_ci         out int color;
2037bf215546Sopenharmony_ci
2038bf215546Sopenharmony_ci         void f(out int[2][2] v)
2039bf215546Sopenharmony_ci         {
2040bf215546Sopenharmony_ci            v = int[2][2](int[2](x, y), int[2](x, y));
2041bf215546Sopenharmony_ci         }
2042bf215546Sopenharmony_ci
2043bf215546Sopenharmony_ci         void main()
2044bf215546Sopenharmony_ci         {
2045bf215546Sopenharmony_ci                 int a[2][2];
2046bf215546Sopenharmony_ci                 f(a);
2047bf215546Sopenharmony_ci                 if (x > 0)
2048bf215546Sopenharmony_ci                     a[1][1] = 3;
2049bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2050bf215546Sopenharmony_ci         }
2051bf215546Sopenharmony_ci         """,
2052bf215546Sopenharmony_ci         r'\(constant int16_t \(3'),
2053bf215546Sopenharmony_ci    Test("u32 temp array of array as function out",
2054bf215546Sopenharmony_ci         """
2055bf215546Sopenharmony_ci         #version 310 es
2056bf215546Sopenharmony_ci         precision mediump int;
2057bf215546Sopenharmony_ci
2058bf215546Sopenharmony_ci         uniform uint x,y;
2059bf215546Sopenharmony_ci         out uint color;
2060bf215546Sopenharmony_ci
2061bf215546Sopenharmony_ci         void f(out uint[2][2] v)
2062bf215546Sopenharmony_ci         {
2063bf215546Sopenharmony_ci            v = uint[2][2](uint[2](x, y), uint[2](x, y));
2064bf215546Sopenharmony_ci         }
2065bf215546Sopenharmony_ci
2066bf215546Sopenharmony_ci         void main()
2067bf215546Sopenharmony_ci         {
2068bf215546Sopenharmony_ci                 uint a[2][2];
2069bf215546Sopenharmony_ci                 f(a);
2070bf215546Sopenharmony_ci                 if (x > 0u)
2071bf215546Sopenharmony_ci                     a[1][1] = 3u;
2072bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2073bf215546Sopenharmony_ci         }
2074bf215546Sopenharmony_ci         """,
2075bf215546Sopenharmony_ci         r'\(constant uint16_t \(3'),
2076bf215546Sopenharmony_ci    Test("f32 temp array of array as function in",
2077bf215546Sopenharmony_ci         """
2078bf215546Sopenharmony_ci         #version 310 es
2079bf215546Sopenharmony_ci         precision mediump float;
2080bf215546Sopenharmony_ci
2081bf215546Sopenharmony_ci         uniform float x,y;
2082bf215546Sopenharmony_ci         out float color;
2083bf215546Sopenharmony_ci
2084bf215546Sopenharmony_ci         float[2][2] f(in float[2][2] v)
2085bf215546Sopenharmony_ci         {
2086bf215546Sopenharmony_ci            float t[2][2] = v;
2087bf215546Sopenharmony_ci            return t;
2088bf215546Sopenharmony_ci         }
2089bf215546Sopenharmony_ci
2090bf215546Sopenharmony_ci         void main()
2091bf215546Sopenharmony_ci         {
2092bf215546Sopenharmony_ci                 float a[2][2];
2093bf215546Sopenharmony_ci                 a = f(a);
2094bf215546Sopenharmony_ci                 if (x > 0.0)
2095bf215546Sopenharmony_ci                     a[1][1] = 3.0;
2096bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2097bf215546Sopenharmony_ci         }
2098bf215546Sopenharmony_ci         """,
2099bf215546Sopenharmony_ci         r'\(constant float16_t \(3'),
2100bf215546Sopenharmony_ci    Test("i32 temp array of array as function in",
2101bf215546Sopenharmony_ci         """
2102bf215546Sopenharmony_ci         #version 310 es
2103bf215546Sopenharmony_ci         precision mediump int;
2104bf215546Sopenharmony_ci
2105bf215546Sopenharmony_ci         uniform int x,y;
2106bf215546Sopenharmony_ci         out int color;
2107bf215546Sopenharmony_ci
2108bf215546Sopenharmony_ci         int[2][2] f(in int[2][2] v)
2109bf215546Sopenharmony_ci         {
2110bf215546Sopenharmony_ci            int t[2][2] = v;
2111bf215546Sopenharmony_ci            return t;
2112bf215546Sopenharmony_ci         }
2113bf215546Sopenharmony_ci
2114bf215546Sopenharmony_ci         void main()
2115bf215546Sopenharmony_ci         {
2116bf215546Sopenharmony_ci                 int a[2][2];
2117bf215546Sopenharmony_ci                 a = f(a);
2118bf215546Sopenharmony_ci                 if (x > 0)
2119bf215546Sopenharmony_ci                     a[1][1] = 3;
2120bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2121bf215546Sopenharmony_ci         }
2122bf215546Sopenharmony_ci         """,
2123bf215546Sopenharmony_ci         r'\(constant int16_t \(3'),
2124bf215546Sopenharmony_ci    Test("u32 temp array of array as function in",
2125bf215546Sopenharmony_ci         """
2126bf215546Sopenharmony_ci         #version 310 es
2127bf215546Sopenharmony_ci         precision mediump int;
2128bf215546Sopenharmony_ci
2129bf215546Sopenharmony_ci         uniform uint x,y;
2130bf215546Sopenharmony_ci         out uint color;
2131bf215546Sopenharmony_ci
2132bf215546Sopenharmony_ci         uint[2][2] f(in uint[2][2] v)
2133bf215546Sopenharmony_ci         {
2134bf215546Sopenharmony_ci            uint t[2][2] = v;
2135bf215546Sopenharmony_ci            return t;
2136bf215546Sopenharmony_ci         }
2137bf215546Sopenharmony_ci
2138bf215546Sopenharmony_ci         void main()
2139bf215546Sopenharmony_ci         {
2140bf215546Sopenharmony_ci                 uint a[2][2];
2141bf215546Sopenharmony_ci                 a = f(a);
2142bf215546Sopenharmony_ci                 if (x > 0u)
2143bf215546Sopenharmony_ci                     a[1][1] = 3u;
2144bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2145bf215546Sopenharmony_ci         }
2146bf215546Sopenharmony_ci         """,
2147bf215546Sopenharmony_ci         r'\(constant uint16_t \(3'),
2148bf215546Sopenharmony_ci    Test("f32 temp array of array as function inout",
2149bf215546Sopenharmony_ci         """
2150bf215546Sopenharmony_ci         #version 310 es
2151bf215546Sopenharmony_ci         precision mediump float;
2152bf215546Sopenharmony_ci
2153bf215546Sopenharmony_ci         uniform float x,y;
2154bf215546Sopenharmony_ci         out float color;
2155bf215546Sopenharmony_ci
2156bf215546Sopenharmony_ci         void f(inout float[2][2] v)
2157bf215546Sopenharmony_ci         {
2158bf215546Sopenharmony_ci            float t[2][2] = v;
2159bf215546Sopenharmony_ci            v = t;
2160bf215546Sopenharmony_ci         }
2161bf215546Sopenharmony_ci
2162bf215546Sopenharmony_ci         void main()
2163bf215546Sopenharmony_ci         {
2164bf215546Sopenharmony_ci                 float a[2][2];
2165bf215546Sopenharmony_ci                 f(a);
2166bf215546Sopenharmony_ci                 if (x > 0.0)
2167bf215546Sopenharmony_ci                     a[1][1] = 3.0;
2168bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2169bf215546Sopenharmony_ci         }
2170bf215546Sopenharmony_ci         """,
2171bf215546Sopenharmony_ci         r'\(constant float16_t \(3'),
2172bf215546Sopenharmony_ci    Test("i32 temp array of array as function inout",
2173bf215546Sopenharmony_ci         """
2174bf215546Sopenharmony_ci         #version 310 es
2175bf215546Sopenharmony_ci         precision mediump int;
2176bf215546Sopenharmony_ci
2177bf215546Sopenharmony_ci         uniform int x,y;
2178bf215546Sopenharmony_ci         out int color;
2179bf215546Sopenharmony_ci
2180bf215546Sopenharmony_ci         void f(inout int[2][2] v)
2181bf215546Sopenharmony_ci         {
2182bf215546Sopenharmony_ci            int t[2][2] = v;
2183bf215546Sopenharmony_ci            v = t;
2184bf215546Sopenharmony_ci         }
2185bf215546Sopenharmony_ci
2186bf215546Sopenharmony_ci         void main()
2187bf215546Sopenharmony_ci         {
2188bf215546Sopenharmony_ci                 int a[2][2];
2189bf215546Sopenharmony_ci                 f(a);
2190bf215546Sopenharmony_ci                 if (x > 0)
2191bf215546Sopenharmony_ci                     a[1][1] = 3;
2192bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2193bf215546Sopenharmony_ci         }
2194bf215546Sopenharmony_ci         """,
2195bf215546Sopenharmony_ci         r'\(constant int16_t \(3'),
2196bf215546Sopenharmony_ci    Test("u32 temp array of array as function inout",
2197bf215546Sopenharmony_ci         """
2198bf215546Sopenharmony_ci         #version 310 es
2199bf215546Sopenharmony_ci         precision mediump int;
2200bf215546Sopenharmony_ci
2201bf215546Sopenharmony_ci         uniform uint x,y;
2202bf215546Sopenharmony_ci         out uint color;
2203bf215546Sopenharmony_ci
2204bf215546Sopenharmony_ci         void f(inout uint[2][2] v)
2205bf215546Sopenharmony_ci         {
2206bf215546Sopenharmony_ci            uint t[2][2] = v;
2207bf215546Sopenharmony_ci            v = t;
2208bf215546Sopenharmony_ci         }
2209bf215546Sopenharmony_ci
2210bf215546Sopenharmony_ci         void main()
2211bf215546Sopenharmony_ci         {
2212bf215546Sopenharmony_ci                 uint a[2][2];
2213bf215546Sopenharmony_ci                 f(a);
2214bf215546Sopenharmony_ci                 if (x > 0u)
2215bf215546Sopenharmony_ci                     a[1][1] = 3u;
2216bf215546Sopenharmony_ci                 color = a[0][0] + a[1][1];
2217bf215546Sopenharmony_ci         }
2218bf215546Sopenharmony_ci         """,
2219bf215546Sopenharmony_ci         r'\(constant uint16_t \(3'),
2220bf215546Sopenharmony_ci    Test("f32 temp struct (not lowered in the presence of control flow - TODO)",
2221bf215546Sopenharmony_ci         """
2222bf215546Sopenharmony_ci         #version 300 es
2223bf215546Sopenharmony_ci         precision mediump float;
2224bf215546Sopenharmony_ci
2225bf215546Sopenharmony_ci         uniform float x,y;
2226bf215546Sopenharmony_ci         out float color;
2227bf215546Sopenharmony_ci
2228bf215546Sopenharmony_ci         void main()
2229bf215546Sopenharmony_ci         {
2230bf215546Sopenharmony_ci                 struct { float x,y; } s;
2231bf215546Sopenharmony_ci                 s.x = x;
2232bf215546Sopenharmony_ci                 s.y = y;
2233bf215546Sopenharmony_ci                 if (x > 0.0)
2234bf215546Sopenharmony_ci                     s.y = 3.0;
2235bf215546Sopenharmony_ci                 color = s.x + s.y;
2236bf215546Sopenharmony_ci         }
2237bf215546Sopenharmony_ci         """,
2238bf215546Sopenharmony_ci         r'\(constant float \(3'), # should be float16_t
2239bf215546Sopenharmony_ci    Test("i32 temp struct (not lowered in the presence of control flow - TODO)",
2240bf215546Sopenharmony_ci         """
2241bf215546Sopenharmony_ci         #version 300 es
2242bf215546Sopenharmony_ci         precision mediump int;
2243bf215546Sopenharmony_ci
2244bf215546Sopenharmony_ci         uniform int x,y;
2245bf215546Sopenharmony_ci         out int color;
2246bf215546Sopenharmony_ci
2247bf215546Sopenharmony_ci         void main()
2248bf215546Sopenharmony_ci         {
2249bf215546Sopenharmony_ci                 struct { int x,y; } s;
2250bf215546Sopenharmony_ci                 s.x = x;
2251bf215546Sopenharmony_ci                 s.y = y;
2252bf215546Sopenharmony_ci                 if (x > 0)
2253bf215546Sopenharmony_ci                     s.y = 3;
2254bf215546Sopenharmony_ci                 color = s.x + s.y;
2255bf215546Sopenharmony_ci         }
2256bf215546Sopenharmony_ci         """,
2257bf215546Sopenharmony_ci         r'\(constant int \(3'), # should be int16_t
2258bf215546Sopenharmony_ci    Test("u32 temp struct (not lowered in the presence of control flow - TODO)",
2259bf215546Sopenharmony_ci         """
2260bf215546Sopenharmony_ci         #version 300 es
2261bf215546Sopenharmony_ci         precision mediump int;
2262bf215546Sopenharmony_ci
2263bf215546Sopenharmony_ci         uniform uint x,y;
2264bf215546Sopenharmony_ci         out uint color;
2265bf215546Sopenharmony_ci
2266bf215546Sopenharmony_ci         void main()
2267bf215546Sopenharmony_ci         {
2268bf215546Sopenharmony_ci                 struct { uint x,y; } s;
2269bf215546Sopenharmony_ci                 s.x = x;
2270bf215546Sopenharmony_ci                 s.y = y;
2271bf215546Sopenharmony_ci                 if (x > 0u)
2272bf215546Sopenharmony_ci                     s.y = 3u;
2273bf215546Sopenharmony_ci                 color = s.x + s.y;
2274bf215546Sopenharmony_ci         }
2275bf215546Sopenharmony_ci         """,
2276bf215546Sopenharmony_ci         r'\(constant uint \(3'), # should be uint16_t
2277bf215546Sopenharmony_ci]
2278bf215546Sopenharmony_ci
2279bf215546Sopenharmony_ci
2280bf215546Sopenharmony_cidef compile_shader(standalone_compiler, source):
2281bf215546Sopenharmony_ci    with tempfile.NamedTemporaryFile(mode='wt', suffix='.frag') as source_file:
2282bf215546Sopenharmony_ci        print(source, file=source_file)
2283bf215546Sopenharmony_ci        source_file.flush()
2284bf215546Sopenharmony_ci        return subprocess.check_output([standalone_compiler,
2285bf215546Sopenharmony_ci                                        '--version', '300',
2286bf215546Sopenharmony_ci                                        '--lower-precision',
2287bf215546Sopenharmony_ci                                        '--dump-lir',
2288bf215546Sopenharmony_ci                                        source_file.name],
2289bf215546Sopenharmony_ci                                       universal_newlines=True)
2290bf215546Sopenharmony_ci
2291bf215546Sopenharmony_ci
2292bf215546Sopenharmony_cidef run_test(standalone_compiler, test):
2293bf215546Sopenharmony_ci    ir = compile_shader(standalone_compiler, test.source)
2294bf215546Sopenharmony_ci
2295bf215546Sopenharmony_ci    if re.search(test.match_re, ir) is None:
2296bf215546Sopenharmony_ci        print(ir)
2297bf215546Sopenharmony_ci        return False
2298bf215546Sopenharmony_ci
2299bf215546Sopenharmony_ci    return True
2300bf215546Sopenharmony_ci
2301bf215546Sopenharmony_ci
2302bf215546Sopenharmony_cidef main():
2303bf215546Sopenharmony_ci    standalone_compiler = sys.argv[1]
2304bf215546Sopenharmony_ci    passed = 0
2305bf215546Sopenharmony_ci
2306bf215546Sopenharmony_ci    for test in TESTS:
2307bf215546Sopenharmony_ci        print('Testing {} ... '.format(test.name), end='')
2308bf215546Sopenharmony_ci
2309bf215546Sopenharmony_ci        result = run_test(standalone_compiler, test)
2310bf215546Sopenharmony_ci
2311bf215546Sopenharmony_ci        if result:
2312bf215546Sopenharmony_ci            print('PASS')
2313bf215546Sopenharmony_ci            passed += 1
2314bf215546Sopenharmony_ci        else:
2315bf215546Sopenharmony_ci            print('FAIL')
2316bf215546Sopenharmony_ci
2317bf215546Sopenharmony_ci    print('{}/{} tests returned correct results'.format(passed, len(TESTS)))
2318bf215546Sopenharmony_ci    sys.exit(0 if passed == len(TESTS) else 1)
2319bf215546Sopenharmony_ci
2320bf215546Sopenharmony_ci
2321bf215546Sopenharmony_ciif __name__ == '__main__':
2322bf215546Sopenharmony_ci    main()
2323