xref: /aosp_15_r20/external/deqp/data/gles2/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        values
14        {
15            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
16            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
17        }
18
19        both ""
20            precision mediump float;
21            ${DECLARATIONS}
22
23            float func (float a)
24            {
25                return -a;
26            }
27
28            void main()
29            {
30                out0 = func(in0);
31                ${OUTPUT}
32            }
33        ""
34    end
35
36    case float_vec2
37        values
38        {
39            input vec2 in0 = [ vec2(0.0, 1.0) | vec2(2.0, 2.5) ];
40            output float out0 = [ -1.0 | -4.5 ];
41        }
42
43        both ""
44            precision mediump float;
45            ${DECLARATIONS}
46
47            float func (vec2 a)
48            {
49                return -(a.x + a.y);
50            }
51
52            void main()
53            {
54                out0 = func(in0);
55                ${OUTPUT}
56            }
57        ""
58    end
59
60    case float_vec3
61        values
62        {
63            input vec3 in0 = [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
64            output float out0 = [ 1.0 | -0.5 ];
65        }
66
67        both ""
68            precision mediump float;
69            ${DECLARATIONS}
70
71            float func (vec3 a)
72            {
73                return -(a.x + a.y + a.z);
74            }
75
76            void main()
77            {
78                out0 = func(in0);
79                ${OUTPUT}
80            }
81        ""
82    end
83
84    case float_vec4
85        values
86        {
87            input vec4 in0 = [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
88            output float out0 = [ 0.5 | -1.5 ];
89        }
90
91        both ""
92            precision mediump float;
93            ${DECLARATIONS}
94
95            float func (vec4 a)
96            {
97                return -(a.x + a.y + a.z + a.w);
98            }
99
100            void main()
101            {
102                out0 = func(in0);
103                ${OUTPUT}
104            }
105        ""
106    end
107
108    case float_mat2
109        values
110        {
111            input mat2 in0 = [ mat2(0.0, 1.0, -2.0, 0.5) | mat2(2.0, 2.5, 4.0, -7.0) ];
112            output float out0 = [ 0.5 | -1.5 ];
113        }
114
115        both ""
116            precision mediump float;
117            ${DECLARATIONS}
118
119            float func (mat2 a)
120            {
121                return -(a[0][0] + a[0][1] + a[1][0] + a[1][1]);
122            }
123
124            void main()
125            {
126                out0 = func(in0);
127                ${OUTPUT}
128            }
129        ""
130    end
131
132    case float_mat3
133        values
134        {
135            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) ];
136            output float out0 = [ -4.5 | -5.0 ];
137        }
138
139        both ""
140            precision mediump float;
141            ${DECLARATIONS}
142
143            float func (mat3 a)
144            {
145                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]);
146            }
147
148            void main()
149            {
150                out0 = func(in0);
151                ${OUTPUT}
152            }
153        ""
154    end
155
156    case float_mat4
157        values
158        {
159            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) ];
160            output float out0 = [ -5.5 | -9.0 ];
161        }
162
163        both ""
164            precision mediump float;
165            ${DECLARATIONS}
166
167            float func (mat4 a)
168            {
169                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]);
170            }
171
172            void main()
173            {
174                out0 = func(in0);
175                ${OUTPUT}
176            }
177        ""
178    end
179
180    case int_int
181        values
182        {
183            input int in0 = [ -1 | 0 | 1 | 4 ];
184            output int out0 = [ 1 | 0 | -1 | -4 ];
185        }
186
187        both ""
188            precision mediump float;
189            precision mediump int;
190            ${DECLARATIONS}
191
192            int func (int a)
193            {
194                return -a;
195            }
196
197            void main()
198            {
199                ${SETUP}
200                out0 = func(in0);
201                ${OUTPUT}
202            }
203        ""
204    end
205
206    case int_ivec2
207        values
208        {
209            input ivec2 in0 = [ ivec2(-1, 0) | ivec2(1, 4) ];
210            output int out0 = [ 1 | -5 ];
211        }
212
213        both ""
214            precision mediump float;
215            precision mediump int;
216            ${DECLARATIONS}
217
218            int func (ivec2 a)
219            {
220                return -(a.x + a.y);
221            }
222
223            void main()
224            {
225                ${SETUP}
226                out0 = func(in0);
227                ${OUTPUT}
228            }
229        ""
230    end
231
232    case int_ivec3
233        values
234        {
235            input ivec3 in0 = [ ivec3(-1, 0, 2) | ivec3(1, 4, -8) ];
236            output int out0 = [ -1 | 3 ];
237        }
238
239        both ""
240            precision mediump float;
241            precision mediump int;
242            ${DECLARATIONS}
243
244            int func (ivec3 a)
245            {
246                return -(a.x + a.y + a.z);
247            }
248
249            void main()
250            {
251                ${SETUP}
252                out0 = func(in0);
253                ${OUTPUT}
254            }
255        ""
256    end
257
258    case int_ivec4
259        values
260        {
261            input ivec4 in0 = [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
262            output int out0 = [ -3 | 1 ];
263        }
264
265        both ""
266            precision mediump float;
267            precision mediump int;
268            ${DECLARATIONS}
269
270            int func (ivec4 a)
271            {
272                return -(a.x + a.y + a.z + a.w);
273            }
274
275            void main()
276            {
277                ${SETUP}
278                out0 = func(in0);
279                ${OUTPUT}
280            }
281        ""
282    end
283
284    case bool_bool
285        values
286        {
287            input bool in0 = [ true | false ];
288            output bool out0 = [ false | true ];
289        }
290
291        both ""
292            precision mediump float;
293            ${DECLARATIONS}
294
295            bool func (bool a)
296            {
297                return !a;
298            }
299
300            void main()
301            {
302                ${SETUP}
303                out0 = func(in0);
304                ${OUTPUT}
305            }
306        ""
307    end
308
309    case bool_bvec2
310        values
311        {
312            input bvec2 in0 = [ bvec2(true, true) | bvec2(false, true) ];
313            output bool out0 = [ false | true ];
314        }
315
316        both ""
317            precision mediump float;
318            ${DECLARATIONS}
319
320            bool func (bvec2 a)
321            {
322                return !(a.x == a.y);
323            }
324
325            void main()
326            {
327                ${SETUP}
328                out0 = func(in0);
329                ${OUTPUT}
330            }
331        ""
332    end
333
334    case bool_bvec3
335        values
336        {
337            input bvec3 in0 = [ bvec3(true, true, false) | bvec3(true, false, false) ];
338            output bool out0 = [ false | true ];
339        }
340
341        both ""
342            precision mediump float;
343            ${DECLARATIONS}
344
345            bool func (bvec3 a)
346            {
347                return (a.x == a.y) == a.z;
348            }
349
350            void main()
351            {
352                ${SETUP}
353                out0 = func(in0);
354                ${OUTPUT}
355            }
356        ""
357    end
358
359    case bool_bvec4
360        values
361        {
362            input bvec4 in0 = [ bvec4(true, true, true, false) | bvec4(false, false, true, true) | bvec4(true, false, false, true) ];
363            output bool out0 = [ false | true | true ];
364        }
365
366        both ""
367            precision mediump float;
368            ${DECLARATIONS}
369
370            bool func (bvec4 a)
371            {
372                return ((a.x == a.y) == (a.z == a.w));
373            }
374
375            void main()
376            {
377                ${SETUP}
378                out0 = func(in0);
379                ${OUTPUT}
380            }
381        ""
382    end
383
384    case mat2
385        values
386        {
387            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) ];
388            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) ];
389        }
390
391        both ""
392            precision mediump float;
393            ${DECLARATIONS}
394
395            mat2 func (mat2 a)
396            {
397                return -2.0*a;
398            }
399
400            void main()
401            {
402                ${SETUP}
403                out0 = func(in0);
404                ${OUTPUT}
405            }
406        ""
407    end
408
409
410    case mat3
411        values
412        {
413            input mat3 in0 = [ mat3(2.5, 0.0, 1.0, -2.5, 1.0, 3.0, 0.0, 2.0, 1.5) | mat3(-3.5, 2.0, 0.5, -1.5, -3.5, 2.5, 0.0, 1.5, 3.0) | mat3(1.5, 3.0, -1.0, 2.5, -0.5, 3.5, 3.0, -3.0, -2.5) ];
414            output mat3 out0 = [ mat3(-5.0, -0.0, -2.0, 5.0, -2.0, -6.0, -0.0, -4.0, -3.0) | mat3(7.0, -4.0, -1.0, 3.0, 7.0, -5.0, -0.0, -3.0, -6.0) | mat3(-3.0, -6.0, 2.0, -5.0, 1.0, -7.0, -6.0, 6.0, 5.0) ];
415        }
416
417        both ""
418            precision mediump float;
419            ${DECLARATIONS}
420
421            mat3 func (mat3 a)
422            {
423                return -2.0*a;
424            }
425
426            void main()
427            {
428                ${SETUP}
429                out0 = func(in0);
430                ${OUTPUT}
431            }
432        ""
433    end
434
435
436    case mat4
437        values
438        {
439            input mat4 in0 = [ mat4(-2.0, 3.5, -0.5, 1.0, -1.5, 0.0, -1.0, -1.0, 0.5, 0.5, 3.0, 1.5, 3.0, 2.5, 3.5, 1.5) | mat4(-2.5, 2.5, 3.5, 3.0, 0.5, 1.5, -2.0, 2.5, 0.5, -1.5, -3.5, 2.5, 3.5, -3.0, 2.5, -0.5) | mat4(-2.5, -1.5, 2.0, 3.0, -3.5, 1.0, -3.5, 1.5, -1.5, 3.0, 3.5, 0.0, 3.5, -1.5, -3.0, 0.5) ];
440            output mat4 out0 = [ mat4(4.0, -7.0, 1.0, -2.0, 3.0, -0.0, 2.0, 2.0, -1.0, -1.0, -6.0, -3.0, -6.0, -5.0, -7.0, -3.0) | mat4(5.0, -5.0, -7.0, -6.0, -1.0, -3.0, 4.0, -5.0, -1.0, 3.0, 7.0, -5.0, -7.0, 6.0, -5.0, 1.0) | mat4(5.0, 3.0, -4.0, -6.0, 7.0, -2.0, 7.0, -3.0, 3.0, -6.0, -7.0, -0.0, -7.0, 3.0, 6.0, -1.0) ];
441        }
442
443        both ""
444            precision mediump float;
445            ${DECLARATIONS}
446
447            mat4 func (mat4 a)
448            {
449                return -2.0*a;
450            }
451
452            void main()
453            {
454                ${SETUP}
455                out0 = func(in0);
456                ${OUTPUT}
457            }
458        ""
459    end
460
461    case float_struct
462        values
463        {
464            input vec3 in0 = [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
465            output float out0 = [ 1.0 | -0.5 ];
466        }
467
468        both ""
469            precision mediump float;
470            ${DECLARATIONS}
471
472            struct Pos { float a, b, c; };
473
474            float func (Pos p)
475            {
476                return -(p.a + p.b + p.c);
477            }
478
479            void main()
480            {
481                Pos p = Pos(in0.x, in0.y, in0.z);
482                out0 = func(p);
483                ${OUTPUT}
484            }
485        ""
486    end
487
488    case struct_struct
489        values
490        {
491            input vec3 in0 = [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
492            output float out0 = [ 1.0 | -0.5 ];
493        }
494
495        both ""
496            precision mediump float;
497            ${DECLARATIONS}
498
499            struct Pos { float a, b, c; };
500
501            Pos func (Pos p)
502            {
503                return Pos(-p.a, -p.b, -p.c);
504            }
505
506            void main()
507            {
508                Pos p = Pos(in0.x, in0.y, in0.z);
509                p = func(p);
510                out0 = p.a + p.b + p.c;
511                ${OUTPUT}
512            }
513        ""
514    end
515
516    case struct_nested_struct
517        values
518        {
519            input vec3 in0 = [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
520            output float out0 = [ 1.0 | -0.5 ];
521        }
522
523        both ""
524            precision mediump float;
525            ${DECLARATIONS}
526
527            struct Pos { float a, b, c; };
528            struct Line { Pos start, end; };
529
530            Line func (Pos p)
531            {
532                return Line(p, Pos(-p.a, -p.b, -p.c));
533            }
534
535            float sum (Pos p)
536            {
537                return (p.a + p.b + p.c);
538            }
539
540            void main()
541            {
542                Pos p = Pos(in0.x, in0.y, in0.z);
543                Line line = func(p);
544                out0 = sum(line.start) + (2.0 * sum(line.end));
545                ${OUTPUT}
546            }
547        ""
548    end
549
550    case struct_constructor_highp_in_fragment
551        desc "passing highp vector to struct constructor in fragment shader yields all zeros"
552        vertex ""
553            ${VERTEX_DECLARATIONS}
554            void main()
555            {
556                ${VERTEX_OUTPUT}
557            }
558        ""
559        fragment ""
560            #ifdef GL_FRAGMENT_PRECISION_HIGH
561            #define PRECISION highp
562            #else
563            #define PRECISION mediump
564            #endif
565            struct Test {
566                PRECISION vec3 color;
567            } ;
568            void main() {
569                PRECISION vec3 color = vec3(0.2, 2.0, 0.1);
570                Test test = Test(color);
571                // Bias the color so all components are guaranteed > 1.0.
572                gl_FragColor = vec4(vec3(0.25, 0.55, 0.65) + vec3(4.0, 0.25, 4.0) * test.color, 1.0);
573            }
574        ""
575    end
576
577end # datatypes
578
579group qualifiers "Function Parameter Qualifiers"
580
581    case in_float
582        values
583        {
584            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
585            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
586        }
587
588        both ""
589            precision mediump float;
590            precision mediump int;
591            ${DECLARATIONS}
592
593            float func (in float a)
594            {
595                a = -a;
596                return 2.0 * a;
597            }
598
599            void main()
600            {
601                ${SETUP}
602                float f = in0;
603                float g = func(f);
604                out0 = f + g;
605                ${OUTPUT}
606            }
607        ""
608    end
609
610    case out_float
611        values
612        {
613            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
614            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
615        }
616
617        both ""
618            precision mediump float;
619            precision mediump int;
620            ${DECLARATIONS}
621
622            void func (out float a)
623            {
624                a = -1.0;
625            }
626
627            void main()
628            {
629                ${SETUP}
630                float f = 1.0;
631                func(f);
632                out0 = f * in0;
633                ${OUTPUT}
634            }
635        ""
636    end
637
638    case inout_float
639        values
640        {
641            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
642            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
643        }
644
645        both ""
646            precision mediump float;
647            precision mediump int;
648            ${DECLARATIONS}
649
650            void func (inout float a)
651            {
652                a = -a;
653            }
654
655            void main()
656            {
657                ${SETUP}
658                float f = 1.0;
659                func(f);
660                out0 = f * in0;
661                ${OUTPUT}
662            }
663        ""
664    end
665
666    case in_lowp_float
667        values
668        {
669            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
670            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
671        }
672
673        both ""
674            precision mediump float;
675            precision mediump int;
676            ${DECLARATIONS}
677
678            float func (in lowp float a)
679            {
680                a = -a;
681                return 2.0 * a;
682            }
683
684            void main()
685            {
686                ${SETUP}
687                float f = in0;
688                float g = func(f);
689                out0 = f + g;
690                ${OUTPUT}
691            }
692        ""
693    end
694
695    case out_lowp_float
696        values
697        {
698            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
699            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
700        }
701
702        both ""
703            precision mediump float;
704            precision mediump int;
705            ${DECLARATIONS}
706
707            void func (out lowp float a)
708            {
709                a = -1.0;
710            }
711
712            void main()
713            {
714                ${SETUP}
715                float f = 1.0;
716                func(f);
717                out0 = f * in0;
718                ${OUTPUT}
719            }
720        ""
721    end
722
723    case inout_lowp_float
724        values
725        {
726            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
727            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
728        }
729
730        both ""
731            precision mediump float;
732            precision mediump int;
733            ${DECLARATIONS}
734
735            void func (inout lowp float a)
736            {
737                a = -a;
738            }
739
740            void main()
741            {
742                ${SETUP}
743                float f = 1.0;
744                func(f);
745                out0 = f * in0;
746                ${OUTPUT}
747            }
748        ""
749    end
750
751    case in_highp_float
752        values
753        {
754            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
755            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
756        }
757
758        both ""
759            precision mediump float;
760            precision mediump int;
761            ${DECLARATIONS}
762
763            float func (in highp float a)
764            {
765                a = -a;
766                return 2.0 * a;
767            }
768
769            void main()
770            {
771                ${SETUP}
772                float f = in0;
773                float g = func(f);
774                out0 = f + g;
775                ${OUTPUT}
776            }
777        ""
778    end
779
780    case out_highp_float
781        values
782        {
783            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
784            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
785        }
786
787        both ""
788            precision mediump float;
789            precision mediump int;
790            ${DECLARATIONS}
791
792            void func (out highp float a)
793            {
794                a = -1.0;
795            }
796
797            void main()
798            {
799                ${SETUP}
800                float f = 1.0;
801                func(f);
802                out0 = f * in0;
803                ${OUTPUT}
804            }
805        ""
806    end
807
808    case inout_highp_float
809        values
810        {
811            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
812            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
813        }
814
815        both ""
816            precision mediump float;
817            precision mediump int;
818            ${DECLARATIONS}
819
820            void func (inout highp float a)
821            {
822                a = -a;
823            }
824
825            void main()
826            {
827                ${SETUP}
828                float f = 1.0;
829                func(f);
830                out0 = f * in0;
831                ${OUTPUT}
832            }
833        ""
834    end
835
836    case const_float
837        values
838        {
839            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
840            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
841        }
842
843        both ""
844            precision mediump float;
845            precision mediump int;
846            ${DECLARATIONS}
847
848            float func (const float a)
849            {
850                float b = -a;
851                return 2.0 * b;
852            }
853
854            void main()
855            {
856                ${SETUP}
857                float f = in0;
858                float g = func(f);
859                out0 = f + g;
860                ${OUTPUT}
861            }
862        ""
863    end
864
865    case const_in_float
866        values
867        {
868            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
869            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
870        }
871
872        both ""
873            precision mediump float;
874            precision mediump int;
875            ${DECLARATIONS}
876
877            float func (const in float a)
878            {
879                float b = -a;
880                return 2.0 * b;
881            }
882
883            void main()
884            {
885                ${SETUP}
886                float f = in0;
887                float g = func(f);
888                out0 = f + g;
889                ${OUTPUT}
890            }
891        ""
892    end
893
894    case in_int
895        values
896        {
897            input int in0 = [ 0 | 1 | -2 | 4 ];
898            output int out0 = [ 0 | -1 | 2 | -4 ];
899        }
900
901        both ""
902            precision mediump float;
903            precision mediump int;
904            ${DECLARATIONS}
905
906            int func (in int a)
907            {
908                a = -a;
909                return 2 * a;
910            }
911
912            void main()
913            {
914                ${SETUP}
915                int f = in0;
916                int g = func(f);
917                out0 = f + g;
918                ${OUTPUT}
919            }
920        ""
921    end
922
923    case out_int
924        values
925        {
926            input int in0 = [ 0 | 1 | -2 | 6 ];
927            output int out0 = [ 0 | -1 | 2 | -6 ];
928        }
929
930        both ""
931            precision mediump float;
932            precision mediump int;
933            ${DECLARATIONS}
934
935            void func (out int a)
936            {
937                a = -1;
938            }
939
940            void main()
941            {
942                ${SETUP}
943                int f = 1;
944                func(f);
945                out0 = f * in0;
946                ${OUTPUT}
947            }
948        ""
949    end
950
951    case inout_int
952        values
953        {
954            input int in0 = [ 0 | 1 | -2 | 6 ];
955            output int out0 = [ 0 | -1 | 2 | -6 ];
956        }
957
958        both ""
959            precision mediump float;
960            precision mediump int;
961            ${DECLARATIONS}
962
963            void func (inout int a)
964            {
965                a = -a;
966            }
967
968            void main()
969            {
970                ${SETUP}
971                int f = 1;
972                func(f);
973                out0 = f * in0;
974                ${OUTPUT}
975            }
976        ""
977    end
978
979    case in_lowp_int
980        values
981        {
982            input int in0 = [ 0 | 1 | -2 | 4 ];
983            output int out0 = [ 0 | -1 | 2 | -4 ];
984        }
985
986        both ""
987            precision mediump float;
988            precision mediump int;
989            ${DECLARATIONS}
990
991            int func (in lowp int a)
992            {
993                a = -a;
994                return 2 * a;
995            }
996
997            void main()
998            {
999                ${SETUP}
1000                int f = in0;
1001                int g = func(f);
1002                out0 = f + g;
1003                ${OUTPUT}
1004            }
1005        ""
1006    end
1007
1008    case out_lowp_int
1009        values
1010        {
1011            input int in0 = [ 0 | 1 | -2 | 6 ];
1012            output int out0 = [ 0 | -1 | 2 | -6 ];
1013        }
1014
1015        both ""
1016            precision mediump float;
1017            precision mediump int;
1018            ${DECLARATIONS}
1019
1020            void func (out lowp int a)
1021            {
1022                a = -1;
1023            }
1024
1025            void main()
1026            {
1027                ${SETUP}
1028                int f = 1;
1029                func(f);
1030                out0 = f * in0;
1031                ${OUTPUT}
1032            }
1033        ""
1034    end
1035
1036    case inout_lowp_int
1037        values
1038        {
1039            input int in0 = [ 0 | 1 | -2 | 6 ];
1040            output int out0 = [ 0 | -1 | 2 | -6 ];
1041        }
1042
1043        both ""
1044            precision mediump float;
1045            precision mediump int;
1046            ${DECLARATIONS}
1047
1048            void func (inout lowp int a)
1049            {
1050                a = -a;
1051            }
1052
1053            void main()
1054            {
1055                ${SETUP}
1056                int f = 1;
1057                func(f);
1058                out0 = f * in0;
1059                ${OUTPUT}
1060            }
1061        ""
1062    end
1063
1064    case in_highp_int
1065        values
1066        {
1067            input int in0 = [ 0 | 1 | -2 | 4 ];
1068            output int out0 = [ 0 | -1 | 2 | -4 ];
1069        }
1070
1071        both ""
1072            precision mediump float;
1073            precision mediump int;
1074            ${DECLARATIONS}
1075
1076            int func (in highp int a)
1077            {
1078                a = -a;
1079                return 2 * a;
1080            }
1081
1082            void main()
1083            {
1084                ${SETUP}
1085                int f = in0;
1086                int g = func(f);
1087                out0 = f + g;
1088                ${OUTPUT}
1089            }
1090        ""
1091    end
1092
1093    case out_highp_int
1094        values
1095        {
1096            input int in0 = [ 0 | 1 | -2 | 6 ];
1097            output int out0 = [ 0 | -1 | 2 | -6 ];
1098        }
1099
1100        both ""
1101            precision mediump float;
1102            precision mediump int;
1103            ${DECLARATIONS}
1104
1105            void func (out highp int a)
1106            {
1107                a = -1;
1108            }
1109
1110            void main()
1111            {
1112                ${SETUP}
1113                int f = 1;
1114                func(f);
1115                out0 = f * in0;
1116                ${OUTPUT}
1117            }
1118        ""
1119    end
1120
1121    case inout_highp_int
1122        values
1123        {
1124            input int in0 = [ 0 | 1 | -2 | 6 ];
1125            output int out0 = [ 0 | -1 | 2 | -6 ];
1126        }
1127
1128        both ""
1129            precision mediump float;
1130            precision mediump int;
1131            ${DECLARATIONS}
1132
1133            void func (inout highp int a)
1134            {
1135                a = -a;
1136            }
1137
1138            void main()
1139            {
1140                ${SETUP}
1141                int f = 1;
1142                func(f);
1143                out0 = f * in0;
1144                ${OUTPUT}
1145            }
1146        ""
1147    end
1148
1149    case const_int
1150        values
1151        {
1152            input int in0 = [ 0 | 1 | -2 | 4 ];
1153            output int out0 = [ 0 | -1 | 2 | -4 ];
1154        }
1155
1156        both ""
1157            precision mediump float;
1158            precision mediump int;
1159            ${DECLARATIONS}
1160
1161            int func (const int a)
1162            {
1163                int b = -a;
1164                return 2 * b;
1165            }
1166
1167            void main()
1168            {
1169                ${SETUP}
1170                int f = in0;
1171                int g = func(f);
1172                out0 = f + g;
1173                ${OUTPUT}
1174            }
1175        ""
1176    end
1177
1178    case const_in_int
1179        values
1180        {
1181            input int in0 = [ 0 | 1 | -2 | 4 ];
1182            output int out0 = [ 0 | -1 | 2 | -4 ];
1183        }
1184
1185        both ""
1186            precision mediump float;
1187            precision mediump int;
1188            ${DECLARATIONS}
1189
1190            int func (const in int a)
1191            {
1192                int b = -a;
1193                return 2 * b;
1194            }
1195
1196            void main()
1197            {
1198                ${SETUP}
1199                int f = in0;
1200                int g = func(f);
1201                out0 = f + g;
1202                ${OUTPUT}
1203            }
1204        ""
1205    end
1206
1207    case in_bool
1208        values
1209        {
1210            input bool in0 = [ true | false ];
1211            output bool out0 = [ true | true ];
1212        }
1213
1214        both ""
1215            precision mediump float;
1216            ${DECLARATIONS}
1217
1218            bool func (in bool a)
1219            {
1220                a = !a;
1221                return a;
1222            }
1223
1224            void main()
1225            {
1226                ${SETUP}
1227                bool f = in0;
1228                bool g = func(f);
1229                out0 = (f != g);
1230                ${OUTPUT}
1231            }
1232        ""
1233    end
1234
1235    case out_bool
1236        values
1237        {
1238            input bool in0 = [ true | false ];
1239            output bool out0 = [ false | true ];
1240        }
1241
1242        both ""
1243            precision mediump float;
1244            ${DECLARATIONS}
1245
1246            void func (out bool a)
1247            {
1248                a = false;
1249            }
1250
1251            void main()
1252            {
1253                ${SETUP}
1254                bool f = true;
1255                func(f);
1256                out0 = (in0 == f);
1257                ${OUTPUT}
1258            }
1259        ""
1260    end
1261
1262    case inout_bool
1263        values
1264        {
1265            input bool in0 = [ true | false ];
1266            output bool out0 = [ false | true ];
1267        }
1268
1269        both ""
1270            precision mediump float;
1271            ${DECLARATIONS}
1272
1273            void func (inout bool a)
1274            {
1275                a = !a;
1276            }
1277
1278            void main()
1279            {
1280                ${SETUP}
1281                bool f = true;
1282                func(f);
1283                out0 = (in0 == f);
1284                ${OUTPUT}
1285            }
1286        ""
1287    end
1288
1289end # qualifiers
1290
1291group declarations "Function Declarations"
1292
1293    case void_vs_no_void
1294        values
1295        {
1296            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1297            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1298        }
1299
1300        both ""
1301            precision mediump float;
1302            ${DECLARATIONS}
1303
1304            float func ();
1305
1306            void main()
1307            {
1308                out0 = func() * in0;
1309                ${OUTPUT}
1310            }
1311
1312            float func (void)
1313            {
1314                return -1.0;
1315            }
1316        ""
1317    end
1318
1319    case in_vs_no_in
1320        values
1321        {
1322            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1323            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1324        }
1325
1326        both ""
1327            precision mediump float;
1328            ${DECLARATIONS}
1329
1330            float func (float f);
1331
1332            void main()
1333            {
1334                out0 = func(in0);
1335                ${OUTPUT}
1336            }
1337
1338            float func (in float f)
1339            {
1340                return -f;
1341            }
1342        ""
1343    end
1344
1345    case default_vs_explicit_precision
1346        values
1347        {
1348            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1349            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1350        }
1351
1352        both ""
1353            precision mediump float;
1354            ${DECLARATIONS}
1355
1356            float func (float f);
1357
1358            void main()
1359            {
1360                out0 = func(in0);
1361                ${OUTPUT}
1362            }
1363
1364            float func (mediump float f)
1365            {
1366                return -f;
1367            }
1368        ""
1369    end
1370
1371end # declarations
1372
1373group overloading "Function Overloading"
1374
1375    case user_func_arg_type_simple
1376        values
1377        {
1378            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1379            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1380        }
1381
1382        both ""
1383            precision mediump float;
1384            precision mediump int;
1385            ${DECLARATIONS}
1386
1387            float func (float a)
1388            {
1389                return -a;
1390            }
1391
1392            int func (int a)
1393            {
1394                return -a;
1395            }
1396
1397            void main()
1398            {
1399                out0 = func(in0) * float(func(-1));
1400                ${OUTPUT}
1401            }
1402        ""
1403    end
1404
1405    case user_func_arg_float_types
1406        values
1407        {
1408            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1409            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1410        }
1411
1412        both ""
1413            precision mediump float;
1414            precision mediump int;
1415            ${DECLARATIONS}
1416
1417            float func (float a) { return -a; }
1418            vec2 func (vec2 a) { return a.yx; }
1419            vec3 func (vec3 a) { return a.xxx; }
1420            vec4 func (vec4 a) { return a.wwww; }
1421
1422            void main()
1423            {
1424                out0 = func(func(func(func(vec4(in0)).xyz).xy).x);
1425                ${OUTPUT}
1426            }
1427        ""
1428    end
1429
1430    case user_func_arg_int_types
1431        values
1432        {
1433            input int in0 = [ 0 | 1 | -2 | 6 ];
1434            output int out0 = [ 0 | -1 | 2 | -6 ];
1435        }
1436
1437        both ""
1438            precision mediump float;
1439            precision mediump int;
1440            ${DECLARATIONS}
1441
1442            int func (int a) { return -a; }
1443            ivec2 func (ivec2 a) { return a.yx; }
1444            ivec3 func (ivec3 a) { return a.xxx; }
1445            ivec4 func (ivec4 a) { return a.wwww; }
1446
1447            void main()
1448            {
1449                ${SETUP}
1450                out0 = func(func(func(func(ivec4(in0)).xyz).xy).x);
1451                ${OUTPUT}
1452            }
1453        ""
1454    end
1455
1456    case user_func_arg_bool_types
1457        values
1458        {
1459            input bool in0 = [ true | false ];
1460            output bool out0 = [ false | true ];
1461        }
1462
1463        both ""
1464            precision mediump float;
1465            ${DECLARATIONS}
1466
1467            bool func (bool a) { return !a; }
1468            bvec2 func (bvec2 a) { return a.yx; }
1469            bvec3 func (bvec3 a) { return a.xxx; }
1470            bvec4 func (bvec4 a) { return a.wwww; }
1471
1472            void main()
1473            {
1474                ${SETUP}
1475                out0 = func(func(func(func(bvec4(in0)).xyz).xy).x);
1476                ${OUTPUT}
1477            }
1478        ""
1479    end
1480
1481    case user_func_arg_basic_types
1482        values
1483        {
1484            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1485            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1486        }
1487
1488        both ""
1489            precision mediump float;
1490            precision mediump int;
1491            ${DECLARATIONS}
1492
1493            float func (float a) { return -a; }
1494            vec2 func (vec2 a) { return a.yx; }
1495            vec3 func (vec3 a) { return a.xxx; }
1496            vec4 func (vec4 a) { return a.wwww; }
1497            int func (int a) { return -a; }
1498            ivec2 func (ivec2 a) { return a.yx; }
1499            ivec3 func (ivec3 a) { return a.xxx; }
1500            ivec4 func (ivec4 a) { return a.wwww; }
1501            bool func (bool a) { return !a; }
1502            bvec2 func (bvec2 a) { return a.yx; }
1503            bvec3 func (bvec3 a) { return a.xxx; }
1504            bvec4 func (bvec4 a) { return a.wwww; }
1505
1506            void main()
1507            {
1508                ${SETUP}
1509                if (func(func(bvec4(false)).x))
1510                    out0 = func(in0) * float(func(-1));
1511                else
1512                    out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
1513                ${OUTPUT}
1514            }
1515        ""
1516    end
1517
1518    case user_func_arg_complex_types
1519        values
1520        {
1521            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1522            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1523        }
1524
1525        both ""
1526            precision mediump float;
1527            precision mediump int;
1528            ${DECLARATIONS}
1529
1530            struct Pos { float a, b, c; };
1531            struct Line { Pos start, end; };
1532
1533            float func (float a) { return -a; }
1534            float func (float a[4]) { return a[0] + a[3]; }
1535            vec2 func (vec2 a) { return a.yx; }
1536            vec3 func (vec3 a) { return a.xxx; }
1537            vec4 func (vec4 a) { return a.wwww; }
1538            vec4 func (vec4 a[4]) { return a[1] + a[2]; }
1539            int func (int a) { return -a; }
1540            ivec2 func (ivec2 a) { return a.yx; }
1541            ivec3 func (ivec3 a) { return a.xxx; }
1542            ivec4 func (ivec4 a) { return a.wwww; }
1543            bool func (bool a) { return !a; }
1544            bvec2 func (bvec2 a) { return a.yx; }
1545            bvec3 func (bvec3 a) { return a.xxx; }
1546            bvec4 func (bvec4 a) { return a.wwww; }
1547            Pos func (Pos a) { return a; }
1548            Line func (Line a) { return Line(a.end, a.start); }
1549
1550            void main()
1551            {
1552                ${SETUP}
1553                float arr[4];
1554                vec4 arr2[4];
1555                out0 = func(arr) + func(arr2).x;
1556                if (func(func(bvec4(false)).x))
1557                    out0 = func(in0) * float(func(-1));
1558                else
1559                    out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
1560                ${OUTPUT}
1561            }
1562        ""
1563    end
1564
1565    case user_func_arguments
1566        values
1567        {
1568            input float in0 = [ 0.0 | 1.0 | -2.0 | 2.5 ];
1569            output float out0 = [ 0.0 | -1.0 | 2.0 | -2.5 ];
1570        }
1571
1572        both ""
1573            precision mediump float;
1574            ${DECLARATIONS}
1575
1576            float func (float a)
1577            {
1578                return -a;
1579            }
1580
1581            float func (float a, float b)
1582            {
1583                return a * b;
1584            }
1585
1586            void main()
1587            {
1588                out0 = func(in0) * func(-0.5, -2.0);
1589                ${OUTPUT}
1590            }
1591        ""
1592    end
1593
1594    case builtin_sin
1595        values
1596        {
1597            input int in0 = [ -1 | 0 | 1 | 4 ];
1598            output int out0 = [ 1 | 0 | -1 | -4 ];
1599        }
1600
1601        both ""
1602            precision mediump float;
1603            precision mediump int;
1604            ${DECLARATIONS}
1605
1606            int sin(int a) { return -a; }
1607
1608            void main()
1609            {
1610                ${SETUP}
1611                out0 = sin(in0);
1612                ${OUTPUT}
1613            }
1614        ""
1615    end
1616
1617    case builtin_step
1618        values
1619        {
1620            input int in0 = [ -1 | 0 | 1 | 4 ];
1621            output int out0 = [ 1 | 0 | -1 | -4 ];
1622        }
1623
1624        both ""
1625            precision mediump float;
1626            precision mediump int;
1627            ${DECLARATIONS}
1628
1629            int step (float i, float j, int a) { return -a; }
1630
1631            void main()
1632            {
1633                ${SETUP}
1634                out0 = step(0.0, 1.0, in0);
1635                ${OUTPUT}
1636            }
1637        ""
1638    end
1639
1640    case array_size
1641        values
1642        {
1643            output float out0 = [ 1.0 ];
1644        }
1645
1646        both ""
1647            precision mediump float;
1648            ${DECLARATIONS}
1649
1650            float func (float f[3])
1651            {
1652                return f[0];
1653            }
1654
1655            float func (float f[4])
1656            {
1657                return f[1];
1658            }
1659
1660            void main ()
1661            {
1662                ${SETUP}
1663                float x[4];
1664                x[0] = -1.0;
1665                x[1] = 1.0;
1666                x[2] = x[3] = 0.0;
1667                out0 = func(x);
1668                ${OUTPUT}
1669            }
1670        ""
1671    end
1672
1673end # overloading
1674
1675group array_arguments "Arrays as Arguments"
1676
1677    case local_in_float
1678        values
1679        {
1680            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
1681            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
1682        }
1683
1684        both ""
1685            precision mediump float;
1686            ${DECLARATIONS}
1687
1688            float func (in float a[4])
1689            {
1690                a[0] = -1.0;
1691                a[2] = -4.0;
1692                a[3] = -3.0 * a[1];
1693                return a[0];
1694            }
1695
1696            void main()
1697            {
1698                float arr[4];
1699                arr[0] = in0.x;
1700                arr[1] = in0.y;
1701                arr[2] = in0.z;
1702                arr[3] = in0.w;
1703                float f = func(arr);
1704                out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
1705                ${OUTPUT}
1706            }
1707        ""
1708    end
1709
1710    case global_in_float
1711        values
1712        {
1713            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
1714            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
1715        }
1716
1717        both ""
1718            precision mediump float;
1719            ${DECLARATIONS}
1720
1721            float func (in float a[4])
1722            {
1723                a[0] = -1.0;
1724                a[2] = -4.0;
1725                a[3] = -3.0 * a[1];
1726                return a[0];
1727            }
1728
1729            float arr[4];
1730
1731            void main()
1732            {
1733                arr[0] = in0.x;
1734                arr[1] = in0.y;
1735                arr[2] = in0.z;
1736                arr[3] = in0.w;
1737                float f = func(arr);
1738                out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
1739                ${OUTPUT}
1740            }
1741        ""
1742    end
1743
1744    case local_in_int
1745        values
1746        {
1747            input ivec4 in0 = [ ivec4(0, 1, 2, -4) | ivec4(-7, -11, 13, 19) ];
1748            output ivec4 out0 = [ ivec4(0, -1, -2, 4) | ivec4(7, 11, -13, -19) ];
1749        }
1750
1751        both ""
1752            precision mediump float;
1753            precision mediump int;
1754            ${DECLARATIONS}
1755
1756            int func (in int a[4])
1757            {
1758                a[0] = -1;
1759                a[2] = -4;
1760                a[3] = -3 * a[1];
1761                return a[0];
1762            }
1763
1764            void main()
1765            {
1766                ${SETUP}
1767                int arr[4];
1768                arr[0] = in0.x;
1769                arr[1] = in0.y;
1770                arr[2] = in0.z;
1771                arr[3] = in0.w;
1772                int f = func(arr);
1773                out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
1774                ${OUTPUT}
1775            }
1776        ""
1777    end
1778
1779    case global_in_int
1780        values
1781        {
1782            input ivec4 in0 = [ ivec4(0, 1, 2, 4) | ivec4(-7, -11, 13, 19) ];
1783            output ivec4 out0 = [ ivec4(0, -1, -2, -4) | ivec4(7, 11, -13, -19) ];
1784        }
1785
1786        both ""
1787            precision mediump float;
1788            precision mediump int;
1789            ${DECLARATIONS}
1790
1791            int func (in int a[4])
1792            {
1793                a[0] = -1;
1794                a[2] = -4;
1795                a[3] = -3 * a[1];
1796                return a[0];
1797            }
1798
1799            int arr[4];
1800
1801            void main()
1802            {
1803                ${SETUP}
1804                arr[0] = in0.x;
1805                arr[1] = in0.y;
1806                arr[2] = in0.z;
1807                arr[3] = in0.w;
1808                int f = func(arr);
1809                out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
1810                ${OUTPUT}
1811            }
1812
1813        ""
1814    end
1815
1816    case local_in_bool
1817        values
1818        {
1819            input bvec4 in0 = [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
1820            output bvec4 out0 = [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
1821        }
1822
1823        both ""
1824            precision mediump float;
1825            ${DECLARATIONS}
1826
1827            bool func (in bool a[4])
1828            {
1829                a[0] = false;
1830                a[2] = true;
1831                a[3] = !a[1];
1832                return a[0];
1833            }
1834
1835            void main()
1836            {
1837                ${SETUP}
1838                bool arr[4];
1839                arr[0] = !in0.x;
1840                arr[1] = !in0.y;
1841                arr[2] = !in0.z;
1842                arr[3] = !in0.w;
1843                func(arr);
1844                out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
1845                ${OUTPUT}
1846            }
1847        ""
1848    end
1849
1850    case global_in_bool
1851        values
1852        {
1853            input bvec4 in0 = [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
1854            output bvec4 out0 = [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
1855        }
1856
1857        both ""
1858            precision mediump float;
1859            ${DECLARATIONS}
1860
1861            bool func (in bool a[4])
1862            {
1863                a[0] = false;
1864                a[2] = true;
1865                a[3] = !a[1];
1866                return a[0];
1867            }
1868
1869            bool arr[4];
1870
1871            void main()
1872            {
1873                ${SETUP}
1874                arr[0] = !in0.x;
1875                arr[1] = !in0.y;
1876                arr[2] = !in0.z;
1877                arr[3] = !in0.w;
1878                func(arr);
1879                out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
1880                ${OUTPUT}
1881            }
1882        ""
1883    end
1884
1885    case test_helpers
1886        desc "Check that helper functions are supported properly."
1887        values
1888        {
1889            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
1890            output float out0 = [ 1.0 | 1.0 ];
1891        }
1892
1893        both ""
1894            precision mediump float;
1895            ${DECLARATIONS}
1896
1897            vec4 get (in float arr[4]);
1898            void set (out float arr[4], vec4 val);
1899            void negate (inout float arr[4]);
1900            bool test (in float arr[4], vec4 ref);
1901            bool isEqual (in float a[4], in float b[4]);
1902
1903            void main()
1904            {
1905                float arr[4];
1906                set(arr, in0);
1907                negate(arr);
1908                out0 = float(test(arr, -in0));
1909                ${OUTPUT}
1910            }
1911
1912            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
1913            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
1914            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
1915            void negate (inout float arr[4]) { set(arr, -get(arr)); }
1916            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
1917            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
1918        ""
1919    end
1920
1921    case copy_local_in_on_call
1922        desc "Check that local 'in' arguments are copied on call and don't alias."
1923        values
1924        {
1925            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
1926            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
1927        }
1928
1929        both ""
1930            precision mediump float;
1931            ${DECLARATIONS}
1932
1933            vec4 get (in float arr[4]);
1934            void set (out float arr[4], vec4 val);
1935            void negate (inout float arr[4]);
1936            bool test (in float arr[4], vec4 ref);
1937            bool isEqual (in float a[4], in float b[4]);
1938
1939            float func (in float a[4], in float b[4])
1940            {
1941                a[0] = 2.123;
1942                a[2] = -4.123;
1943                return isEqual(a, b) ? 1.0 : -1.0;
1944            }
1945
1946            void main()
1947            {
1948                float arr[4];
1949                set(arr, in0);
1950                out0 = in0 * func(arr, arr);
1951                ${OUTPUT}
1952            }
1953
1954            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
1955            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
1956            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
1957            void negate (inout float arr[4]) { set(arr, -get(arr)); }
1958            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
1959            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
1960        ""
1961    end
1962
1963    case copy_global_in_on_call
1964        desc "Check that global 'in' arguments are copied on call and don't alias."
1965        values
1966        {
1967            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
1968            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
1969        }
1970
1971        both ""
1972            precision mediump float;
1973            ${DECLARATIONS}
1974
1975            vec4 get (in float arr[4]);
1976            void set (out float arr[4], vec4 val);
1977            void negate (inout float arr[4]);
1978            bool test (in float arr[4], vec4 ref);
1979            bool isEqual (in float a[4], in float b[4]);
1980
1981            float func (in float a[4], in float b[4])
1982            {
1983                a[0] = 2.123;
1984                a[2] = -4.123;
1985                return isEqual(a, b) ? 1.0 : -1.0;
1986            }
1987
1988            float arr[4];
1989
1990            void main()
1991            {
1992                set(arr, in0);
1993                out0 = in0 * func(arr, arr);
1994                ${OUTPUT}
1995            }
1996
1997            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
1998            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
1999            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2000            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2001            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2002            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2003        ""
2004    end
2005
2006    case copy_local_inout_on_call
2007        desc "Check that local 'in' arguments are copied on call and don't alias."
2008        values
2009        {
2010            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2011            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2012        }
2013
2014        both ""
2015            precision mediump float;
2016            ${DECLARATIONS}
2017
2018            vec4 get (in float arr[4]);
2019            void set (out float arr[4], vec4 val);
2020            void negate (inout float arr[4]);
2021            bool test (in float arr[4], vec4 ref);
2022            bool isEqual (in float a[4], in float b[4]);
2023
2024            float func (inout float a[4], inout float b[4])
2025            {
2026                negate(a);
2027                return isEqual(a, b) ? 1.0 : -1.0;
2028            }
2029
2030            void main()
2031            {
2032                float arr[4];
2033                set(arr, in0);
2034                float m = func(arr, arr); // returns -1.0
2035                float n = float(test(arr, in0) || test(arr, -in0));
2036                out0 = in0 * m * n;
2037                ${OUTPUT}
2038            }
2039
2040            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2041            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2042            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2043            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2044            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2045            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2046        ""
2047    end
2048
2049    case copy_global_inout_on_call
2050        desc "Check that global 'in' arguments are copied on call and don't alias."
2051        values
2052        {
2053            input vec4 in0 = [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2054            output vec4 out0 = [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2055        }
2056
2057        both ""
2058            precision mediump float;
2059            ${DECLARATIONS}
2060
2061            vec4 get (in float arr[4]);
2062            void set (out float arr[4], vec4 val);
2063            void negate (inout float arr[4]);
2064            bool test (in float arr[4], vec4 ref);
2065            bool isEqual (in float a[4], in float b[4]);
2066
2067            float func (in float a[4], in float b[4])
2068            {
2069                negate(a);
2070                return isEqual(a, b) ? 1.0 : -1.0;
2071            }
2072
2073            float arr[4];
2074
2075            void main()
2076            {
2077                set(arr, in0);
2078                float m = func(arr, arr); // returns -1.0
2079                float n = float(test(arr, in0) || test(arr, -in0));
2080                out0 = in0 * m * n;
2081                ${OUTPUT}
2082            }
2083
2084            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2085            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2086            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2087            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2088            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2089            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2090        ""
2091    end
2092
2093#            vec4 get (in float arr[4]);
2094#            void set (out float arr[4], vec4 val);
2095#            void negate (inout float arr[4]);
2096#            bool test (in float arr[4], vec4 ref);
2097#            bool isEqual (in float a[4], in float b[4]);
2098
2099#            float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2100#            vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2101#            void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2102#            void negate (inout float arr[4]) { set(arr, -get(arr)); }
2103#            bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2104#            bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2105
2106end # array_arguments
2107
2108#group qualifiers "Function Parameter Qualifiers"
2109#
2110#end # qualifiers
2111
2112group control_flow "Control Flow In Functions"
2113
2114    case simple_return
2115        values
2116        {
2117            input float in0 = [ -0.5 | 1.5 ];
2118            output float out0 = [ 0.5 | -1.5 ];
2119        }
2120
2121        both ""
2122            precision mediump float;
2123            ${DECLARATIONS}
2124
2125            float func (float a)
2126            {
2127                return -a;
2128                a = a * -1.0;
2129                return 1.0;
2130            }
2131
2132            void main()
2133            {
2134                ${SETUP}
2135                out0 = func(in0);
2136                ${OUTPUT}
2137            }
2138        ""
2139    end
2140
2141    case return_in_if
2142        values
2143        {
2144            input float in0 = [ -0.5 | 1.5 ];
2145            output float out0 = [ 0.5 | -1.5 ];
2146        }
2147
2148        both ""
2149            precision mediump float;
2150            ${DECLARATIONS}
2151
2152            float func (float a)
2153            {
2154                if (a != 0.0)
2155                    return -a;
2156                return 1.0;
2157            }
2158
2159            void main()
2160            {
2161                ${SETUP}
2162                out0 = func(in0);
2163                ${OUTPUT}
2164            }
2165        ""
2166    end
2167
2168    case return_in_else
2169        values
2170        {
2171            input float in0 = [ -0.5 | 1.5 ];
2172            output float out0 = [ 0.5 | -1.5 ];
2173        }
2174
2175        both ""
2176            precision mediump float;
2177            ${DECLARATIONS}
2178
2179            float func (float a)
2180            {
2181                if (a == 0.0)
2182                    return 1.0;
2183                else
2184                    return -a;
2185                return 1.0;
2186            }
2187
2188            void main()
2189            {
2190                ${SETUP}
2191                out0 = func(in0);
2192                ${OUTPUT}
2193            }
2194        ""
2195    end
2196
2197    case return_in_loop
2198        values
2199        {
2200            input float in0 = [ -0.5 | 1.5 ];
2201            output float out0 = [ 0.5 | -1.5 ];
2202        }
2203
2204        both ""
2205            precision mediump float;
2206            ${DECLARATIONS}
2207
2208            float func (float a)
2209            {
2210                for (int i = 0; i < 1; i++)
2211                    return -a;
2212                return 1.0;
2213            }
2214
2215            void main()
2216            {
2217                ${SETUP}
2218                out0 = func(in0);
2219                ${OUTPUT}
2220            }
2221        ""
2222    end
2223
2224    case return_in_loop_if
2225        values
2226        {
2227            input float in0 = [ -0.5 | 1.5 ];
2228            output float out0 = [ 0.5 | -1.5 ];
2229        }
2230
2231        both ""
2232            precision mediump float;
2233            ${DECLARATIONS}
2234
2235            float func (float a)
2236            {
2237                for (int i = 0; i < 3; i++)
2238                {
2239                    if (i == 1)
2240                        return a;
2241                    else if (i > 1)
2242                        return -1.0;
2243                    a = -a;
2244                }
2245                return 1.0;
2246            }
2247
2248            void main()
2249            {
2250                ${SETUP}
2251                out0 = func(in0);
2252                ${OUTPUT}
2253            }
2254        ""
2255    end
2256
2257    case return_after_loop
2258        values
2259        {
2260            input float in0 = [ -0.5 | 1.5 ];
2261            output float out0 = [ 0.5 | -1.5 ];
2262        }
2263
2264        both ""
2265            precision mediump float;
2266            ${DECLARATIONS}
2267
2268            float func (float a)
2269            {
2270                for (int i = 0; i < 5; i++)
2271                    a = -a;
2272                return a;
2273            }
2274
2275            void main()
2276            {
2277                ${SETUP}
2278                out0 = func(in0);
2279                ${OUTPUT}
2280            }
2281        ""
2282    end
2283
2284    case return_after_break
2285        values
2286        {
2287            input float in0 = [ -0.5 | 1.5 ];
2288            output float out0 = [ 0.5 | -1.5 ];
2289        }
2290
2291        both ""
2292            precision mediump float;
2293            ${DECLARATIONS}
2294
2295            float func (float a)
2296            {
2297                for (int i = 0; i < 6; i++)
2298                {
2299                    a = -a;
2300                    if (i == 4)
2301                        break;
2302                }
2303                return a;
2304            }
2305
2306            void main()
2307            {
2308                ${SETUP}
2309                out0 = func(in0);
2310                ${OUTPUT}
2311            }
2312        ""
2313    end
2314
2315    case return_after_continue
2316        values
2317        {
2318            input float in0 = [ -0.5 | 1.5 ];
2319            output float out0 = [ 0.5 | -1.5 ];
2320        }
2321
2322        both ""
2323            precision mediump float;
2324            ${DECLARATIONS}
2325
2326            float func (float a)
2327            {
2328                for (int i = 0; i < 6; i++)
2329                {
2330                    if (i == 4)
2331                        continue;
2332                    a = -a;
2333                }
2334                return a;
2335            }
2336
2337            void main()
2338            {
2339                ${SETUP}
2340                out0 = func(in0);
2341                ${OUTPUT}
2342            }
2343        ""
2344    end
2345
2346    case return_in_nested_loop
2347        values
2348        {
2349            input float in0 = [ -0.5 | 1.5 ];
2350            output float out0 = [ 0.5 | -1.5 ];
2351        }
2352
2353        both ""
2354            precision mediump float;
2355            ${DECLARATIONS}
2356
2357            float func (float a)
2358            {
2359                for (int i = 0; i < 6; i++)
2360                {
2361                    a = -a;
2362                    for (int j = 0; j < 4; j++)
2363                    {
2364                        a = -a;
2365                        if (i == 1)
2366                            return a;
2367                    }
2368                    if (i == 4)
2369                        return 1.0;
2370                }
2371                return 1.0;
2372            }
2373
2374            void main()
2375            {
2376                ${SETUP}
2377                out0 = func(in0);
2378                ${OUTPUT}
2379            }
2380        ""
2381    end
2382
2383    case return_after_loop_sequence
2384        require full_glsl_es_100_support
2385
2386        values
2387        {
2388            input float in0 = [ -0.5 | 1.5 ];
2389            output float out0 = [ 0.5 | -1.5 ];
2390        }
2391
2392        both ""
2393            precision mediump float;
2394            ${DECLARATIONS}
2395
2396            float func (float a)
2397            {
2398                int i;
2399                for (i = 0; i < 6; i++) // negate a
2400                {
2401                    a = -a;
2402                    if (i == 4)
2403                        a = -a;
2404                }
2405
2406                for (; i < 10; i++) // keep a
2407                {
2408                    if (i == 8)
2409                        continue;
2410                    else if (i == 9)
2411                        break;
2412                    a = -a;
2413                }
2414
2415                return a;
2416            }
2417
2418            void main()
2419            {
2420                ${SETUP}
2421                out0 = func(in0);
2422                ${OUTPUT}
2423            }
2424        ""
2425    end
2426
2427    case mixed_return_break_continue
2428        values
2429        {
2430            input float in0 = [ -0.5 | 1.5 ];
2431            output float out0 = [ 0.5 | -1.5 ];
2432        }
2433
2434        both ""
2435            precision mediump float;
2436            ${DECLARATIONS}
2437
2438            float func (float a)
2439            {
2440                for (int i = 0; i < 6; i++)
2441                {
2442                    if (i == 0)
2443                        continue;
2444                    else if (i == 1)
2445                    {
2446                    }
2447                    else if (i == 3)
2448                        break;
2449                    else
2450                        return a;
2451                    a = -a;
2452                }
2453
2454                return 1.0;
2455            }
2456
2457            void main()
2458            {
2459                ${SETUP}
2460                out0 = func(in0);
2461                ${OUTPUT}
2462            }
2463        ""
2464    end
2465
2466end # control_flow
2467
2468group misc "Miscellaneous"
2469
2470    case multi_arg_float
2471        values
2472        {
2473            input vec4 in0 = [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
2474            output float out0 = [ 0.5 | -1.5 ]; # -sum(in0)
2475        }
2476
2477        both ""
2478            precision mediump float;
2479            ${DECLARATIONS}
2480
2481            float sum(vec4 v) { return (v.x + v.y + v.z + v.w); }
2482
2483            float func (float a, vec3 b, vec2 c, vec2 d, vec4 e)
2484            {
2485                return -sum(vec4(a, b) + vec4(c, d)) + sum(e);
2486            }
2487
2488            void main()
2489            {
2490                ${SETUP}
2491                out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
2492                ${OUTPUT}
2493            }
2494        ""
2495    end
2496
2497    case multi_arg_int
2498        values
2499        {
2500            input ivec4 in0 = [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
2501            output int out0 = [ -3 | 1 ];
2502        }
2503
2504        both ""
2505            precision mediump float;
2506            precision mediump int;
2507            ${DECLARATIONS}
2508
2509            int sum(ivec4 v) { return (v.x + v.y + v.z + v.w); }
2510
2511            int func (int a, ivec3 b, ivec2 c, ivec2 d, ivec4 e)
2512            {
2513                return -sum(ivec4(a, b) + ivec4(c, d)) + sum(e);
2514            }
2515
2516            void main()
2517            {
2518                ${SETUP}
2519                out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
2520                ${OUTPUT}
2521            }
2522        ""
2523    end
2524
2525    case argument_eval_order_1
2526        values
2527        {
2528            input int in0 = [  0 | 1 | 3 | 5 ];
2529            output int out0 = [ -1 | 5 | 11 | 17 ];
2530        }
2531
2532        both ""
2533            precision mediump float;
2534            ${DECLARATIONS}
2535
2536            int func (float a, int b, bool c, int d)
2537            {
2538                if (c)
2539                    return b + int(a) + d;
2540                else
2541                    return -1;
2542            }
2543
2544            void main ()
2545            {
2546                ${SETUP}
2547                float v0 = float(in0);
2548                int v1 = in0;
2549                out0 = func((v0 += 1.0), v1++, (v0 > 1.5), v1);
2550                ${OUTPUT}
2551            }
2552        ""
2553    end
2554
2555    case argument_eval_order_2
2556        values
2557        {
2558            input int in0 = [ 0 | -1 | 3 | 5 ];
2559            output int out0 = [ 3 | -1 | 9 | 13 ];
2560        }
2561
2562        both ""
2563            precision mediump float;
2564            ${DECLARATIONS}
2565
2566            int g;
2567
2568            int modG (int v)
2569            {
2570                g += v;
2571                return v;
2572            }
2573
2574            int func (float a, int b, bool c, int d)
2575            {
2576                if (c)
2577                    return b + int(a) + d;
2578                else
2579                    return -1;
2580            }
2581
2582            void main ()
2583            {
2584                ${SETUP}
2585                out0 = func(float(g = in0), modG(2), --g > 0, g);
2586                ${OUTPUT}
2587            }
2588        ""
2589    end
2590
2591    case missing_returns
2592        values
2593        {
2594            input float in0 = [ 1.0 | 2.0 | 3.0 ];
2595            output float out0 = [ -1.0 | -2.0 | -3.0 ];
2596        }
2597        both ""
2598            // Note specification says that returned value is undefined if no return
2599            // statement has been executed. In this case func() is called only with
2600            // positive values.
2601            precision mediump float;
2602            ${DECLARATIONS}
2603
2604            float func (float f)
2605            {
2606                if (f > 0.0)
2607                    return -f;
2608            }
2609
2610            void main ()
2611            {
2612                ${SETUP}
2613                out0 = func(in0);
2614                ${OUTPUT}
2615            }
2616        ""
2617    end
2618
2619end # misc
2620
2621group invalid "Invalid Functions"
2622    case break_in_body
2623        expect compile_fail
2624        both ""
2625            precision mediump float;
2626
2627            void func ()
2628            {
2629                break;
2630            }
2631
2632            void main ()
2633            {
2634                ${POSITION_FRAG_COLOR} = vec4(1.0);
2635            }
2636        ""
2637    end
2638
2639    case continue_in_body
2640        expect compile_fail
2641        both ""
2642            precision mediump float;
2643
2644            void func ()
2645            {
2646                continue;
2647            }
2648
2649            void main ()
2650            {
2651                ${POSITION_FRAG_COLOR} = vec4(1.0);
2652            }
2653        ""
2654    end
2655
2656    case return_value_from_void_function
2657        expect compile_fail
2658        both ""
2659            precision mediump float;
2660
2661            void func ()
2662            {
2663                return 1.0;
2664            }
2665
2666            void main ()
2667            {
2668                ${POSITION_FRAG_COLOR} = vec4(1.0);
2669            }
2670        ""
2671    end
2672
2673    case extra_arguments
2674        expect compile_fail
2675        both ""
2676            precision mediump float;
2677
2678            void func (float f)
2679            {
2680            }
2681
2682            void main ()
2683            {
2684                func(1.0, 2.0);
2685                ${POSITION_FRAG_COLOR} = vec4(1.0);
2686            }
2687        ""
2688    end
2689
2690    case missing_arguments
2691        expect compile_fail
2692        both ""
2693            precision mediump float;
2694
2695            void func (float f)
2696            {
2697            }
2698
2699            void main ()
2700            {
2701                func();
2702                ${POSITION_FRAG_COLOR} = vec4(1.0);
2703            }
2704        ""
2705    end
2706
2707    case missing_argument_type
2708        expect compile_fail
2709        both ""
2710            precision mediump float;
2711
2712            void func (in f)
2713            {
2714            }
2715
2716            void main ()
2717            {
2718                ${POSITION_FRAG_COLOR} = vec4(1.0);
2719            }
2720        ""
2721    end
2722
2723    case argument_basetype_mismatch
2724        expect compile_fail
2725        both ""
2726            precision mediump float;
2727            precision mediump int;
2728
2729            void func (float f)
2730            {
2731            }
2732
2733            void main ()
2734            {
2735                func(2);
2736                ${POSITION_FRAG_COLOR} = vec4(1.0);
2737            }
2738        ""
2739    end
2740
2741    case argument_scalar_vector_mismatch
2742        expect compile_fail
2743        both ""
2744            precision mediump float;
2745
2746            void func (vec2 f)
2747            {
2748            }
2749
2750            void main ()
2751            {
2752                func(2.0);
2753                ${POSITION_FRAG_COLOR} = vec4(1.0);
2754            }
2755        ""
2756    end
2757
2758    case argument_vector_size_mismatch
2759        expect compile_fail
2760        both ""
2761            precision mediump float;
2762
2763            void func (vec3 f)
2764            {
2765            }
2766
2767            void main ()
2768            {
2769                func(vec2(2.0));
2770                ${POSITION_FRAG_COLOR} = vec4(1.0);
2771            }
2772        ""
2773    end
2774
2775    case duplicate_function
2776        expect compile_fail
2777        both ""
2778            precision mediump float;
2779
2780            void func (vec3 f);
2781
2782            void func (vec3 f)
2783            {
2784            }
2785
2786            void func (vec3 f)
2787            {
2788            }
2789
2790            void main ()
2791            {
2792                ${POSITION_FRAG_COLOR} = vec4(1.0);
2793            }
2794        ""
2795    end
2796
2797    case prototype_mismatch_return_type
2798        expect compile_fail
2799        both ""
2800            precision mediump float;
2801
2802            void func (vec3 f);
2803
2804            void main ()
2805            {
2806                ${POSITION_FRAG_COLOR} = vec4(1.0);
2807            }
2808
2809            float func (vec3 f)
2810            {
2811                return f.x;
2812            }
2813        ""
2814    end
2815
2816    case prototype_unspecified_array_size
2817        expect compile_fail
2818        both ""
2819            precision mediump float;
2820
2821            void func (vec3 f[]);
2822
2823            void main ()
2824            {
2825                ${POSITION_FRAG_COLOR} = vec4(1.0);
2826            }
2827        ""
2828    end
2829
2830    case call_mismatch_argument_array_size
2831        expect compile_fail
2832        both ""
2833            precision mediump float;
2834
2835            void func (vec3 f[3]);
2836            void func (vec3 f[3])
2837            {
2838            }
2839
2840            void main ()
2841            {
2842                vec3 array[4];
2843                func(array);
2844                ${POSITION_FRAG_COLOR} = vec4(1.0);
2845            }
2846        ""
2847    end
2848
2849    case prototype_mismatch_argument_const
2850        expect compile_fail
2851        both ""
2852            precision mediump float;
2853
2854            void func (vec3 f);
2855            void func (const vec3 f)
2856            {
2857            }
2858
2859            void main ()
2860            {
2861                ${POSITION_FRAG_COLOR} = vec4(1.0);
2862            }
2863        ""
2864    end
2865
2866    case prototype_mismatch_argument_array_const
2867        expect compile_fail
2868        both ""
2869            precision mediump float;
2870
2871            void func (vec3 f[3]);
2872            void func (const vec3 f[3])
2873            {
2874            }
2875
2876            void main ()
2877            {
2878                ${POSITION_FRAG_COLOR} = vec4(1.0);
2879            }
2880        ""
2881    end
2882
2883    case prototype_mismatch_array_inout
2884        expect compile_fail
2885        both ""
2886            precision mediump float;
2887
2888            void func (out vec3 f);
2889            void func (inout vec3 f)
2890            {
2891            }
2892
2893            void main ()
2894            {
2895                ${POSITION_FRAG_COLOR} = vec4(1.0);
2896            }
2897        ""
2898    end
2899
2900    case missing_return_type
2901        expect compile_fail
2902        both ""
2903            precision mediump float;
2904
2905            func (float f);
2906            func (inout vec3 f[3])
2907            {
2908            }
2909
2910            void main ()
2911            {
2912                ${POSITION_FRAG_COLOR} = vec4(1.0);
2913            }
2914        ""
2915    end
2916
2917    case call_before_definition
2918        expect compile_fail
2919        both ""
2920            precision mediump float;
2921
2922            void main ()
2923            {
2924                func(1.0);
2925                ${POSITION_FRAG_COLOR} = vec4(1.0);
2926            }
2927
2928            void func (float f)
2929            {
2930            }
2931
2932        ""
2933    end
2934
2935    case return_array_in_struct
2936        expect compile_fail
2937        both ""
2938            precision mediump float;
2939
2940            struct Foo
2941            {
2942                float f;
2943                float arr[2];
2944            };
2945
2946            Foo func ()
2947            {
2948                Foo f;
2949                f.f = 1.0;
2950                f.arr[0] = 2.0;
2951                return f;
2952            }
2953
2954            void main ()
2955            {
2956                ${POSITION_FRAG_COLOR} = vec4(1.0);
2957            }
2958        ""
2959    end
2960
2961    case argument_precision_overload
2962        expect compile_fail
2963        both ""
2964            precision mediump float;
2965
2966            float func (lowp float f)
2967            {
2968                return f;
2969            }
2970
2971            float func (mediump float f)
2972            {
2973                return f;
2974            }
2975
2976            void main ()
2977            {
2978                ${POSITION_FRAG_COLOR} = vec4(1.0);
2979            }
2980        ""
2981    end
2982
2983    case argument_in_out_overload
2984        expect compile_fail
2985        both ""
2986            precision mediump float;
2987
2988            void func (in float f)
2989            {
2990            }
2991
2992            void func (out float f)
2993            {
2994                f = 1.0;
2995            }
2996
2997            void main ()
2998            {
2999                ${POSITION_FRAG_COLOR} = vec4(1.0);
3000            }
3001        ""
3002    end
3003
3004    case argument_in_inout_overload
3005        expect compile_fail
3006        both ""
3007            precision mediump float;
3008
3009            void func (in float f)
3010            {
3011            }
3012
3013            void func (inout float f)
3014            {
3015                f = -f;
3016            }
3017
3018            void main ()
3019            {
3020                ${POSITION_FRAG_COLOR} = vec4(1.0);
3021            }
3022        ""
3023    end
3024
3025    case argument_out_inout_overload
3026        expect compile_fail
3027        both ""
3028            precision mediump float;
3029
3030            void func (out float f)
3031            {
3032                f = -1.0;
3033            }
3034
3035            void func (inout float f)
3036            {
3037                f = -f;
3038            }
3039
3040            void main ()
3041            {
3042                ${POSITION_FRAG_COLOR} = vec4(1.0);
3043            }
3044        ""
3045    end
3046
3047    case return_type_overload
3048        expect compile_fail
3049        both ""
3050            precision mediump float;
3051
3052            float func (float f)
3053            {
3054                return f;
3055            }
3056
3057            int func (float f)
3058            {
3059                return int(f);
3060            }
3061
3062            void main ()
3063            {
3064                ${POSITION_FRAG_COLOR} = vec4(1.0);
3065            }
3066        ""
3067    end
3068
3069    case return_type_precision_overload
3070        expect compile_fail
3071        both ""
3072            precision mediump float;
3073
3074            lowp float func (float f)
3075            {
3076                return f;
3077            }
3078
3079            mediump float func (float f)
3080            {
3081                return f;
3082            }
3083
3084            void main ()
3085            {
3086                ${POSITION_FRAG_COLOR} = vec4(1.0);
3087            }
3088        ""
3089    end
3090
3091    case return_type_const_overload
3092        expect compile_fail
3093        both ""
3094            precision mediump float;
3095
3096            float func (float f)
3097            {
3098                return f;
3099            }
3100
3101            const float func (float f)
3102            {
3103                return f;
3104            }
3105
3106            void main ()
3107            {
3108                ${POSITION_FRAG_COLOR} = vec4(1.0);
3109            }
3110        ""
3111    end
3112
3113    case return_without_value
3114        expect compile_fail
3115        both ""
3116            precision mediump float;
3117
3118            float func (float f)
3119            {
3120                return;
3121                return 1.0;
3122            }
3123
3124            void main ()
3125            {
3126                ${POSITION_FRAG_COLOR} = vec4(1.0);
3127            }
3128        ""
3129    end
3130
3131    case local_function_prototype
3132        expect compile_fail
3133        both ""
3134            precision mediump float;
3135
3136            void main ()
3137            {
3138                float func (float f);
3139
3140                ${POSITION_FRAG_COLOR} = vec4(1.0);
3141            }
3142        ""
3143    end
3144
3145    case local_function_definition
3146        expect compile_fail
3147        both ""
3148            precision mediump float;
3149
3150            void main ()
3151            {
3152                float func (float f)
3153                {
3154                    return 1.0;
3155                }
3156
3157                ${POSITION_FRAG_COLOR} = vec4(1.0);
3158            }
3159        ""
3160    end
3161
3162    case name_type_conflict
3163        expect compile_fail
3164        both ""
3165            precision mediump float;
3166
3167            struct foo { float a; }
3168
3169            float foo (float f)
3170            {
3171                return 1.0;
3172            }
3173
3174            void main ()
3175            {
3176                ${POSITION_FRAG_COLOR} = vec4(1.0);
3177            }
3178        ""
3179    end
3180
3181    case const_overload
3182        expect compile_fail
3183        both ""
3184            precision mediump float;
3185
3186            void func (vec3 f)
3187            {
3188            }
3189
3190            void func (const vec3 f)
3191            {
3192            }
3193
3194            void main ()
3195            {
3196                ${POSITION_FRAG_COLOR} = vec4(1.0);
3197            }
3198        ""
3199    end
3200
3201    case uniform_local
3202        expect compile_fail
3203        both ""
3204            precision mediump float;
3205
3206            void func (vec3 f)
3207            {
3208                uniform float u;
3209            }
3210
3211            void main ()
3212            {
3213                ${POSITION_FRAG_COLOR} = vec4(1.0);
3214            }
3215        ""
3216    end
3217
3218    case varying_local
3219        expect compile_fail
3220        both ""
3221            precision mediump float;
3222
3223            void func (vec3 f)
3224            {
3225                varying float v;
3226            }
3227
3228            void main ()
3229            {
3230                ${POSITION_FRAG_COLOR} = vec4(1.0);
3231            }
3232        ""
3233    end
3234
3235    case attribute_local
3236        expect compile_fail
3237        both ""
3238            precision mediump float;
3239
3240            void func (vec3 f)
3241            {
3242                attribute float a;
3243            }
3244
3245            void main ()
3246            {
3247                ${POSITION_FRAG_COLOR} = vec4(1.0);
3248            }
3249        ""
3250    end
3251
3252    case uniform_argument
3253        expect compile_fail
3254        both ""
3255            precision mediump float;
3256
3257            void func (uniform vec3 f)
3258            {
3259            }
3260
3261            void main ()
3262            {
3263                ${POSITION_FRAG_COLOR} = vec4(1.0);
3264            }
3265        ""
3266    end
3267
3268    case varying_argument
3269        expect compile_fail
3270        both ""
3271            precision mediump float;
3272
3273            void func (varying vec3 f)
3274            {
3275            }
3276
3277            void main ()
3278            {
3279                ${POSITION_FRAG_COLOR} = vec4(1.0);
3280            }
3281        ""
3282    end
3283
3284    case attribute_argument
3285        expect compile_fail
3286        both ""
3287            precision mediump float;
3288
3289            void func (attribute vec3 f)
3290            {
3291            }
3292
3293            void main ()
3294            {
3295                ${POSITION_FRAG_COLOR} = vec4(1.0);
3296            }
3297        ""
3298    end
3299
3300    case uniform_return_type
3301        expect compile_fail
3302        both ""
3303            precision mediump float;
3304
3305            uniform float func (vec3 f)
3306            {
3307                return f.x;
3308            }
3309
3310            void main ()
3311            {
3312                ${POSITION_FRAG_COLOR} = vec4(1.0);
3313            }
3314        ""
3315    end
3316
3317    case varying_return_type
3318        expect compile_fail
3319        both ""
3320            precision mediump float;
3321
3322            varying float func (vec3 f)
3323            {
3324                return f.x;
3325            }
3326
3327            void main ()
3328            {
3329                ${POSITION_FRAG_COLOR} = vec4(1.0);
3330            }
3331        ""
3332    end
3333
3334    case attribute_return_type
3335        expect compile_fail
3336        both ""
3337            precision mediump float;
3338
3339            attribute float func (vec3 f)
3340            {
3341                return f.x;
3342            }
3343
3344            void main ()
3345            {
3346                ${POSITION_FRAG_COLOR} = vec4(1.0);
3347            }
3348        ""
3349    end
3350
3351    case main_invalid_return_type
3352        expect compile_fail
3353        both ""
3354            precision mediump float;
3355
3356            float main ()
3357            {
3358                ${POSITION_FRAG_COLOR} = vec4(1.0);
3359            }
3360        ""
3361    end
3362
3363    case main_has_arguments
3364        expect compile_fail
3365        both ""
3366            precision mediump float;
3367
3368            void main (float f)
3369            {
3370                ${POSITION_FRAG_COLOR} = vec4(1.0);
3371            }
3372        ""
3373    end
3374
3375    case main_missing_return_type
3376        expect compile_fail
3377        both ""
3378            precision mediump float;
3379
3380            main ()
3381            {
3382                ${POSITION_FRAG_COLOR} = vec4(1.0);
3383            }
3384        ""
3385    end
3386
3387    case write_const_arg
3388        expect compile_fail
3389        both ""
3390            precision mediump float;
3391
3392            func (const float f)
3393            {
3394                f = 1.0;
3395            }
3396
3397            main ()
3398            {
3399                ${POSITION_FRAG_COLOR} = vec4(1.0);
3400            }
3401        ""
3402    end
3403
3404    case write_const_array_arg
3405        expect compile_fail
3406        both ""
3407            precision mediump float;
3408
3409            func (const float f[3])
3410            {
3411                f[0] = 1.0;
3412            }
3413
3414            main ()
3415            {
3416                ${POSITION_FRAG_COLOR} = vec4(1.0);
3417            }
3418        ""
3419    end
3420
3421    case modify_const_arg
3422        expect compile_fail
3423        both ""
3424            precision mediump float;
3425            precision mediump int;
3426            ${DECLARATIONS}
3427
3428            int func (const int a)
3429            {
3430                a = -a;
3431                return 2 * a;
3432            }
3433
3434            void main()
3435            {
3436                ${POSITION_FRAG_COLOR} = vec4(func(3));
3437            }
3438        ""
3439    end
3440
3441    case init_const_local_from_const_arg
3442        expect compile_fail
3443        both ""
3444            precision mediump float;
3445            precision mediump int;
3446            ${DECLARATIONS}
3447
3448            int func (const int a)
3449            {
3450                const int b = -a;
3451                return 2 * b;
3452            }
3453
3454            void main()
3455            {
3456                ${POSITION_FRAG_COLOR} = vec4(func(3));
3457            }
3458        ""
3459    end
3460
3461    case array_size_from_const_arg
3462        expect compile_fail
3463        both ""
3464            precision mediump float;
3465            precision mediump int;
3466            ${DECLARATIONS}
3467
3468            int func (const int a)
3469            {
3470                int arr[a];
3471                arr[1] = 3;
3472                return arr[1];
3473            }
3474
3475            void main()
3476            {
3477                ${POSITION_FRAG_COLOR} = vec4(func(3));
3478            }
3479        ""
3480    end
3481
3482    case double_declare
3483        expect compile_fail
3484        both ""
3485            precision mediump float;
3486            ${DECLARATIONS}
3487
3488            float func (float f);
3489            float func (float f);
3490
3491            float func (float f)
3492            {
3493                return -f;
3494            }
3495
3496            void main()
3497            {
3498                ${POSITION_FRAG_COLOR} = vec4(func(1.0));
3499            }
3500        ""
3501    end
3502
3503end # invalid
3504