xref: /aosp_15_r20/external/deqp/data/gles3/shaders/functions.test (revision 35238bce31c2a825756842865a792f8cf7f89930)
1# Tests todo:
2# - inout with varyings, attributes, uniforms (and arrays of 'em)
3# - inout with arrays, array elements
4# - inout with array elements
5# - inout by-value semantics (arrays & elements & structs)
6
7# Done:
8# - control flow: return, return in loop, etc.
9
10group datatypes "Function Parameter Data Types"
11
12    case float_float
13        version 300 es
14        values
15        {
16            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
17            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
18        }
19
20        both ""
21            #version 300 es
22            precision mediump float;
23            ${DECLARATIONS}
24
25            float func (float a)
26            {
27                return -a;
28            }
29
30            void main()
31            {
32                out0 = func(in0);
33                ${OUTPUT}
34            }
35        ""
36    end
37
38    case float_vec2
39        version 300 es
40        values
41        {
42            input vec2 in0 = [ vec2(0.0, 1.0) | vec2(2.0, 2.5) ];
43            output float out0 = [ -1.0 | -4.5 ];
44        }
45
46        both ""
47            #version 300 es
48            precision mediump float;
49            ${DECLARATIONS}
50
51            float func (vec2 a)
52            {
53                return -(a.x + a.y);
54            }
55
56            void main()
57            {
58                out0 = func(in0);
59                ${OUTPUT}
60            }
61        ""
62    end
63
64    case float_vec3
65        version 300 es
66        values
67        {
68            input vec3 in0 = [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
69            output float out0 = [ 1.0 | -0.5 ];
70        }
71
72        both ""
73            #version 300 es
74            precision mediump float;
75            ${DECLARATIONS}
76
77            float func (vec3 a)
78            {
79                return -(a.x + a.y + a.z);
80            }
81
82            void main()
83            {
84                out0 = func(in0);
85                ${OUTPUT}
86            }
87        ""
88    end
89
90    case float_vec4
91        version 300 es
92        values
93        {
94            input vec4 in0 = [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
95            output float out0 = [ 0.5 | -1.5 ];
96        }
97
98        both ""
99            #version 300 es
100            precision mediump float;
101            ${DECLARATIONS}
102
103            float func (vec4 a)
104            {
105                return -(a.x + a.y + a.z + a.w);
106            }
107
108            void main()
109            {
110                out0 = func(in0);
111                ${OUTPUT}
112            }
113        ""
114    end
115
116    case float_mat2
117        version 300 es
118        values
119        {
120            input mat2 in0 = [ mat2(0.0, 1.0, -2.0, 0.5) | mat2(2.0, 2.5, 4.0, -7.0) ];
121            output float out0 = [ 0.5 | -1.5 ];
122        }
123
124        both ""
125            #version 300 es
126            precision mediump float;
127            ${DECLARATIONS}
128
129            float func (mat2 a)
130            {
131                return -(a[0][0] + a[0][1] + a[1][0] + a[1][1]);
132            }
133
134            void main()
135            {
136                out0 = func(in0);
137                ${OUTPUT}
138            }
139        ""
140    end
141
142    case float_mat3
143        version 300 es
144        values
145        {
146            input mat3 in0 = [ mat3(0.0, 1.0, -2.0, 0.5, 1.0, -1.0, 2.0, 4.0, -1.0) | mat3(2.0, 2.5, 4.0, -7.0, 2.5, 3.0, 0.5, -3.5, 1.0) ];
147            output float out0 = [ -4.5 | -5.0 ];
148        }
149
150        both ""
151            #version 300 es
152            precision mediump float;
153            ${DECLARATIONS}
154
155            float func (mat3 a)
156            {
157                return -(a[0][0] + a[0][1] + a[0][2] + a[1][0] + a[1][1] + a[1][2] + a[2][0] + a[2][1] + a[2][2]);
158            }
159
160            void main()
161            {
162                out0 = func(in0);
163                ${OUTPUT}
164            }
165        ""
166    end
167
168    case float_mat4
169        version 300 es
170        values
171        {
172            input mat4 in0 = [ mat4(0.0, 1.0, -2.0, 0.5, 1.0, -1.0, 2.0, 4.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -2.0, -2.0) | mat4(2.0, 2.5, 4.0, -7.0, 2.5, 3.0, 0.5, -3.5, 1.0, 0.0, 2.0, -1.0, 1.0, 0.0, -1.0, 3.0) ];
173            output float out0 = [ -5.5 | -9.0 ];
174        }
175
176        both ""
177            #version 300 es
178            precision mediump float;
179            ${DECLARATIONS}
180
181            float func (mat4 a)
182            {
183                return -(a[0][0] + a[0][1] + a[0][2] + a[0][3] + a[1][0] + a[1][1] + a[1][2] + a[1][3] + a[2][0] + a[2][1] + a[2][2] + a[2][3] + a[3][0] + a[3][1] + a[3][2] + a[3][3]);
184            }
185
186            void main()
187            {
188                out0 = func(in0);
189                ${OUTPUT}
190            }
191        ""
192    end
193
194    case int_int
195        version 300 es
196        values
197        {
198            input int in0 = [ -1 | 0 | 1 | 4 ];
199            output int out0 = [ 1 | 0 | -1 | -4 ];
200        }
201
202        both ""
203            #version 300 es
204            precision mediump float;
205            precision mediump int;
206            ${DECLARATIONS}
207
208            int func (int a)
209            {
210                return -a;
211            }
212
213            void main()
214            {
215                ${SETUP}
216                out0 = func(in0);
217                ${OUTPUT}
218            }
219        ""
220    end
221
222    case int_ivec2
223        version 300 es
224        values
225        {
226            input ivec2 in0 = [ ivec2(-1, 0) | ivec2(1, 4) ];
227            output int out0 = [ 1 | -5 ];
228        }
229
230        both ""
231            #version 300 es
232            precision mediump float;
233            precision mediump int;
234            ${DECLARATIONS}
235
236            int func (ivec2 a)
237            {
238                return -(a.x + a.y);
239            }
240
241            void main()
242            {
243                ${SETUP}
244                out0 = func(in0);
245                ${OUTPUT}
246            }
247        ""
248    end
249
250    case int_ivec3
251        version 300 es
252        values
253        {
254            input ivec3 in0 = [ ivec3(-1, 0, 2) | ivec3(1, 4, -8) ];
255            output int out0 = [ -1 | 3 ];
256        }
257
258        both ""
259            #version 300 es
260            precision mediump float;
261            precision mediump int;
262            ${DECLARATIONS}
263
264            int func (ivec3 a)
265            {
266                return -(a.x + a.y + a.z);
267            }
268
269            void main()
270            {
271                ${SETUP}
272                out0 = func(in0);
273                ${OUTPUT}
274            }
275        ""
276    end
277
278    case int_ivec4
279        version 300 es
280        values
281        {
282            input ivec4 in0 = [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
283            output int out0 = [ -3 | 1 ];
284        }
285
286        both ""
287            #version 300 es
288            precision mediump float;
289            precision mediump int;
290            ${DECLARATIONS}
291
292            int func (ivec4 a)
293            {
294                return -(a.x + a.y + a.z + a.w);
295            }
296
297            void main()
298            {
299                ${SETUP}
300                out0 = func(in0);
301                ${OUTPUT}
302            }
303        ""
304    end
305
306    case uint_uint
307        version 300 es
308        values
309        {
310            input uint in0 = [ 1 | 0 | 2 | 4 ];
311            output uint out0 = [ 1 | 0 | 4 | 16 ];
312        }
313
314        both ""
315            #version 300 es
316            precision mediump float;
317            precision mediump int;
318            ${DECLARATIONS}
319
320            uint func (uint a)
321            {
322                return a*a;
323            }
324
325            void main()
326            {
327                ${SETUP}
328                out0 = func(in0);
329                ${OUTPUT}
330            }
331        ""
332    end
333
334    case uint_uvec2
335        version 300 es
336        values
337        {
338            input uvec2 in0 = [ uvec2(1, 0) | uvec2(2, 4) ];
339            output uint out0 = [ 1 | 6 ];
340        }
341
342        both ""
343            #version 300 es
344            precision mediump float;
345            precision mediump int;
346            ${DECLARATIONS}
347
348            uint func (uvec2 a)
349            {
350                return (a.x + a.y);
351            }
352
353            void main()
354            {
355                ${SETUP}
356                out0 = func(in0);
357                ${OUTPUT}
358            }
359        ""
360    end
361
362    case uint_uvec3
363        version 300 es
364        values
365        {
366            input uvec3 in0 = [ uvec3(1, 0, 2) | uvec3(1, 4, 8) ];
367            output uint out0 = [ 3 | 13 ];
368        }
369
370        both ""
371            #version 300 es
372            precision mediump float;
373            precision mediump int;
374            ${DECLARATIONS}
375
376            uint func (uvec3 a)
377            {
378                return (a.x + a.y + a.z);
379            }
380
381            void main()
382            {
383                ${SETUP}
384                out0 = func(in0);
385                ${OUTPUT}
386            }
387        ""
388    end
389
390    case uint_uvec4
391        version 300 es
392        values
393        {
394            input uvec4 in0 = [ uvec4(1, 0, 2, 2) | uvec4(1, 4, 8, 2) ];
395            output uint out0 = [ 5 | 15 ];
396        }
397
398        both ""
399            #version 300 es
400            precision mediump float;
401            precision mediump int;
402            ${DECLARATIONS}
403
404            uint func (uvec4 a)
405            {
406                return (a.x + a.y + a.z + a.w);
407            }
408
409            void main()
410            {
411                ${SETUP}
412                out0 = func(in0);
413                ${OUTPUT}
414            }
415        ""
416    end
417
418    case bool_bool
419        version 300 es
420        values
421        {
422            input bool in0 = [ true | false ];
423            output bool out0 = [ false | true ];
424        }
425
426        both ""
427            #version 300 es
428            precision mediump float;
429            ${DECLARATIONS}
430
431            bool func (bool a)
432            {
433                return !a;
434            }
435
436            void main()
437            {
438                ${SETUP}
439                out0 = func(in0);
440                ${OUTPUT}
441            }
442        ""
443    end
444
445    case bool_bvec2
446        version 300 es
447        values
448        {
449            input bvec2 in0 = [ bvec2(true, true) | bvec2(false, true) ];
450            output bool out0 = [ false | true ];
451        }
452
453        both ""
454            #version 300 es
455            precision mediump float;
456            ${DECLARATIONS}
457
458            bool func (bvec2 a)
459            {
460                return !(a.x == a.y);
461            }
462
463            void main()
464            {
465                ${SETUP}
466                out0 = func(in0);
467                ${OUTPUT}
468            }
469        ""
470    end
471
472    case bool_bvec3
473        version 300 es
474        values
475        {
476            input bvec3 in0 = [ bvec3(true, true, false) | bvec3(true, false, false) ];
477            output bool out0 = [ false | true ];
478        }
479
480        both ""
481            #version 300 es
482            precision mediump float;
483            ${DECLARATIONS}
484
485            bool func (bvec3 a)
486            {
487                return (a.x == a.y) == a.z;
488            }
489
490            void main()
491            {
492                ${SETUP}
493                out0 = func(in0);
494                ${OUTPUT}
495            }
496        ""
497    end
498
499    case bool_bvec4
500        version 300 es
501        values
502        {
503            input bvec4 in0 = [ bvec4(true, true, true, false) | bvec4(false, false, true, true) | bvec4(true, false, false, true) ];
504            output bool out0 = [ false | true | true ];
505        }
506
507        both ""
508            #version 300 es
509            precision mediump float;
510            ${DECLARATIONS}
511
512            bool func (bvec4 a)
513            {
514                return ((a.x == a.y) == (a.z == a.w));
515            }
516
517            void main()
518            {
519                ${SETUP}
520                out0 = func(in0);
521                ${OUTPUT}
522            }
523        ""
524    end
525
526    case mat2
527        version 300 es
528        values
529        {
530            input mat2 in0 = [ mat2(-2.0, 0.5, -1.0, 1.0) | mat2(1.0, -3.5, -3.5, 2.5) | mat2(-2.0, -2.0, 3.5, 0.0) ];
531            output mat2 out0 = [ mat2(4.0, -1.0, 2.0, -2.0) | mat2(-2.0, 7.0, 7.0, -5.0) | mat2(4.0, 4.0, -7.0, -0.0) ];
532        }
533
534        both ""
535            #version 300 es
536            precision mediump float;
537            ${DECLARATIONS}
538
539            mat2 func (mat2 a)
540            {
541                return -2.0*a;
542            }
543
544            void main()
545            {
546                ${SETUP}
547                out0 = func(in0);
548                ${OUTPUT}
549            }
550        ""
551    end
552
553
554    case mat2x3
555        version 300 es
556        values
557        {
558            input mat2x3 in0 = [ mat2x3(2.5, 0.0, 1.0, -2.5, 1.0, 3.0) | mat2x3(0.0, 2.0, 1.5, -3.5, 2.0, 0.5) | mat2x3(-1.5, -3.5, 2.5, 0.0, 1.5, 3.0) ];
559            output mat2x3 out0 = [ mat2x3(-5.0, -0.0, -2.0, 5.0, -2.0, -6.0) | mat2x3(-0.0, -4.0, -3.0, 7.0, -4.0, -1.0) | mat2x3(3.0, 7.0, -5.0, -0.0, -3.0, -6.0) ];
560        }
561
562        both ""
563            #version 300 es
564            precision mediump float;
565            ${DECLARATIONS}
566
567            mat2x3 func (mat2x3 a)
568            {
569                return -2.0*a;
570            }
571
572            void main()
573            {
574                ${SETUP}
575                out0 = func(in0);
576                ${OUTPUT}
577            }
578        ""
579    end
580
581
582    case mat2x4
583        version 300 es
584        values
585        {
586            input mat2x4 in0 = [ mat2x4(1.5, 3.0, -1.0, 2.5, -0.5, 3.5, 3.0, -3.0) | mat2x4(-2.5, -2.0, 3.5, -0.5, 1.0, -1.5, 0.0, -1.0) | mat2x4(-1.0, 0.5, 0.5, 3.0, 1.5, 3.0, 2.5, 3.5) ];
587            output mat2x4 out0 = [ mat2x4(-3.0, -6.0, 2.0, -5.0, 1.0, -7.0, -6.0, 6.0) | mat2x4(5.0, 4.0, -7.0, 1.0, -2.0, 3.0, -0.0, 2.0) | mat2x4(2.0, -1.0, -1.0, -6.0, -3.0, -6.0, -5.0, -7.0) ];
588        }
589
590        both ""
591            #version 300 es
592            precision mediump float;
593            ${DECLARATIONS}
594
595            mat2x4 func (mat2x4 a)
596            {
597                return -2.0*a;
598            }
599
600            void main()
601            {
602                ${SETUP}
603                out0 = func(in0);
604                ${OUTPUT}
605            }
606        ""
607    end
608
609
610    case mat3x2
611        version 300 es
612        values
613        {
614            input mat3x2 in0 = [ mat3x2(1.5, -2.5, 2.5, 3.5, 3.0, 0.5) | mat3x2(1.5, -2.0, 2.5, 0.5, -1.5, -3.5) | mat3x2(2.5, 3.5, -3.0, 2.5, -0.5, -2.5) ];
615            output mat3x2 out0 = [ mat3x2(-3.0, 5.0, -5.0, -7.0, -6.0, -1.0) | mat3x2(-3.0, 4.0, -5.0, -1.0, 3.0, 7.0) | mat3x2(-5.0, -7.0, 6.0, -5.0, 1.0, 5.0) ];
616        }
617
618        both ""
619            #version 300 es
620            precision mediump float;
621            ${DECLARATIONS}
622
623            mat3x2 func (mat3x2 a)
624            {
625                return -2.0*a;
626            }
627
628            void main()
629            {
630                ${SETUP}
631                out0 = func(in0);
632                ${OUTPUT}
633            }
634        ""
635    end
636
637
638    case mat3
639        version 300 es
640        values
641        {
642            input mat3 in0 = [ mat3(-1.5, 2.0, 3.0, -3.5, 1.0, -3.5, 1.5, -1.5, 3.0) | mat3(3.5, 0.0, 3.5, -1.5, -3.0, 0.5, -3.5, -2.5, -0.5) | mat3(1.0, -2.5, -3.5, 3.0, -1.5, 3.5, 3.0, -1.0, -0.5) ];
643            output mat3 out0 = [ mat3(3.0, -4.0, -6.0, 7.0, -2.0, 7.0, -3.0, 3.0, -6.0) | mat3(-7.0, -0.0, -7.0, 3.0, 6.0, -1.0, 7.0, 5.0, 1.0) | mat3(-2.0, 5.0, 7.0, -6.0, 3.0, -7.0, -6.0, 2.0, 1.0) ];
644        }
645
646        both ""
647            #version 300 es
648            precision mediump float;
649            ${DECLARATIONS}
650
651            mat3 func (mat3 a)
652            {
653                return -2.0*a;
654            }
655
656            void main()
657            {
658                ${SETUP}
659                out0 = func(in0);
660                ${OUTPUT}
661            }
662        ""
663    end
664
665
666    case mat3x4
667        version 300 es
668        values
669        {
670            input mat3x4 in0 = [ mat3x4(0.0, 1.0, 0.5, 0.5, 1.0, 3.5, 0.0, -0.5, 1.5, -2.0, -1.5, 3.5) | mat3x4(0.0, 0.5, -3.5, -0.5, 0.5, -3.5, 1.0, 1.0, -3.5, 1.0, -0.5, 1.5) | mat3x4(-1.0, 1.5, 2.0, -3.5, -3.5, 1.5, 3.5, -2.0, -0.5, 0.5, -1.5, -1.0) ];
671            output mat3x4 out0 = [ mat3x4(-0.0, -2.0, -1.0, -1.0, -2.0, -7.0, -0.0, 1.0, -3.0, 4.0, 3.0, -7.0) | mat3x4(-0.0, -1.0, 7.0, 1.0, -1.0, 7.0, -2.0, -2.0, 7.0, -2.0, 1.0, -3.0) | mat3x4(2.0, -3.0, -4.0, 7.0, 7.0, -3.0, -7.0, 4.0, 1.0, -1.0, 3.0, 2.0) ];
672        }
673
674        both ""
675            #version 300 es
676            precision mediump float;
677            ${DECLARATIONS}
678
679            mat3x4 func (mat3x4 a)
680            {
681                return -2.0*a;
682            }
683
684            void main()
685            {
686                ${SETUP}
687                out0 = func(in0);
688                ${OUTPUT}
689            }
690        ""
691    end
692
693
694    case mat4x2
695        version 300 es
696        values
697        {
698            input mat4x2 in0 = [ mat4x2(-1.5, -1.0, 0.5, -1.5, -1.0, 2.0, -3.5, 0.5) | mat4x2(2.0, -1.5, -2.0, 2.5, -2.0, -2.5, -0.5, 1.5) | mat4x2(-3.0, -1.5, -1.0, 2.5, -0.5, 2.5, -2.5, -1.0) ];
699            output mat4x2 out0 = [ mat4x2(3.0, 2.0, -1.0, 3.0, 2.0, -4.0, 7.0, -1.0) | mat4x2(-4.0, 3.0, 4.0, -5.0, 4.0, 5.0, 1.0, -3.0) | mat4x2(6.0, 3.0, 2.0, -5.0, 1.0, -5.0, 5.0, 2.0) ];
700        }
701
702        both ""
703            #version 300 es
704            precision mediump float;
705            ${DECLARATIONS}
706
707            mat4x2 func (mat4x2 a)
708            {
709                return -2.0*a;
710            }
711
712            void main()
713            {
714                ${SETUP}
715                out0 = func(in0);
716                ${OUTPUT}
717            }
718        ""
719    end
720
721
722    case mat4x3
723        version 300 es
724        values
725        {
726            input mat4x3 in0 = [ mat4x3(1.0, 3.0, -0.5, -2.0, -3.0, 0.0, -2.5, 2.5, 2.5, -2.5, -1.5, 2.5) | mat4x3(1.0, 2.5, -1.0, -3.0, -1.5, 2.0, -1.5, -1.0, -0.5, -0.5, -0.5, 3.0) | mat4x3(-2.5, -3.5, 3.5, 3.0, 3.5, -0.5, 3.5, 3.0, -2.0, 2.0, 2.5, 1.0) ];
727            output mat4x3 out0 = [ mat4x3(-2.0, -6.0, 1.0, 4.0, 6.0, -0.0, 5.0, -5.0, -5.0, 5.0, 3.0, -5.0) | mat4x3(-2.0, -5.0, 2.0, 6.0, 3.0, -4.0, 3.0, 2.0, 1.0, 1.0, 1.0, -6.0) | mat4x3(5.0, 7.0, -7.0, -6.0, -7.0, 1.0, -7.0, -6.0, 4.0, -4.0, -5.0, -2.0) ];
728        }
729
730        both ""
731            #version 300 es
732            precision mediump float;
733            ${DECLARATIONS}
734
735            mat4x3 func (mat4x3 a)
736            {
737                return -2.0*a;
738            }
739
740            void main()
741            {
742                ${SETUP}
743                out0 = func(in0);
744                ${OUTPUT}
745            }
746        ""
747    end
748
749
750    case mat4
751        version 300 es
752        values
753        {
754            input mat4 in0 = [ mat4(0.0, -1.5, -1.0, -2.0, -3.0, 0.5, -1.5, 2.5, -3.5, 3.0, 1.5, 3.0, 3.0, 3.0, 0.5, -3.5) | mat4(2.0, -2.5, -1.5, 1.0, 0.0, -0.5, 3.5, 1.0, -1.0, -2.0, 2.5, 0.0, 2.0, -1.0, -2.5, 0.5) | mat4(2.5, -2.5, 2.0, 3.0, 2.5, 2.5, -3.5, 1.0, 2.5, -3.5, -1.5, -1.5, 0.0, -0.5, 0.0, 2.0) ];
755            output mat4 out0 = [ mat4(-0.0, 3.0, 2.0, 4.0, 6.0, -1.0, 3.0, -5.0, 7.0, -6.0, -3.0, -6.0, -6.0, -6.0, -1.0, 7.0) | mat4(-4.0, 5.0, 3.0, -2.0, -0.0, 1.0, -7.0, -2.0, 2.0, 4.0, -5.0, -0.0, -4.0, 2.0, 5.0, -1.0) | mat4(-5.0, 5.0, -4.0, -6.0, -5.0, -5.0, 7.0, -2.0, -5.0, 7.0, 3.0, 3.0, -0.0, 1.0, -0.0, -4.0) ];
756        }
757
758        both ""
759            #version 300 es
760            precision mediump float;
761            ${DECLARATIONS}
762
763            mat4 func (mat4 a)
764            {
765                return -2.0*a;
766            }
767
768            void main()
769            {
770                ${SETUP}
771                out0 = func(in0);
772                ${OUTPUT}
773            }
774        ""
775    end
776
777    case float_struct
778        version 300 es
779        values
780        {
781            input vec3 in0 = [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
782            output float out0 = [ 1.0 | -0.5 ];
783        }
784
785        both ""
786            #version 300 es
787            precision mediump float;
788            ${DECLARATIONS}
789
790            struct Pos { float a, b, c; };
791
792            float func (Pos p)
793            {
794                return -(p.a + p.b + p.c);
795            }
796
797            void main()
798            {
799                Pos p = Pos(in0.x, in0.y, in0.z);
800                out0 = func(p);
801                ${OUTPUT}
802            }
803        ""
804    end
805
806    case struct_struct
807        version 300 es
808        values
809        {
810            input vec3 in0 = [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
811            output float out0 = [ 1.0 | -0.5 ];
812        }
813
814        both ""
815            #version 300 es
816            precision mediump float;
817            ${DECLARATIONS}
818
819            struct Pos { float a, b, c; };
820
821            Pos func (Pos p)
822            {
823                return Pos(-p.a, -p.b, -p.c);
824            }
825
826            void main()
827            {
828                Pos p = Pos(in0.x, in0.y, in0.z);
829                p = func(p);
830                out0 = p.a + p.b + p.c;
831                ${OUTPUT}
832            }
833        ""
834    end
835
836    case struct_nested_struct
837        version 300 es
838        values
839        {
840            input vec3 in0 = [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
841            output float out0 = [ 1.0 | -0.5 ];
842        }
843
844        both ""
845            #version 300 es
846            precision mediump float;
847            ${DECLARATIONS}
848
849            struct Pos { float a, b, c; };
850            struct Line { Pos start, end; };
851
852            Line func (Pos p)
853            {
854                return Line(p, Pos(-p.a, -p.b, -p.c));
855            }
856
857            float sum (Pos p)
858            {
859                return (p.a + p.b + p.c);
860            }
861
862            void main()
863            {
864                Pos p = Pos(in0.x, in0.y, in0.z);
865                Line line = func(p);
866                out0 = sum(line.start) + (2.0 * sum(line.end));
867                ${OUTPUT}
868            }
869        ""
870    end
871
872    case struct_constructor_highp_in_fragment
873        version 300 es
874        desc "passing highp vector to struct constructor in fragment shader yields all zeros"
875        vertex ""
876            #version 300 es
877            ${VERTEX_DECLARATIONS}
878            void main()
879            {
880                ${VERTEX_OUTPUT}
881            }
882        ""
883        fragment ""
884            #version 300 es
885            ${FRAGMENT_DECLARATIONS}
886            #ifdef GL_FRAGMENT_PRECISION_HIGH
887            #define PRECISION highp
888            #else
889            #define PRECISION mediump
890            #endif
891            struct Test {
892                PRECISION vec3 color;
893            } ;
894            void main() {
895                PRECISION vec3 color = vec3(0.2, 2.0, 0.1);
896                Test test = Test(color);
897                // Bias the color so all components are guaranteed > 1.0.
898                ${FRAG_COLOR} = vec4(vec3(0.25, 0.55, 0.65) + vec3(4.0, 0.25, 4.0) * test.color, 1.0);
899            }
900        ""
901    end
902
903
904end # datatypes
905
906group qualifiers "Function Parameter Qualifiers"
907
908    case in_float
909        version 300 es
910        values
911        {
912            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
913            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
914        }
915
916        both ""
917            #version 300 es
918            precision mediump float;
919            precision mediump int;
920            ${DECLARATIONS}
921
922            float func (in float a)
923            {
924                a = -a;
925                return 2.0 * a;
926            }
927
928            void main()
929            {
930                ${SETUP}
931                float f = in0;
932                float g = func(f);
933                out0 = f + g;
934                ${OUTPUT}
935            }
936        ""
937    end
938
939    case out_float
940        version 300 es
941        values
942        {
943            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
944            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
945        }
946
947        both ""
948            #version 300 es
949            precision mediump float;
950            precision mediump int;
951            ${DECLARATIONS}
952
953            void func (out float a)
954            {
955                a = -1.0;
956            }
957
958            void main()
959            {
960                ${SETUP}
961                float f = 1.0;
962                func(f);
963                out0 = f * in0;
964                ${OUTPUT}
965            }
966        ""
967    end
968
969    case inout_float
970        version 300 es
971        values
972        {
973            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
974            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
975        }
976
977        both ""
978            #version 300 es
979            precision mediump float;
980            precision mediump int;
981            ${DECLARATIONS}
982
983            void func (inout float a)
984            {
985                a = -a;
986            }
987
988            void main()
989            {
990                ${SETUP}
991                float f = 1.0;
992                func(f);
993                out0 = f * in0;
994                ${OUTPUT}
995            }
996        ""
997    end
998
999    case in_lowp_float
1000        version 300 es
1001        values
1002        {
1003            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1004            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1005        }
1006
1007        both ""
1008            #version 300 es
1009            precision mediump float;
1010            precision mediump int;
1011            ${DECLARATIONS}
1012
1013            float func (in lowp float a)
1014            {
1015                a = -a;
1016                return 2.0 * a;
1017            }
1018
1019            void main()
1020            {
1021                ${SETUP}
1022                float f = in0;
1023                float g = func(f);
1024                out0 = f + g;
1025                ${OUTPUT}
1026            }
1027        ""
1028    end
1029
1030    case out_lowp_float
1031        version 300 es
1032        values
1033        {
1034            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1035            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1036        }
1037
1038        both ""
1039            #version 300 es
1040            precision mediump float;
1041            precision mediump int;
1042            ${DECLARATIONS}
1043
1044            void func (out lowp float a)
1045            {
1046                a = -1.0;
1047            }
1048
1049            void main()
1050            {
1051                ${SETUP}
1052                float f = 1.0;
1053                func(f);
1054                out0 = f * in0;
1055                ${OUTPUT}
1056            }
1057        ""
1058    end
1059
1060    case inout_lowp_float
1061        version 300 es
1062        values
1063        {
1064            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1065            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1066        }
1067
1068        both ""
1069            #version 300 es
1070            precision mediump float;
1071            precision mediump int;
1072            ${DECLARATIONS}
1073
1074            void func (inout lowp float a)
1075            {
1076                a = -a;
1077            }
1078
1079            void main()
1080            {
1081                ${SETUP}
1082                float f = 1.0;
1083                func(f);
1084                out0 = f * in0;
1085                ${OUTPUT}
1086            }
1087        ""
1088    end
1089
1090    case in_highp_float
1091        version 300 es
1092        values
1093        {
1094            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1095            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1096        }
1097
1098        both ""
1099            #version 300 es
1100            precision mediump float;
1101            precision mediump int;
1102            ${DECLARATIONS}
1103
1104            float func (in highp float a)
1105            {
1106                a = -a;
1107                return 2.0 * a;
1108            }
1109
1110            void main()
1111            {
1112                ${SETUP}
1113                float f = in0;
1114                float g = func(f);
1115                out0 = f + g;
1116                ${OUTPUT}
1117            }
1118        ""
1119    end
1120
1121    case out_highp_float
1122        version 300 es
1123        values
1124        {
1125            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1126            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1127        }
1128
1129        both ""
1130            #version 300 es
1131            precision mediump float;
1132            precision mediump int;
1133            ${DECLARATIONS}
1134
1135            void func (out highp float a)
1136            {
1137                a = -1.0;
1138            }
1139
1140            void main()
1141            {
1142                ${SETUP}
1143                float f = 1.0;
1144                func(f);
1145                out0 = f * in0;
1146                ${OUTPUT}
1147            }
1148        ""
1149    end
1150
1151    case inout_highp_float
1152        version 300 es
1153        values
1154        {
1155            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1156            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1157        }
1158
1159        both ""
1160            #version 300 es
1161            precision mediump float;
1162            precision mediump int;
1163            ${DECLARATIONS}
1164
1165            void func (inout highp float a)
1166            {
1167                a = -a;
1168            }
1169
1170            void main()
1171            {
1172                ${SETUP}
1173                float f = 1.0;
1174                func(f);
1175                out0 = f * in0;
1176                ${OUTPUT}
1177            }
1178        ""
1179    end
1180
1181    case const_float
1182        version 300 es
1183        values
1184        {
1185            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1186            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1187        }
1188
1189        both ""
1190            #version 300 es
1191            precision mediump float;
1192            precision mediump int;
1193            ${DECLARATIONS}
1194
1195            float func (const float a)
1196            {
1197                float b = -a;
1198                return 2.0 * b;
1199            }
1200
1201            void main()
1202            {
1203                ${SETUP}
1204                float f = in0;
1205                float g = func(f);
1206                out0 = f + g;
1207                ${OUTPUT}
1208            }
1209        ""
1210    end
1211
1212    case const_in_float
1213        version 300 es
1214        values
1215        {
1216            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1217            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1218        }
1219
1220        both ""
1221            #version 300 es
1222            precision mediump float;
1223            precision mediump int;
1224            ${DECLARATIONS}
1225
1226            float func (const in float a)
1227            {
1228                float b = -a;
1229                return 2.0 * b;
1230            }
1231
1232            void main()
1233            {
1234                ${SETUP}
1235                float f = in0;
1236                float g = func(f);
1237                out0 = f + g;
1238                ${OUTPUT}
1239            }
1240        ""
1241    end
1242
1243    case in_int
1244        version 300 es
1245        values
1246        {
1247            input int in0 = [ 0 | 1 | -2 | 4 ];
1248            output int out0 = [ 0 | -1 | 2 | -4 ];
1249        }
1250
1251        both ""
1252            #version 300 es
1253            precision mediump float;
1254            precision mediump int;
1255            ${DECLARATIONS}
1256
1257            int func (in int a)
1258            {
1259                a = -a;
1260                return 2 * a;
1261            }
1262
1263            void main()
1264            {
1265                ${SETUP}
1266                int f = in0;
1267                int g = func(f);
1268                out0 = f + g;
1269                ${OUTPUT}
1270            }
1271        ""
1272    end
1273
1274    case out_int
1275        version 300 es
1276        values
1277        {
1278            input int in0 = [ 0 | 1 | -2 | 6 ];
1279            output int out0 = [ 0 | -1 | 2 | -6 ];
1280        }
1281
1282        both ""
1283            #version 300 es
1284            precision mediump float;
1285            precision mediump int;
1286            ${DECLARATIONS}
1287
1288            void func (out int a)
1289            {
1290                a = -1;
1291            }
1292
1293            void main()
1294            {
1295                ${SETUP}
1296                int f = 1;
1297                func(f);
1298                out0 = f * in0;
1299                ${OUTPUT}
1300            }
1301        ""
1302    end
1303
1304    case inout_int
1305        version 300 es
1306        values
1307        {
1308            input int in0 = [ 0 | 1 | -2 | 6 ];
1309            output int out0 = [ 0 | -1 | 2 | -6 ];
1310        }
1311
1312        both ""
1313            #version 300 es
1314            precision mediump float;
1315            precision mediump int;
1316            ${DECLARATIONS}
1317
1318            void func (inout int a)
1319            {
1320                a = -a;
1321            }
1322
1323            void main()
1324            {
1325                ${SETUP}
1326                int f = 1;
1327                func(f);
1328                out0 = f * in0;
1329                ${OUTPUT}
1330            }
1331        ""
1332    end
1333
1334    case in_lowp_int
1335        version 300 es
1336        values
1337        {
1338            input int in0 = [ 0 | 1 | -2 | 4 ];
1339            output int out0 = [ 0 | -1 | 2 | -4 ];
1340        }
1341
1342        both ""
1343            #version 300 es
1344            precision mediump float;
1345            precision mediump int;
1346            ${DECLARATIONS}
1347
1348            int func (in lowp int a)
1349            {
1350                a = -a;
1351                return 2 * a;
1352            }
1353
1354            void main()
1355            {
1356                ${SETUP}
1357                int f = in0;
1358                int g = func(f);
1359                out0 = f + g;
1360                ${OUTPUT}
1361            }
1362        ""
1363    end
1364
1365    case out_lowp_int
1366        version 300 es
1367        values
1368        {
1369            input int in0 = [ 0 | 1 | -2 | 6 ];
1370            output int out0 = [ 0 | -1 | 2 | -6 ];
1371        }
1372
1373        both ""
1374            #version 300 es
1375            precision mediump float;
1376            precision mediump int;
1377            ${DECLARATIONS}
1378
1379            void func (out lowp int a)
1380            {
1381                a = -1;
1382            }
1383
1384            void main()
1385            {
1386                ${SETUP}
1387                int f = 1;
1388                func(f);
1389                out0 = f * in0;
1390                ${OUTPUT}
1391            }
1392        ""
1393    end
1394
1395    case inout_lowp_int
1396        version 300 es
1397        values
1398        {
1399            input int in0 = [ 0 | 1 | -2 | 6 ];
1400            output int out0 = [ 0 | -1 | 2 | -6 ];
1401        }
1402
1403        both ""
1404            #version 300 es
1405            precision mediump float;
1406            precision mediump int;
1407            ${DECLARATIONS}
1408
1409            void func (inout lowp int a)
1410            {
1411                a = -a;
1412            }
1413
1414            void main()
1415            {
1416                ${SETUP}
1417                int f = 1;
1418                func(f);
1419                out0 = f * in0;
1420                ${OUTPUT}
1421            }
1422        ""
1423    end
1424
1425    case in_highp_int
1426        version 300 es
1427        values
1428        {
1429            input int in0 = [ 0 | 1 | -2 | 4 ];
1430            output int out0 = [ 0 | -1 | 2 | -4 ];
1431        }
1432
1433        both ""
1434            #version 300 es
1435            precision mediump float;
1436            precision mediump int;
1437            ${DECLARATIONS}
1438
1439            int func (in highp int a)
1440            {
1441                a = -a;
1442                return 2 * a;
1443            }
1444
1445            void main()
1446            {
1447                ${SETUP}
1448                int f = in0;
1449                int g = func(f);
1450                out0 = f + g;
1451                ${OUTPUT}
1452            }
1453        ""
1454    end
1455
1456    case out_highp_int
1457        version 300 es
1458        values
1459        {
1460            input int in0 = [ 0 | 1 | -2 | 6 ];
1461            output int out0 = [ 0 | -1 | 2 | -6 ];
1462        }
1463
1464        both ""
1465            #version 300 es
1466            precision mediump float;
1467            precision mediump int;
1468            ${DECLARATIONS}
1469
1470            void func (out highp int a)
1471            {
1472                a = -1;
1473            }
1474
1475            void main()
1476            {
1477                ${SETUP}
1478                int f = 1;
1479                func(f);
1480                out0 = f * in0;
1481                ${OUTPUT}
1482            }
1483        ""
1484    end
1485
1486    case inout_highp_int
1487        version 300 es
1488        values
1489        {
1490            input int in0 = [ 0 | 1 | -2 | 6 ];
1491            output int out0 = [ 0 | -1 | 2 | -6 ];
1492        }
1493
1494        both ""
1495            #version 300 es
1496            precision mediump float;
1497            precision mediump int;
1498            ${DECLARATIONS}
1499
1500            void func (inout highp int a)
1501            {
1502                a = -a;
1503            }
1504
1505            void main()
1506            {
1507                ${SETUP}
1508                int f = 1;
1509                func(f);
1510                out0 = f * in0;
1511                ${OUTPUT}
1512            }
1513        ""
1514    end
1515
1516    case const_int
1517        version 300 es
1518        values
1519        {
1520            input int in0 = [ 0 | 1 | -2 | 4 ];
1521            output int out0 = [ 0 | -1 | 2 | -4 ];
1522        }
1523
1524        both ""
1525            #version 300 es
1526            precision mediump float;
1527            precision mediump int;
1528            ${DECLARATIONS}
1529
1530            int func (const int a)
1531            {
1532                int b = -a;
1533                return 2 * b;
1534            }
1535
1536            void main()
1537            {
1538                ${SETUP}
1539                int f = in0;
1540                int g = func(f);
1541                out0 = f + g;
1542                ${OUTPUT}
1543            }
1544        ""
1545    end
1546
1547    case const_in_int
1548        version 300 es
1549        values
1550        {
1551            input int in0 = [ 0 | 1 | -2 | 4 ];
1552            output int out0 = [ 0 | -1 | 2 | -4 ];
1553        }
1554
1555        both ""
1556            #version 300 es
1557            precision mediump float;
1558            precision mediump int;
1559            ${DECLARATIONS}
1560
1561            int func (const in int a)
1562            {
1563                int b = -a;
1564                return 2 * b;
1565            }
1566
1567            void main()
1568            {
1569                ${SETUP}
1570                int f = in0;
1571                int g = func(f);
1572                out0 = f + g;
1573                ${OUTPUT}
1574            }
1575        ""
1576    end
1577
1578    case in_bool
1579        version 300 es
1580        values
1581        {
1582            input bool in0 = [ true | false ];
1583            output bool out0 = [ true | true ];
1584        }
1585
1586        both ""
1587            #version 300 es
1588            precision mediump float;
1589            ${DECLARATIONS}
1590
1591            bool func (in bool a)
1592            {
1593                a = !a;
1594                return a;
1595            }
1596
1597            void main()
1598            {
1599                ${SETUP}
1600                bool f = in0;
1601                bool g = func(f);
1602                out0 = (f != g);
1603                ${OUTPUT}
1604            }
1605        ""
1606    end
1607
1608    case out_bool
1609        version 300 es
1610        values
1611        {
1612            input bool in0 = [ true | false ];
1613            output bool out0 = [ false | true ];
1614        }
1615
1616        both ""
1617            #version 300 es
1618            precision mediump float;
1619            ${DECLARATIONS}
1620
1621            void func (out bool a)
1622            {
1623                a = false;
1624            }
1625
1626            void main()
1627            {
1628                ${SETUP}
1629                bool f = true;
1630                func(f);
1631                out0 = (in0 == f);
1632                ${OUTPUT}
1633            }
1634        ""
1635    end
1636
1637    case inout_bool
1638        version 300 es
1639        values
1640        {
1641            input bool in0 = [ true | false ];
1642            output bool out0 = [ false | true ];
1643        }
1644
1645        both ""
1646            #version 300 es
1647            precision mediump float;
1648            ${DECLARATIONS}
1649
1650            void func (inout bool a)
1651            {
1652                a = !a;
1653            }
1654
1655            void main()
1656            {
1657                ${SETUP}
1658                bool f = true;
1659                func(f);
1660                out0 = (in0 == f);
1661                ${OUTPUT}
1662            }
1663        ""
1664    end
1665
1666    case const_bool
1667        version 300 es
1668        values
1669        {
1670            input bool in0 = [ true | false ];
1671            output bool out0 = [ true | true ];
1672        }
1673
1674        both ""
1675            #version 300 es
1676            precision mediump float;
1677            ${DECLARATIONS}
1678
1679            bool func (const bool a)
1680            {
1681                bool b = !a;
1682                return b;
1683            }
1684
1685            void main()
1686            {
1687                ${SETUP}
1688                bool f = in0;
1689                bool g = func(f);
1690                out0 = (f != g);
1691                ${OUTPUT}
1692            }
1693        ""
1694    end
1695
1696end # qualifiers
1697
1698group declarations "Function Declarations"
1699
1700    case basic
1701        version 300 es
1702        values
1703        {
1704            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1705            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1706        }
1707
1708        both ""
1709            #version 300 es
1710            precision mediump float;
1711            ${DECLARATIONS}
1712
1713            float func (void);
1714
1715            float func (void)
1716            {
1717                return -1.0;
1718            }
1719
1720            void main()
1721            {
1722                out0 = func() * in0;
1723                ${OUTPUT}
1724            }
1725        ""
1726    end
1727
1728    case basic_arg
1729        version 300 es
1730        values
1731        {
1732            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1733            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1734        }
1735
1736        both ""
1737            #version 300 es
1738            precision mediump float;
1739            ${DECLARATIONS}
1740
1741            float func (float f);
1742
1743            float func (float f)
1744            {
1745                return -f;
1746            }
1747
1748            void main()
1749            {
1750                out0 = func(in0);
1751                ${OUTPUT}
1752            }
1753        ""
1754    end
1755
1756    case define_after_use
1757        version 300 es
1758        values
1759        {
1760            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1761            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1762        }
1763
1764        both ""
1765            #version 300 es
1766            precision mediump float;
1767            ${DECLARATIONS}
1768
1769            float func (void);
1770
1771            void main()
1772            {
1773                out0 = func() * in0;
1774                ${OUTPUT}
1775            }
1776
1777            float func (void)
1778            {
1779                return -1.0;
1780            }
1781        ""
1782    end
1783
1784    case double_declare
1785        version 300 es
1786        values
1787        {
1788            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1789            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1790        }
1791
1792        both ""
1793            #version 300 es
1794            precision mediump float;
1795            ${DECLARATIONS}
1796
1797            float func (void);
1798
1799            float func (void);
1800
1801            float func (void)
1802            {
1803                return -1.0;
1804            }
1805
1806            void main()
1807            {
1808                out0 = func() * in0;
1809                ${OUTPUT}
1810            }
1811        ""
1812    end
1813
1814    case declare_after_define
1815        version 300 es
1816        values
1817        {
1818            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1819            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1820        }
1821
1822        both ""
1823            #version 300 es
1824            precision mediump float;
1825            ${DECLARATIONS}
1826
1827            float func (void)
1828            {
1829                return -1.0;
1830            }
1831
1832            float func (void);
1833
1834            void main()
1835            {
1836                out0 = func() * in0;
1837                ${OUTPUT}
1838            }
1839        ""
1840    end
1841
1842    case void_vs_no_void
1843        version 300 es
1844        values
1845        {
1846            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1847            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1848        }
1849
1850        both ""
1851            #version 300 es
1852            precision mediump float;
1853            ${DECLARATIONS}
1854
1855            float func ();
1856
1857            void main()
1858            {
1859                out0 = func() * in0;
1860                ${OUTPUT}
1861            }
1862
1863            float func (void)
1864            {
1865                return -1.0;
1866            }
1867        ""
1868    end
1869
1870    case in_vs_no_in
1871        version 300 es
1872        values
1873        {
1874            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1875            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1876        }
1877
1878        both ""
1879            #version 300 es
1880            precision mediump float;
1881            ${DECLARATIONS}
1882
1883            float func (float f);
1884
1885            void main()
1886            {
1887                out0 = func(in0);
1888                ${OUTPUT}
1889            }
1890
1891            float func (in float f)
1892            {
1893                return -f;
1894            }
1895        ""
1896    end
1897
1898    case default_vs_explicit_precision
1899        version 300 es
1900        values
1901        {
1902            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1903            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1904        }
1905
1906        both ""
1907            #version 300 es
1908            precision mediump float;
1909            ${DECLARATIONS}
1910
1911            float func (float f);
1912
1913            void main()
1914            {
1915                out0 = func(in0);
1916                ${OUTPUT}
1917            }
1918
1919            float func (mediump float f)
1920            {
1921                return -f;
1922            }
1923        ""
1924    end
1925
1926
1927end # declarations
1928
1929group overloading "Function Overloading"
1930
1931    case user_func_arg_type_simple
1932        version 300 es
1933        values
1934        {
1935            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1936            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1937        }
1938
1939        both ""
1940            #version 300 es
1941            precision mediump float;
1942            precision mediump int;
1943            ${DECLARATIONS}
1944
1945            float func (float a)
1946            {
1947                return -a;
1948            }
1949
1950            int func (int a)
1951            {
1952                return -a;
1953            }
1954
1955            void main()
1956            {
1957                out0 = func(in0) * float(func(-1));
1958                ${OUTPUT}
1959            }
1960        ""
1961    end
1962
1963    case user_func_arg_float_types
1964        version 300 es
1965        values
1966        {
1967            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1968            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1969        }
1970
1971        both ""
1972            #version 300 es
1973            precision mediump float;
1974            precision mediump int;
1975            ${DECLARATIONS}
1976
1977            float func (float a) { return -a; }
1978            vec2 func (vec2 a) { return a.yx; }
1979            vec3 func (vec3 a) { return a.xxx; }
1980            vec4 func (vec4 a) { return a.wwww; }
1981
1982            void main()
1983            {
1984                out0 = func(func(func(func(vec4(in0)).xyz).xy).x);
1985                ${OUTPUT}
1986            }
1987        ""
1988    end
1989
1990    case user_func_arg_int_types
1991        version 300 es
1992        values
1993        {
1994            input int in0 = [ 0 | 1 | -2 | 6 ];
1995            output int out0 = [ 0 | -1 | 2 | -6 ];
1996        }
1997
1998        both ""
1999            #version 300 es
2000            precision mediump float;
2001            precision mediump int;
2002            ${DECLARATIONS}
2003
2004            int func (int a) { return -a; }
2005            ivec2 func (ivec2 a) { return a.yx; }
2006            ivec3 func (ivec3 a) { return a.xxx; }
2007            ivec4 func (ivec4 a) { return a.wwww; }
2008
2009            void main()
2010            {
2011                ${SETUP}
2012                out0 = func(func(func(func(ivec4(in0)).xyz).xy).x);
2013                ${OUTPUT}
2014            }
2015        ""
2016    end
2017
2018    case user_func_arg_bool_types
2019        version 300 es
2020        values
2021        {
2022            input bool in0 = [ true | false ];
2023            output bool out0 = [ false | true ];
2024        }
2025
2026        both ""
2027            #version 300 es
2028            precision mediump float;
2029            ${DECLARATIONS}
2030
2031            bool func (bool a) { return !a; }
2032            bvec2 func (bvec2 a) { return a.yx; }
2033            bvec3 func (bvec3 a) { return a.xxx; }
2034            bvec4 func (bvec4 a) { return a.wwww; }
2035
2036            void main()
2037            {
2038                ${SETUP}
2039                out0 = func(func(func(func(bvec4(in0)).xyz).xy).x);
2040                ${OUTPUT}
2041            }
2042        ""
2043    end
2044
2045    case user_func_arg_basic_types
2046        version 300 es
2047        values
2048        {
2049            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
2050            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
2051        }
2052
2053        both ""
2054            #version 300 es
2055            precision mediump float;
2056            precision mediump int;
2057            ${DECLARATIONS}
2058
2059            float func (float a) { return -a; }
2060            vec2 func (vec2 a) { return a.yx; }
2061            vec3 func (vec3 a) { return a.xxx; }
2062            vec4 func (vec4 a) { return a.wwww; }
2063            int func (int a) { return -a; }
2064            ivec2 func (ivec2 a) { return a.yx; }
2065            ivec3 func (ivec3 a) { return a.xxx; }
2066            ivec4 func (ivec4 a) { return a.wwww; }
2067            bool func (bool a) { return !a; }
2068            bvec2 func (bvec2 a) { return a.yx; }
2069            bvec3 func (bvec3 a) { return a.xxx; }
2070            bvec4 func (bvec4 a) { return a.wwww; }
2071
2072            void main()
2073            {
2074                ${SETUP}
2075                if (func(func(bvec4(false)).x))
2076                    out0 = func(in0) * float(func(-1));
2077                else
2078                    out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
2079                ${OUTPUT}
2080            }
2081        ""
2082    end
2083
2084    case user_func_arg_complex_types
2085        version 300 es
2086        values
2087        {
2088            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
2089            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
2090        }
2091
2092        both ""
2093            #version 300 es
2094            precision mediump float;
2095            precision mediump int;
2096            ${DECLARATIONS}
2097
2098            struct Pos { float a, b, c; };
2099            struct Line { Pos start, end; };
2100
2101            float func (float a) { return -a; }
2102            float func (float a[4]) { return a[0] + a[3]; }
2103            vec2 func (vec2 a) { return a.yx; }
2104            vec3 func (vec3 a) { return a.xxx; }
2105            vec4 func (vec4 a) { return a.wwww; }
2106            vec4 func (vec4 a[4]) { return a[1] + a[2]; }
2107            int func (int a) { return -a; }
2108            ivec2 func (ivec2 a) { return a.yx; }
2109            ivec3 func (ivec3 a) { return a.xxx; }
2110            ivec4 func (ivec4 a) { return a.wwww; }
2111            bool func (bool a) { return !a; }
2112            bvec2 func (bvec2 a) { return a.yx; }
2113            bvec3 func (bvec3 a) { return a.xxx; }
2114            bvec4 func (bvec4 a) { return a.wwww; }
2115            Pos func (Pos a) { return a; }
2116            Line func (Line a) { return Line(a.end, a.start); }
2117
2118            void main()
2119            {
2120                ${SETUP}
2121                float arr[4];
2122                vec4 arr2[4];
2123                out0 = func(arr) + func(arr2).x;
2124                if (func(func(bvec4(false)).x))
2125                    out0 = func(in0) * float(func(-1));
2126                else
2127                    out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
2128                ${OUTPUT}
2129            }
2130        ""
2131    end
2132
2133    case user_func_arguments
2134        version 300 es
2135        values
2136        {
2137            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
2138            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
2139        }
2140
2141        both ""
2142            #version 300 es
2143            precision mediump float;
2144            ${DECLARATIONS}
2145
2146            float func (float a)
2147            {
2148                return -a;
2149            }
2150
2151            float func (float a, float b)
2152            {
2153                return a * b;
2154            }
2155
2156            void main()
2157            {
2158                out0 = func(in0) * func(-0.5, -2.0);
2159                ${OUTPUT}
2160            }
2161        ""
2162    end
2163
2164    case array_size
2165        version 300 es
2166        values
2167        {
2168            output float out0 = [ 1.0 ];
2169        }
2170
2171        both ""
2172            #version 300 es
2173            precision mediump float;
2174            ${DECLARATIONS}
2175
2176            float func (float f[3])
2177            {
2178                return f[0];
2179            }
2180
2181            float func (float f[4])
2182            {
2183                return f[1];
2184            }
2185
2186            void main ()
2187            {
2188                ${SETUP}
2189                float[4] x = float[4] (-1.0, 1.0, 0.0, 0.0);
2190                out0 = func(x);
2191                ${OUTPUT}
2192            }
2193        ""
2194    end
2195
2196end # overloading
2197
2198group array_arguments "Arrays as Arguments"
2199
2200    case local_in_float
2201        version 300 es
2202        values
2203        {
2204            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2205            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2206        }
2207
2208        both ""
2209            #version 300 es
2210            precision mediump float;
2211            ${DECLARATIONS}
2212
2213            float func (in float a[4])
2214            {
2215                a[0] = -1.0;
2216                a[2] = -4.0;
2217                a[3] = -3.0 * a[1];
2218                return a[0];
2219            }
2220
2221            void main()
2222            {
2223                float arr[4];
2224                arr[0] = in0.x;
2225                arr[1] = in0.y;
2226                arr[2] = in0.z;
2227                arr[3] = in0.w;
2228                float f = func(arr);
2229                out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
2230                ${OUTPUT}
2231            }
2232        ""
2233    end
2234
2235    case global_in_float
2236        version 300 es
2237        values
2238        {
2239            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2240            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2241        }
2242
2243        both ""
2244            #version 300 es
2245            precision mediump float;
2246            ${DECLARATIONS}
2247
2248            float func (in float a[4])
2249            {
2250                a[0] = -1.0;
2251                a[2] = -4.0;
2252                a[3] = -3.0 * a[1];
2253                return a[0];
2254            }
2255
2256            float arr[4];
2257
2258            void main()
2259            {
2260                arr[0] = in0.x;
2261                arr[1] = in0.y;
2262                arr[2] = in0.z;
2263                arr[3] = in0.w;
2264                float f = func(arr);
2265                out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
2266                ${OUTPUT}
2267            }
2268        ""
2269    end
2270
2271    case local_in_int
2272        version 300 es
2273        values
2274        {
2275            input ivec4 in0 = [ ivec4(0, 1, 2, -4) | ivec4(-7, -11, 13, 19) ];
2276            output ivec4 out0 = [ ivec4(0, -1, -2, 4) | ivec4(7, 11, -13, -19) ];
2277        }
2278
2279        both ""
2280            #version 300 es
2281            precision mediump float;
2282            precision mediump int;
2283            ${DECLARATIONS}
2284
2285            int func (in int a[4])
2286            {
2287                a[0] = -1;
2288                a[2] = -4;
2289                a[3] = -3 * a[1];
2290                return a[0];
2291            }
2292
2293            void main()
2294            {
2295                ${SETUP}
2296                int arr[4];
2297                arr[0] = in0.x;
2298                arr[1] = in0.y;
2299                arr[2] = in0.z;
2300                arr[3] = in0.w;
2301                int f = func(arr);
2302                out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
2303                ${OUTPUT}
2304            }
2305        ""
2306    end
2307
2308    case global_in_int
2309        version 300 es
2310        values
2311        {
2312            input ivec4 in0 = [ ivec4(0, 1, 2, 4) | ivec4(-7, -11, 13, 19) ];
2313            output ivec4 out0 = [ ivec4(0, -1, -2, -4) | ivec4(7, 11, -13, -19) ];
2314        }
2315
2316        both ""
2317            #version 300 es
2318            precision mediump float;
2319            precision mediump int;
2320            ${DECLARATIONS}
2321
2322            int func (in int a[4])
2323            {
2324                a[0] = -1;
2325                a[2] = -4;
2326                a[3] = -3 * a[1];
2327                return a[0];
2328            }
2329
2330            int arr[4];
2331
2332            void main()
2333            {
2334                ${SETUP}
2335                arr[0] = in0.x;
2336                arr[1] = in0.y;
2337                arr[2] = in0.z;
2338                arr[3] = in0.w;
2339                int f = func(arr);
2340                out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
2341                ${OUTPUT}
2342            }
2343
2344        ""
2345    end
2346
2347    case local_in_bool
2348        version 300 es
2349        values
2350        {
2351            input bvec4 in0 = [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
2352            output bvec4 out0 = [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
2353        }
2354
2355        both ""
2356            #version 300 es
2357            precision mediump float;
2358            ${DECLARATIONS}
2359
2360            bool func (in bool a[4])
2361            {
2362                a[0] = false;
2363                a[2] = true;
2364                a[3] = !a[1];
2365                return a[0];
2366            }
2367
2368            void main()
2369            {
2370                ${SETUP}
2371                bool arr[4];
2372                arr[0] = !in0.x;
2373                arr[1] = !in0.y;
2374                arr[2] = !in0.z;
2375                arr[3] = !in0.w;
2376                func(arr);
2377                out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
2378                ${OUTPUT}
2379            }
2380        ""
2381    end
2382
2383    case global_in_bool
2384        version 300 es
2385        values
2386        {
2387            input bvec4 in0 = [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
2388            output bvec4 out0 = [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
2389        }
2390
2391        both ""
2392            #version 300 es
2393            precision mediump float;
2394            ${DECLARATIONS}
2395
2396            bool func (in bool a[4])
2397            {
2398                a[0] = false;
2399                a[2] = true;
2400                a[3] = !a[1];
2401                return a[0];
2402            }
2403
2404            bool arr[4];
2405
2406            void main()
2407            {
2408                ${SETUP}
2409                arr[0] = !in0.x;
2410                arr[1] = !in0.y;
2411                arr[2] = !in0.z;
2412                arr[3] = !in0.w;
2413                func(arr);
2414                out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
2415                ${OUTPUT}
2416            }
2417        ""
2418    end
2419
2420    case test_helpers
2421        version 300 es
2422        desc "Check that helper functions are supported properly."
2423        values
2424        {
2425            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2426            output float out0 = [ 1.0 | 1.0 ];
2427        }
2428
2429        both ""
2430            #version 300 es
2431            precision mediump float;
2432            ${DECLARATIONS}
2433
2434            vec4 get (in float arr[4]);
2435            void set (out float arr[4], vec4 val);
2436            void negate (inout float arr[4]);
2437            bool test (in float arr[4], vec4 ref);
2438            bool isEqual (in float a[4], in float b[4]);
2439
2440            void main()
2441            {
2442                float arr[4];
2443                set(arr, in0);
2444                negate(arr);
2445                out0 = float(test(arr, -in0));
2446                ${OUTPUT}
2447            }
2448
2449            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2450            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2451            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2452            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2453            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2454            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2455        ""
2456    end
2457
2458    case copy_local_in_on_call
2459        version 300 es
2460        desc "Check that local 'in' arguments are copied on call and don't alias."
2461        values
2462        {
2463            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2464            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2465        }
2466
2467        both ""
2468            #version 300 es
2469            precision mediump float;
2470            ${DECLARATIONS}
2471
2472            vec4 get (in float arr[4]);
2473            void set (out float arr[4], vec4 val);
2474            void negate (inout float arr[4]);
2475            bool test (in float arr[4], vec4 ref);
2476            bool isEqual (in float a[4], in float b[4]);
2477
2478            float func (in float a[4], in float b[4])
2479            {
2480                a[0] = 2.123;
2481                a[2] = -4.123;
2482                return isEqual(a, b) ? 1.0 : -1.0;
2483            }
2484
2485            void main()
2486            {
2487                float arr[4];
2488                set(arr, in0);
2489                out0 = in0 * func(arr, arr);
2490                ${OUTPUT}
2491            }
2492
2493            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2494            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2495            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2496            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2497            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2498            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2499        ""
2500    end
2501
2502    case copy_global_in_on_call
2503        version 300 es
2504        desc "Check that global 'in' arguments are copied on call and don't alias."
2505        values
2506        {
2507            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2508            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2509        }
2510
2511        both ""
2512            #version 300 es
2513            precision mediump float;
2514            ${DECLARATIONS}
2515
2516            vec4 get (in float arr[4]);
2517            void set (out float arr[4], vec4 val);
2518            void negate (inout float arr[4]);
2519            bool test (in float arr[4], vec4 ref);
2520            bool isEqual (in float a[4], in float b[4]);
2521
2522            float func (in float a[4], in float b[4])
2523            {
2524                a[0] = 2.123;
2525                a[2] = -4.123;
2526                return isEqual(a, b) ? 1.0 : -1.0;
2527            }
2528
2529            float arr[4];
2530
2531            void main()
2532            {
2533                set(arr, in0);
2534                out0 = in0 * func(arr, arr);
2535                ${OUTPUT}
2536            }
2537
2538            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2539            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2540            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2541            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2542            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2543            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2544        ""
2545    end
2546
2547    case copy_local_inout_on_call
2548        version 300 es
2549        desc "Check that local 'in' arguments are copied on call and don't alias."
2550        values
2551        {
2552            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2553            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2554        }
2555
2556        both ""
2557            #version 300 es
2558            precision mediump float;
2559            ${DECLARATIONS}
2560
2561            vec4 get (in float arr[4]);
2562            void set (out float arr[4], vec4 val);
2563            void negate (inout float arr[4]);
2564            bool test (in float arr[4], vec4 ref);
2565            bool isEqual (in float a[4], in float b[4]);
2566
2567            float func (inout float a[4], inout float b[4])
2568            {
2569                negate(a);
2570                return isEqual(a, b) ? 1.0 : -1.0;
2571            }
2572
2573            void main()
2574            {
2575                float arr[4];
2576                set(arr, in0);
2577                float m = func(arr, arr); // returns -1.0
2578                float n = float(test(arr, in0) || test(arr, -in0));
2579                out0 = in0 * m * n;
2580                ${OUTPUT}
2581            }
2582
2583            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2584            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2585            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2586            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2587            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2588            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2589        ""
2590    end
2591
2592    case copy_global_inout_on_call
2593        version 300 es
2594        desc "Check that global 'in' arguments are copied on call and don't alias."
2595        values
2596        {
2597            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2598            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2599        }
2600
2601        both ""
2602            #version 300 es
2603            precision mediump float;
2604            ${DECLARATIONS}
2605
2606            vec4 get (in float arr[4]);
2607            void set (out float arr[4], vec4 val);
2608            void negate (inout float arr[4]);
2609            bool test (in float arr[4], vec4 ref);
2610            bool isEqual (in float a[4], in float b[4]);
2611
2612            float func (in float a[4], in float b[4])
2613            {
2614                negate(a);
2615                return isEqual(a, b) ? 1.0 : -1.0;
2616            }
2617
2618            float arr[4];
2619
2620            void main()
2621            {
2622                set(arr, in0);
2623                float m = func(arr, arr); // returns -1.0
2624                float n = float(test(arr, in0) || test(arr, -in0));
2625                out0 = in0 * m * n;
2626                ${OUTPUT}
2627            }
2628
2629            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2630            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2631            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2632            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2633            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2634            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2635        ""
2636    end
2637
2638#            vec4 get (in float arr[4]);
2639#            void set (out float arr[4], vec4 val);
2640#            void negate (inout float arr[4]);
2641#            bool test (in float arr[4], vec4 ref);
2642#            bool isEqual (in float a[4], in float b[4]);
2643
2644#            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2645#            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2646#            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2647#            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2648#            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2649#            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2650
2651end # array_arguments
2652
2653#group qualifiers "Function Parameter Qualifiers"
2654#
2655#end # qualifiers
2656
2657group control_flow "Control Flow In Functions"
2658
2659    case simple_return
2660        version 300 es
2661        values
2662        {
2663            input float in0 = [ -0.5 | 1.5 ];
2664            output float out0 = [ 0.5 | -1.5 ];
2665        }
2666
2667        both ""
2668            #version 300 es
2669            precision mediump float;
2670            ${DECLARATIONS}
2671
2672            float func (float a)
2673            {
2674                return -a;
2675                a = a * -1.0;
2676                return 1.0;
2677            }
2678
2679            void main()
2680            {
2681                ${SETUP}
2682                out0 = func(in0);
2683                ${OUTPUT}
2684            }
2685        ""
2686    end
2687
2688    case return_in_if
2689        version 300 es
2690        values
2691        {
2692            input float in0 = [ -0.5 | 1.5 ];
2693            output float out0 = [ 0.5 | -1.5 ];
2694        }
2695
2696        both ""
2697            #version 300 es
2698            precision mediump float;
2699            ${DECLARATIONS}
2700
2701            float func (float a)
2702            {
2703                if (a != 0.0)
2704                    return -a;
2705                return 1.0;
2706            }
2707
2708            void main()
2709            {
2710                ${SETUP}
2711                out0 = func(in0);
2712                ${OUTPUT}
2713            }
2714        ""
2715    end
2716
2717    case return_in_else
2718        version 300 es
2719        values
2720        {
2721            input float in0 = [ -0.5 | 1.5 ];
2722            output float out0 = [ 0.5 | -1.5 ];
2723        }
2724
2725        both ""
2726            #version 300 es
2727            precision mediump float;
2728            ${DECLARATIONS}
2729
2730            float func (float a)
2731            {
2732                if (a == 0.0)
2733                    return 1.0;
2734                else
2735                    return -a;
2736                return 1.0;
2737            }
2738
2739            void main()
2740            {
2741                ${SETUP}
2742                out0 = func(in0);
2743                ${OUTPUT}
2744            }
2745        ""
2746    end
2747
2748    case return_in_loop
2749        version 300 es
2750        values
2751        {
2752            input float in0 = [ -0.5 | 1.5 ];
2753            output float out0 = [ 0.5 | -1.5 ];
2754        }
2755
2756        both ""
2757            #version 300 es
2758            precision mediump float;
2759            ${DECLARATIONS}
2760
2761            float func (float a)
2762            {
2763                while (a < 100.0)
2764                    return -a;
2765                return 1.0;
2766            }
2767
2768            void main()
2769            {
2770                ${SETUP}
2771                out0 = func(in0);
2772                ${OUTPUT}
2773            }
2774        ""
2775    end
2776
2777    case return_in_loop_if
2778        version 300 es
2779        values
2780        {
2781            input float in0 = [ -0.5 | 1.5 ];
2782            output float out0 = [ 0.5 | -1.5 ];
2783        }
2784
2785        both ""
2786            #version 300 es
2787            precision mediump float;
2788            ${DECLARATIONS}
2789
2790            float func (float a)
2791            {
2792                while (a < 100.0)
2793                {
2794                    a = -a;
2795                    if (a != 0.0)
2796                        return a;
2797                    else
2798                        return -1.0;
2799                }
2800                return 1.0;
2801            }
2802
2803            void main()
2804            {
2805                ${SETUP}
2806                out0 = func(in0);
2807                ${OUTPUT}
2808            }
2809        ""
2810    end
2811
2812    case return_after_loop
2813        version 300 es
2814        values
2815        {
2816            input float in0 = [ -0.5 | 1.5 ];
2817            output float out0 = [ 0.5 | -1.5 ];
2818        }
2819
2820        both ""
2821            #version 300 es
2822            precision mediump float;
2823            ${DECLARATIONS}
2824
2825            float func (float a)
2826            {
2827                for (int i = 0; i < 5; i++)
2828                    a = -a;
2829                return a;
2830            }
2831
2832            void main()
2833            {
2834                ${SETUP}
2835                out0 = func(in0);
2836                ${OUTPUT}
2837            }
2838        ""
2839    end
2840
2841    case return_after_break
2842        version 300 es
2843        values
2844        {
2845            input float in0 = [ -0.5 | 1.5 ];
2846            output float out0 = [ 0.5 | -1.5 ];
2847        }
2848
2849        both ""
2850            #version 300 es
2851            precision mediump float;
2852            ${DECLARATIONS}
2853
2854            float func (float a)
2855            {
2856                for (int i = 0; i < 6; i++)
2857                {
2858                    a = -a;
2859                    if (i == 4)
2860                        break;
2861                }
2862                return a;
2863            }
2864
2865            void main()
2866            {
2867                ${SETUP}
2868                out0 = func(in0);
2869                ${OUTPUT}
2870            }
2871        ""
2872    end
2873
2874    case return_after_continue
2875        version 300 es
2876        values
2877        {
2878            input float in0 = [ -0.5 | 1.5 ];
2879            output float out0 = [ 0.5 | -1.5 ];
2880        }
2881
2882        both ""
2883            #version 300 es
2884            precision mediump float;
2885            ${DECLARATIONS}
2886
2887            float func (float a)
2888            {
2889                for (int i = 0; i < 6; i++)
2890                {
2891                    if (i == 4)
2892                        continue;
2893                    a = -a;
2894                }
2895                return a;
2896            }
2897
2898            void main()
2899            {
2900                ${SETUP}
2901                out0 = func(in0);
2902                ${OUTPUT}
2903            }
2904        ""
2905    end
2906
2907    case return_in_nested_loop
2908        version 300 es
2909        values
2910        {
2911            input float in0 = [ -0.5 | 1.5 ];
2912            output float out0 = [ 0.5 | -1.5 ];
2913        }
2914
2915        both ""
2916            #version 300 es
2917            precision mediump float;
2918            ${DECLARATIONS}
2919
2920            float func (float a)
2921            {
2922                for (int i = 0; i < 6; i++)
2923                {
2924                    a = -a;
2925                    for (int j = 0; j < 4; j++)
2926                    {
2927                        a = -a;
2928                        if (i == 1)
2929                            return a;
2930                    }
2931                    if (i == 4)
2932                        return 1.0;
2933                }
2934                return 1.0;
2935            }
2936
2937            void main()
2938            {
2939                ${SETUP}
2940                out0 = func(in0);
2941                ${OUTPUT}
2942            }
2943        ""
2944    end
2945
2946    case return_after_loop_sequence
2947        version 300 es
2948        values
2949        {
2950            input float in0 = [ -0.5 | 1.5 ];
2951            output float out0 = [ 0.5 | -1.5 ];
2952        }
2953
2954        both ""
2955            #version 300 es
2956            precision mediump float;
2957            ${DECLARATIONS}
2958
2959            float func (float a)
2960            {
2961                int i;
2962                for (i = 0; i < 6; i++) // negate a
2963                {
2964                    a = -a;
2965                    if (i == 4)
2966                        a = -a;
2967                }
2968
2969                for (; i < 10; i++) // keep a
2970                {
2971                    if (i == 8)
2972                        continue;
2973                    else if (i == 9)
2974                        break;
2975                    a = -a;
2976                }
2977
2978                return a;
2979            }
2980
2981            void main()
2982            {
2983                ${SETUP}
2984                out0 = func(in0);
2985                ${OUTPUT}
2986            }
2987        ""
2988    end
2989
2990    case mixed_return_break_continue
2991        version 300 es
2992        values
2993        {
2994            input float in0 = [ -0.5 | 1.5 ];
2995            output float out0 = [ 0.5 | -1.5 ];
2996        }
2997
2998        both ""
2999            #version 300 es
3000            precision mediump float;
3001            ${DECLARATIONS}
3002
3003            float func (float a)
3004            {
3005                int i;
3006                for (i = 0; i < 6; i++)
3007                {
3008                    if (i == 0)
3009                        continue;
3010                    else if (i == 1)
3011                    {
3012                    }
3013                    else if (i == 3)
3014                        break;
3015                    else
3016                        return a;
3017                    a = -a;
3018                }
3019
3020                return 1.0;
3021            }
3022
3023            void main()
3024            {
3025                ${SETUP}
3026                out0 = func(in0);
3027                ${OUTPUT}
3028            }
3029        ""
3030    end
3031
3032end # control_flow
3033
3034group misc "Miscellaneous"
3035
3036    case multi_arg_float
3037        version 300 es
3038        values
3039        {
3040            input vec4 in0 = [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
3041            output float out0 = [ 0.5 | -1.5 ]; # -sum(in0)
3042        }
3043
3044        both ""
3045            #version 300 es
3046            precision mediump float;
3047            ${DECLARATIONS}
3048
3049            float sum(vec4 v) { return (v.x + v.y + v.z + v.w); }
3050
3051            float func (float a, vec3 b, vec2 c, vec2 d, vec4 e)
3052            {
3053                return -sum(vec4(a, b) + vec4(c, d)) + sum(e);
3054            }
3055
3056            void main()
3057            {
3058                ${SETUP}
3059                out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
3060                ${OUTPUT}
3061            }
3062        ""
3063    end
3064
3065    case multi_arg_int
3066        version 300 es
3067        values
3068        {
3069            input ivec4 in0 = [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
3070            output int out0 = [ -3 | 1 ];
3071        }
3072
3073        both ""
3074            #version 300 es
3075            precision mediump float;
3076            precision mediump int;
3077            ${DECLARATIONS}
3078
3079            int sum(ivec4 v) { return (v.x + v.y + v.z + v.w); }
3080
3081            int func (int a, ivec3 b, ivec2 c, ivec2 d, ivec4 e)
3082            {
3083                return -sum(ivec4(a, b) + ivec4(c, d)) + sum(e);
3084            }
3085
3086            void main()
3087            {
3088                ${SETUP}
3089                out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
3090                ${OUTPUT}
3091            }
3092        ""
3093    end
3094
3095    case argument_eval_order_1
3096        version 300 es
3097        values
3098        {
3099            input int in0 = [  0 | 1 | 3 | 5 ];
3100            output int out0 = [ -1 | 5 | 11 | 17 ];
3101        }
3102
3103        both ""
3104            #version 300 es
3105            precision highp float;
3106            ${DECLARATIONS}
3107
3108            int func (float a, int b, bool c, int d)
3109            {
3110                if (c)
3111                    return b + int(a) + d;
3112                else
3113                    return -1;
3114            }
3115
3116            void main ()
3117            {
3118                ${SETUP}
3119                float v0 = float(in0);
3120                int v1 = in0;
3121                out0 = func((v0 += 1.0), v1++, (v0 > 1.5), v1);
3122                ${OUTPUT}
3123            }
3124        ""
3125    end
3126
3127    case argument_eval_order_2
3128        version 300 es
3129        values
3130        {
3131            input int in0 = [ 0 | -1 | 3 | 5 ];
3132            output int out0 = [ 3 | -1 | 9 | 13 ];
3133        }
3134
3135        both ""
3136            #version 300 es
3137            precision highp float;
3138            ${DECLARATIONS}
3139
3140            int g;
3141
3142            int modG (int v)
3143            {
3144                g += v;
3145                return v;
3146            }
3147
3148            int func (float a, int b, bool c, int d)
3149            {
3150                if (c)
3151                    return b + int(a) + d;
3152                else
3153                    return -1;
3154            }
3155
3156            void main ()
3157            {
3158                ${SETUP}
3159                out0 = func(float(g = in0), modG(2), --g > 0, g);
3160                ${OUTPUT}
3161            }
3162        ""
3163    end
3164
3165end # misc
3166
3167group invalid "Invalid Functions"
3168    case break_in_body
3169        version 300 es
3170        expect compile_fail
3171        both ""
3172            #version 300 es
3173            precision mediump float;
3174            ${DECLARATIONS}
3175
3176            void func ()
3177            {
3178                break;
3179            }
3180
3181            void main ()
3182            {
3183                ${POSITION_FRAG_COLOR} = vec4(1.0);
3184            }
3185        ""
3186    end
3187
3188    case continue_in_body
3189        version 300 es
3190        expect compile_fail
3191        both ""
3192            #version 300 es
3193            precision mediump float;
3194            ${DECLARATIONS}
3195
3196            void func ()
3197            {
3198                continue;
3199            }
3200
3201            void main ()
3202            {
3203                ${POSITION_FRAG_COLOR} = vec4(1.0);
3204            }
3205        ""
3206    end
3207
3208    case return_value_from_void_function
3209        version 300 es
3210        expect compile_fail
3211        both ""
3212            #version 300 es
3213            precision mediump float;
3214            ${DECLARATIONS}
3215
3216            void func ()
3217            {
3218                return 1.0;
3219            }
3220
3221            void main ()
3222            {
3223                ${POSITION_FRAG_COLOR} = vec4(1.0);
3224            }
3225        ""
3226    end
3227
3228    case extra_arguments
3229        version 300 es
3230        expect compile_fail
3231        both ""
3232            #version 300 es
3233            precision mediump float;
3234            ${DECLARATIONS}
3235
3236            void func (float f)
3237            {
3238            }
3239
3240            void main ()
3241            {
3242                func(1.0, 2.0);
3243                ${POSITION_FRAG_COLOR} = vec4(1.0);
3244            }
3245        ""
3246    end
3247
3248    case missing_arguments
3249        version 300 es
3250        expect compile_fail
3251        both ""
3252            #version 300 es
3253            precision mediump float;
3254            ${DECLARATIONS}
3255
3256            void func (float f)
3257            {
3258            }
3259
3260            void main ()
3261            {
3262                func();
3263                ${POSITION_FRAG_COLOR} = vec4(1.0);
3264            }
3265        ""
3266    end
3267
3268    case missing_argument_type
3269        version 300 es
3270        expect compile_fail
3271        both ""
3272            #version 300 es
3273            precision mediump float;
3274            ${DECLARATIONS}
3275
3276            void func (in f)
3277            {
3278            }
3279
3280            void main ()
3281            {
3282                ${POSITION_FRAG_COLOR} = vec4(1.0);
3283            }
3284        ""
3285    end
3286
3287    case argument_basetype_mismatch
3288        version 300 es
3289        expect compile_fail
3290        both ""
3291            #version 300 es
3292            precision mediump float;
3293            precision mediump int;
3294            ${DECLARATIONS}
3295
3296            void func (float f)
3297            {
3298            }
3299
3300            void main ()
3301            {
3302                func(2);
3303                ${POSITION_FRAG_COLOR} = vec4(1.0);
3304            }
3305        ""
3306    end
3307
3308    case argument_scalar_vector_mismatch
3309        version 300 es
3310        expect compile_fail
3311        both ""
3312            #version 300 es
3313            precision mediump float;
3314            ${DECLARATIONS}
3315
3316            void func (vec2 f)
3317            {
3318            }
3319
3320            void main ()
3321            {
3322                func(2.0);
3323                ${POSITION_FRAG_COLOR} = vec4(1.0);
3324            }
3325        ""
3326    end
3327
3328    case argument_vector_size_mismatch
3329        version 300 es
3330        expect compile_fail
3331        both ""
3332            #version 300 es
3333            precision mediump float;
3334            ${DECLARATIONS}
3335
3336            void func (vec3 f)
3337            {
3338            }
3339
3340            void main ()
3341            {
3342                func(vec2(2.0));
3343                ${POSITION_FRAG_COLOR} = vec4(1.0);
3344            }
3345        ""
3346    end
3347
3348    case duplicate_function
3349        version 300 es
3350        expect compile_fail
3351        both ""
3352            #version 300 es
3353            precision mediump float;
3354            ${DECLARATIONS}
3355
3356            void func (vec3 f);
3357
3358            void func (vec3 f)
3359            {
3360            }
3361
3362            void func (vec3 f)
3363            {
3364            }
3365
3366            void main ()
3367            {
3368                ${POSITION_FRAG_COLOR} = vec4(1.0);
3369            }
3370        ""
3371    end
3372
3373    case prototype_mismatch_return_type
3374        version 300 es
3375        expect compile_fail
3376        both ""
3377            #version 300 es
3378            precision mediump float;
3379            ${DECLARATIONS}
3380
3381            void func (vec3 f);
3382
3383            void main ()
3384            {
3385                ${POSITION_FRAG_COLOR} = vec4(1.0);
3386            }
3387
3388            float func (vec3 f)
3389            {
3390                return f.x;
3391            }
3392        ""
3393    end
3394
3395    case prototype_unspecified_array_size
3396        version 300 es
3397        expect compile_fail
3398        both ""
3399            #version 300 es
3400            precision mediump float;
3401            ${DECLARATIONS}
3402
3403            void func (vec3 f[]);
3404
3405            void main ()
3406            {
3407                ${POSITION_FRAG_COLOR} = vec4(1.0);
3408            }
3409        ""
3410    end
3411
3412    case call_mismatch_argument_array_size
3413        version 300 es
3414        expect compile_fail
3415        both ""
3416            #version 300 es
3417            precision mediump float;
3418            ${DECLARATIONS}
3419
3420            void func (vec3 f[3]);
3421            void func (vec3 f[3])
3422            {
3423            }
3424
3425            void main ()
3426            {
3427                vec3 array[4];
3428                func(array);
3429                ${POSITION_FRAG_COLOR} = vec4(1.0);
3430            }
3431        ""
3432    end
3433
3434    case prototype_mismatch_argument_const
3435        version 300 es
3436        expect compile_fail
3437        both ""
3438            #version 300 es
3439            precision mediump float;
3440            ${DECLARATIONS}
3441
3442            void func (vec3 f);
3443            void func (const vec3 f)
3444            {
3445            }
3446
3447            void main ()
3448            {
3449                ${POSITION_FRAG_COLOR} = vec4(1.0);
3450            }
3451        ""
3452    end
3453
3454    case prototype_mismatch_argument_array_const
3455        version 300 es
3456        expect compile_fail
3457        both ""
3458            #version 300 es
3459            precision mediump float;
3460            ${DECLARATIONS}
3461
3462            void func (vec3 f[3]);
3463            void func (const vec3 f[3])
3464            {
3465            }
3466
3467            void main ()
3468            {
3469                ${POSITION_FRAG_COLOR} = vec4(1.0);
3470            }
3471        ""
3472    end
3473
3474    case prototype_mismatch_array_inout
3475        version 300 es
3476        expect compile_fail
3477        both ""
3478            #version 300 es
3479            precision mediump float;
3480            ${DECLARATIONS}
3481
3482            void func (out vec3 f);
3483            void func (inout vec3 f)
3484            {
3485            }
3486
3487            void main ()
3488            {
3489                ${POSITION_FRAG_COLOR} = vec4(1.0);
3490            }
3491        ""
3492    end
3493
3494    case missing_return_type
3495        version 300 es
3496        expect compile_fail
3497        both ""
3498            #version 300 es
3499            precision mediump float;
3500            ${DECLARATIONS}
3501
3502            func (float f);
3503            func (inout vec3 f[3])
3504            {
3505            }
3506
3507            void main ()
3508            {
3509                ${POSITION_FRAG_COLOR} = vec4(1.0);
3510            }
3511        ""
3512    end
3513
3514    case call_before_definition
3515        version 300 es
3516        expect compile_fail
3517        both ""
3518            #version 300 es
3519            precision mediump float;
3520            ${DECLARATIONS}
3521
3522            void main ()
3523            {
3524                func(1.0);
3525                ${POSITION_FRAG_COLOR} = vec4(1.0);
3526            }
3527
3528            void func (float f)
3529            {
3530            }
3531
3532        ""
3533    end
3534
3535    case argument_precision_overload
3536        version 300 es
3537        expect compile_fail
3538        both ""
3539            #version 300 es
3540            precision mediump float;
3541            ${DECLARATIONS}
3542
3543            float func (lowp float f)
3544            {
3545                return f;
3546            }
3547
3548            float func (mediump float f)
3549            {
3550                return f;
3551            }
3552
3553            void main ()
3554            {
3555                ${POSITION_FRAG_COLOR} = vec4(1.0);
3556            }
3557        ""
3558    end
3559
3560    case argument_in_out_overload
3561        version 300 es
3562        expect compile_fail
3563        both ""
3564            #version 300 es
3565            precision mediump float;
3566            ${DECLARATIONS}
3567
3568            void func (in float f)
3569            {
3570            }
3571
3572            void func (out float f)
3573            {
3574                f = 1.0;
3575            }
3576
3577            void main ()
3578            {
3579                ${POSITION_FRAG_COLOR} = vec4(1.0);
3580            }
3581        ""
3582    end
3583
3584    case argument_in_inout_overload
3585        version 300 es
3586        expect compile_fail
3587        both ""
3588            #version 300 es
3589            precision mediump float;
3590            ${DECLARATIONS}
3591
3592            void func (in float f)
3593            {
3594            }
3595
3596            void func (inout float f)
3597            {
3598                f = -f;
3599            }
3600
3601            void main ()
3602            {
3603                ${POSITION_FRAG_COLOR} = vec4(1.0);
3604            }
3605        ""
3606    end
3607
3608    case argument_out_inout_overload
3609        version 300 es
3610        expect compile_fail
3611        both ""
3612            #version 300 es
3613            precision mediump float;
3614            ${DECLARATIONS}
3615
3616            void func (out float f)
3617            {
3618                f = -1.0;
3619            }
3620
3621            void func (inout float f)
3622            {
3623                f = -f;
3624            }
3625
3626            void main ()
3627            {
3628                ${POSITION_FRAG_COLOR} = vec4(1.0);
3629            }
3630        ""
3631    end
3632
3633    case return_type_overload
3634        version 300 es
3635        expect compile_fail
3636        both ""
3637            #version 300 es
3638            precision mediump float;
3639            ${DECLARATIONS}
3640
3641            float func (float f)
3642            {
3643                return f;
3644            }
3645
3646            int func (float f)
3647            {
3648                return int(f);
3649            }
3650
3651            void main ()
3652            {
3653                ${POSITION_FRAG_COLOR} = vec4(1.0);
3654            }
3655        ""
3656    end
3657
3658    case return_type_precision_overload
3659        version 300 es
3660        expect compile_fail
3661        both ""
3662            #version 300 es
3663            precision mediump float;
3664            ${DECLARATIONS}
3665
3666            lowp float func (float f)
3667            {
3668                return f;
3669            }
3670
3671            mediump float func (float f)
3672            {
3673                return f;
3674            }
3675
3676            void main ()
3677            {
3678                ${POSITION_FRAG_COLOR} = vec4(1.0);
3679            }
3680        ""
3681    end
3682
3683    case return_type_const_overload
3684        version 300 es
3685        expect compile_fail
3686        both ""
3687            #version 300 es
3688            precision mediump float;
3689            ${DECLARATIONS}
3690
3691            float func (float f)
3692            {
3693                return f;
3694            }
3695
3696            const float func (float f)
3697            {
3698                return f;
3699            }
3700
3701            void main ()
3702            {
3703                ${POSITION_FRAG_COLOR} = vec4(1.0);
3704            }
3705        ""
3706    end
3707
3708    case return_without_value
3709        version 300 es
3710        expect compile_fail
3711        both ""
3712            #version 300 es
3713            precision mediump float;
3714            ${DECLARATIONS}
3715
3716            float func (float f)
3717            {
3718                return;
3719                return 1.0;
3720            }
3721
3722            void main ()
3723            {
3724                ${POSITION_FRAG_COLOR} = vec4(1.0);
3725            }
3726        ""
3727    end
3728
3729    case local_function_prototype
3730        version 300 es
3731        expect compile_fail
3732        both ""
3733            #version 300 es
3734            precision mediump float;
3735            ${DECLARATIONS}
3736
3737            void main ()
3738            {
3739                float func (float f);
3740
3741                ${POSITION_FRAG_COLOR} = vec4(1.0);
3742            }
3743        ""
3744    end
3745
3746    case local_function_definition
3747        version 300 es
3748        expect compile_fail
3749        both ""
3750            #version 300 es
3751            precision mediump float;
3752            ${DECLARATIONS}
3753
3754            void main ()
3755            {
3756                float func (float f)
3757                {
3758                    return 1.0;
3759                }
3760
3761                ${POSITION_FRAG_COLOR} = vec4(1.0);
3762            }
3763        ""
3764    end
3765
3766    case name_type_conflict
3767        version 300 es
3768        expect compile_fail
3769        both ""
3770            #version 300 es
3771            precision mediump float;
3772            ${DECLARATIONS}
3773
3774            struct foo { float a; }
3775
3776            float foo (float f)
3777            {
3778                return 1.0;
3779            }
3780
3781            void main ()
3782            {
3783                ${POSITION_FRAG_COLOR} = vec4(1.0);
3784            }
3785        ""
3786    end
3787
3788    case const_overload
3789        version 300 es
3790        expect compile_fail
3791        both ""
3792            #version 300 es
3793            precision mediump float;
3794            ${DECLARATIONS}
3795
3796            void func (vec3 f)
3797            {
3798            }
3799
3800            void func (const vec3 f)
3801            {
3802            }
3803
3804            void main ()
3805            {
3806                ${POSITION_FRAG_COLOR} = vec4(1.0);
3807            }
3808        ""
3809    end
3810
3811    case uniform_local
3812        version 300 es
3813        expect compile_fail
3814        both ""
3815            #version 300 es
3816            precision mediump float;
3817            ${DECLARATIONS}
3818
3819            void func (vec3 f)
3820            {
3821                uniform float u;
3822            }
3823
3824            void main ()
3825            {
3826                ${POSITION_FRAG_COLOR} = vec4(1.0);
3827            }
3828        ""
3829    end
3830
3831    case in_local
3832        version 300 es
3833        expect compile_fail
3834        both ""
3835            #version 300 es
3836            precision mediump float;
3837            ${DECLARATIONS}
3838
3839            void func (vec3 f)
3840            {
3841                in float v;
3842            }
3843
3844            void main ()
3845            {
3846                ${POSITION_FRAG_COLOR} = vec4(1.0);
3847            }
3848        ""
3849    end
3850
3851    case out_local
3852        version 300 es
3853        expect compile_fail
3854        both ""
3855            #version 300 es
3856            precision mediump float;
3857            ${DECLARATIONS}
3858
3859            void func (vec3 f)
3860            {
3861                in float a;
3862            }
3863
3864            void main ()
3865            {
3866                ${POSITION_FRAG_COLOR} = vec4(1.0);
3867            }
3868        ""
3869    end
3870
3871    case inout_local
3872        version 300 es
3873        expect compile_fail
3874        both ""
3875            #version 300 es
3876            precision mediump float;
3877            ${DECLARATIONS}
3878
3879            void func (vec3 f)
3880            {
3881                inout float a;
3882            }
3883
3884            void main ()
3885            {
3886                ${POSITION_FRAG_COLOR} = vec4(1.0);
3887            }
3888        ""
3889    end
3890
3891    case uniform_argument
3892        version 300 es
3893        expect compile_fail
3894        both ""
3895            #version 300 es
3896            precision mediump float;
3897            ${DECLARATIONS}
3898
3899            void func (uniform vec3 f)
3900            {
3901            }
3902
3903            void main ()
3904            {
3905                ${POSITION_FRAG_COLOR} = vec4(1.0);
3906            }
3907        ""
3908    end
3909
3910    case uniform_return_type
3911        version 300 es
3912        expect compile_fail
3913        both ""
3914            #version 300 es
3915            precision mediump float;
3916            ${DECLARATIONS}
3917
3918            uniform float func (vec3 f)
3919            {
3920                return f.x;
3921            }
3922
3923            void main ()
3924            {
3925                ${POSITION_FRAG_COLOR} = vec4(1.0);
3926            }
3927        ""
3928    end
3929
3930    case in_return_type
3931        version 300 es
3932        expect compile_fail
3933        both ""
3934            #version 300 es
3935            precision mediump float;
3936            ${DECLARATIONS}
3937
3938            in float func (vec3 f)
3939            {
3940                return f.x;
3941            }
3942
3943            void main ()
3944            {
3945                ${POSITION_FRAG_COLOR} = vec4(func(vec3(1.0)));
3946            }
3947        ""
3948    end
3949
3950    case out_return_type
3951        version 300 es
3952        expect compile_fail
3953        both ""
3954            #version 300 es
3955            precision mediump float;
3956            ${DECLARATIONS}
3957
3958            out float func (vec3 f)
3959            {
3960                return f.x;
3961            }
3962
3963            void main ()
3964            {
3965                ${POSITION_FRAG_COLOR} = vec4(func(vec3(1.0)));
3966            }
3967        ""
3968    end
3969
3970    case inout_return_type
3971        version 300 es
3972        expect compile_fail
3973        both ""
3974            #version 300 es
3975            precision mediump float;
3976            ${DECLARATIONS}
3977
3978            inout float func (vec3 f)
3979            {
3980                return f.x;
3981            }
3982
3983            void main ()
3984            {
3985                ${POSITION_FRAG_COLOR} = vec4(func(vec3(1.0)));
3986            }
3987        ""
3988    end
3989
3990    case main_invalid_return_type
3991        version 300 es
3992        expect compile_fail
3993        both ""
3994            #version 300 es
3995            precision mediump float;
3996            ${DECLARATIONS}
3997
3998            float main ()
3999            {
4000                ${POSITION_FRAG_COLOR} = vec4(1.0);
4001            }
4002        ""
4003    end
4004
4005    case main_has_arguments
4006        version 300 es
4007        expect compile_fail
4008        both ""
4009            #version 300 es
4010            precision mediump float;
4011            ${DECLARATIONS}
4012
4013            void main (float f)
4014            {
4015                ${POSITION_FRAG_COLOR} = vec4(1.0);
4016            }
4017        ""
4018    end
4019
4020    case main_missing_return_type
4021        version 300 es
4022        expect compile_fail
4023        both ""
4024            #version 300 es
4025            precision mediump float;
4026            ${DECLARATIONS}
4027
4028            main ()
4029            {
4030                ${POSITION_FRAG_COLOR} = vec4(1.0);
4031            }
4032        ""
4033    end
4034
4035    case write_const_arg
4036        version 300 es
4037        expect compile_fail
4038        both ""
4039            #version 300 es
4040            precision mediump float;
4041            ${DECLARATIONS}
4042
4043            float func (const float f)
4044            {
4045                f = 1.0;
4046            }
4047
4048            void main ()
4049            {
4050                ${POSITION_FRAG_COLOR} = vec4(1.0);
4051            }
4052        ""
4053    end
4054
4055    case write_const_array_arg
4056        version 300 es
4057        expect compile_fail
4058        both ""
4059            #version 300 es
4060            precision mediump float;
4061            ${DECLARATIONS}
4062
4063            float func (const float f[3])
4064            {
4065                f[0] = 1.0;
4066            }
4067
4068            void main ()
4069            {
4070                ${POSITION_FRAG_COLOR} = vec4(1.0);
4071            }
4072        ""
4073    end
4074
4075    case use_const_arg_in_const_expr
4076        version 300 es
4077        expect compile_fail
4078        both ""
4079            #version 300 es
4080            precision mediump float;
4081            ${DECLARATIONS}
4082
4083            float func (const int i)
4084            {
4085                const int z = i+1;
4086                return float(z);
4087            }
4088
4089            void main ()
4090            {
4091                ${POSITION_FRAG_COLOR} = vec4(func(1));
4092            }
4093        ""
4094    end
4095
4096    case use_const_arg_as_array_size
4097        version 300 es
4098        expect compile_fail
4099        both ""
4100            #version 300 es
4101            precision mediump float;
4102            ${DECLARATIONS}
4103
4104            float func (const int i)
4105            {
4106                float f[i];
4107                f[0] = 1.0;
4108                return f[0];
4109            }
4110
4111            void main ()
4112            {
4113                ${POSITION_FRAG_COLOR} = vec4(func(1));
4114            }
4115        ""
4116    end
4117
4118    case overload_builtin_function
4119        version 300 es
4120        expect compile_fail
4121        both ""
4122            #version 300 es
4123            precision mediump float;
4124            ${DECLARATIONS}
4125
4126            int sin (int x)
4127            {
4128                return int(sin(float(x)));
4129            }
4130
4131            void main ()
4132            {
4133                ${POSITION_FRAG_COLOR} = vec4(sin(1));
4134            }
4135        ""
4136    end
4137
4138    case redefine_builtin_function
4139        version 300 es
4140        expect compile_fail
4141        both ""
4142            #version 300 es
4143            precision mediump float;
4144            ${DECLARATIONS}
4145
4146            float sin (float x)
4147            {
4148                return 0.0;
4149            }
4150
4151            void main ()
4152            {
4153                ${POSITION_FRAG_COLOR} = vec4(sin(1.0));
4154            }
4155        ""
4156    end
4157
4158    case basic_recursion
4159        version 300 es
4160        expect compile_fail
4161        both ""
4162            #version 300 es
4163            precision mediump float;
4164            ${DECLARATIONS}
4165
4166            float fib (float x)
4167            {
4168                if (x <= 1.0)
4169                    return x;
4170                else
4171                    return fib(x-2.0) + fib(x-1.0);
4172            }
4173
4174            void main ()
4175            {
4176                ${POSITION_FRAG_COLOR} = vec4(fib(5.0));
4177            }
4178        ""
4179    end
4180
4181    case simple_tail_recursion
4182        version 300 es
4183        expect compile_fail
4184        both ""
4185            #version 300 es
4186            precision mediump float;
4187            ${DECLARATIONS}
4188
4189            float rec (float x)
4190            {
4191                if (x <= 0.0)
4192                    return 0.0;
4193                else
4194                    return rec(x-1.0);
4195            }
4196
4197            void main ()
4198            {
4199                ${POSITION_FRAG_COLOR} = vec4(rec(5.0));
4200            }
4201        ""
4202    end
4203
4204    case dynamic_conditional_recursion
4205        version 300 es
4206        expect compile_fail
4207        both ""
4208            #version 300 es
4209            precision mediump float;
4210            ${DECLARATIONS}
4211            uniform float ua;
4212            uniform float ub;
4213
4214            float funcA (float x);
4215            float funcB (float x);
4216
4217            float funcA (float x)
4218            {
4219                if (ub+x > 0.0)
4220                    funcB(x*2.0);
4221                else
4222                    return ub;
4223            }
4224
4225            float funcB (float x)
4226            {
4227                return sqrt(funcA(x));
4228            }
4229
4230            void main ()
4231            {
4232                ${POSITION_FRAG_COLOR} = vec4(funcB(ua));
4233            }
4234        ""
4235    end
4236
4237    case dynamic_loop_recursion
4238        version 300 es
4239        expect compile_fail
4240        both ""
4241            #version 300 es
4242            precision mediump float;
4243            ${DECLARATIONS}
4244            uniform float ua;
4245            uniform float ub;
4246
4247            float funcA (float x);
4248            float funcB (float x);
4249
4250            float funcA (float x)
4251            {
4252                for (float z = 0.0; z < ub+x; z++)
4253                {
4254                    if (z > 2.0)
4255                        funcB(z*2.0);
4256                    else
4257                        return z;
4258                }
4259            }
4260
4261            float funcB (float x)
4262            {
4263                return sqrt(funcA(x));
4264            }
4265
4266            void main ()
4267            {
4268                ${POSITION_FRAG_COLOR} = vec4(funcB(ua));
4269            }
4270        ""
4271    end
4272
4273    case dynamic_switch_recursion
4274        version 300 es
4275        expect compile_fail
4276        both ""
4277            #version 300 es
4278            precision mediump float;
4279            ${DECLARATIONS}
4280            uniform float ua;
4281            uniform mediump int ub;
4282
4283            float funcA (float x);
4284            float funcB (float x);
4285
4286            float funcA (float x)
4287            {
4288                switch (ub + int(x))
4289                {
4290                    case 0: return ua-1.0;
4291                    case 1: return ua;
4292                    case 2: return funcB(x*2.0);
4293                    default: return 0.0;
4294                }
4295            }
4296
4297            float funcB (float x)
4298            {
4299                return sqrt(funcA(x));
4300            }
4301
4302            void main ()
4303            {
4304                ${POSITION_FRAG_COLOR} = vec4(funcB(ua));
4305            }
4306        ""
4307    end
4308
4309    case modify_const_arg
4310        version 300 es
4311        expect compile_fail
4312        both ""
4313            #version 300 es
4314            precision mediump float;
4315            precision mediump int;
4316            ${DECLARATIONS}
4317
4318            int func (const int a)
4319            {
4320                a = -a;
4321                return 2 * a;
4322            }
4323
4324            void main()
4325            {
4326                ${POSITION_FRAG_COLOR} = vec4(func(3));
4327            }
4328        ""
4329    end
4330
4331    case init_const_local_from_const_arg
4332        version 300 es
4333        expect compile_fail
4334        both ""
4335            #version 300 es
4336            precision mediump float;
4337            precision mediump int;
4338            ${DECLARATIONS}
4339
4340            int func (const int a)
4341            {
4342                const int b = -a;
4343                return 2 * b;
4344            }
4345
4346            void main()
4347            {
4348                ${POSITION_FRAG_COLOR} = vec4(func(3));
4349            }
4350        ""
4351    end
4352
4353    case array_size_from_const_arg
4354        version 300 es
4355        expect compile_fail
4356        both ""
4357            #version 300 es
4358            precision mediump float;
4359            precision mediump int;
4360            ${DECLARATIONS}
4361
4362            int func (const int a)
4363            {
4364                int arr[a];
4365                arr[1] = 3;
4366                return arr[1];
4367            }
4368
4369            void main()
4370            {
4371                ${POSITION_FRAG_COLOR} = vec4(func(3));
4372            }
4373        ""
4374    end
4375
4376end # invalid
4377