Add RENDERBUFFER_VALID bit to R8, RG8 definition am: 1d7c8df82e
[platform/upstream/VK-GL-CTS.git] / data / gles2 / shaders / functions.test
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
10 group 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
577 end # datatypes
578
579 group 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
1289 end # qualifiers
1290
1291 group 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
1371 end # declarations
1372
1373 group 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
1673 end # overloading
1674
1675 group 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
2106 end # array_arguments
2107
2108 #group qualifiers "Function Parameter Qualifiers"
2109 #
2110 #end # qualifiers
2111
2112 group 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
2466 end # control_flow
2467
2468 group 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
2619 end # misc
2620
2621 group 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
3503 end # invalid