• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#X1. Type: float[5]                                // An array type with 5 elements
2#X2. Return value: float[5] func() { ... }                    // Function with a 5-element array return value
3#X3. Array constructor: float[3] (1.0, 2.0, 5.5)                // 3-element array with given elements
4#                                                                    // Fails with array of matrices!
5#X4. As unnamed parameter: void func(float[5]);
6#X5. Variable declaration: float[5] a;                                // Equivalent to float a[5]; (?)
7#X6. Empty brackets: float x[] = float[] (1.0, 2.0, 3.0);    // Size of x is 3
8#                            float y[] = float[3] (1.0, 2.0, 3.0);    // Size of y is 3 (equivalent)
9#                            float z[] = y;                            // Size of z is 3
10#X7. Testing that 2-dimensional arrays don't work: float a[5][3];    // Illegal
11#                                                    float[5] a[3];    // Illegal
12#X8. Testing that array declaration with dynamic variables as array size won't work.
13#X9. Testing length() operator: z.length();                            // Returns 3 for z defined before
14#X10. Test C/C++ style {}-constructor
15#X11. Test struct arrays
16#X12. Test array element access at initialization with const/dynamic values
17
18group constructor "Array constructors"
19
20    case float3
21        version 310 es
22        values
23        {
24            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
25            output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
26        }
27
28        both ""
29            #version 310 es
30            precision highp float;
31            ${DECLARATIONS}
32
33            void main()
34            {
35                ${SETUP}
36                float[3] x;
37                x = float[3] (in0.z, in0.x, in0.y);
38                out0 = vec3(x[0], x[1], x[2]);
39                ${OUTPUT}
40            }
41        ""
42    end
43
44    case float4
45        version 310 es
46        values
47        {
48            input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 0.2) | vec4(7.4, -1.0, 2.0, -1.3) | vec4(3.0, 1.6, -2.0, 0.5) ];
49            output vec4 out0 = [ vec4(2.0, 0.5, 0.2, 1.0) | vec4(2.0, 7.4, -1.3, -1.0) | vec4(-2.0, 3.0, 0.5, 1.6) ];
50        }
51
52        both ""
53            #version 310 es
54            precision highp float;
55            ${DECLARATIONS}
56
57            void main()
58            {
59                ${SETUP}
60                float[4] x;
61                x = float[4] (in0.z, in0.x, in0.w, in0.y);
62                out0 = vec4(x[0], x[1], x[2], x[3]);
63                ${OUTPUT}
64            }
65        ""
66    end
67
68    case int3
69        version 310 es
70        values
71        {
72            input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
73            output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
74        }
75
76        both ""
77            #version 310 es
78            precision highp int;
79            precision highp float;
80            ${DECLARATIONS}
81
82            void main()
83            {
84                ${SETUP}
85                int[3] x;
86                x = int[3] (in0.z, in0.x, in0.y);
87                out0 = ivec3(x[0], x[1], x[2]);
88                ${OUTPUT}
89            }
90        ""
91    end
92
93    case int4
94        version 310 es
95        values
96        {
97            input ivec4 in0 = [ ivec4(0, 1, 2, 0) | ivec4(7, -1, 2, -1) | ivec4(3, 1, -2, 0) ];
98            output ivec4 out0 = [ ivec4(2, 0, 0, 1) | ivec4(2, 7, -1, -1) | ivec4(-2, 3, 0, 1) ];
99        }
100
101        both ""
102            #version 310 es
103            precision highp int;
104            precision highp float;
105            ${DECLARATIONS}
106
107            void main()
108            {
109                ${SETUP}
110                int[4] x;
111                x = int[4] (in0.z, in0.x, in0.w, in0.y);
112                out0 = ivec4(x[0], x[1], x[2], x[3]);
113                ${OUTPUT}
114            }
115        ""
116    end
117
118    case bool3
119        version 310 es
120        values
121        {
122            input bvec3 in0 = [ bvec3(true, true, false) ];
123            output bvec3 out0 = [ bvec3(false, true, true) ];
124        }
125
126        both ""
127            #version 310 es
128            precision highp int;
129            precision highp float;
130            ${DECLARATIONS}
131
132            void main()
133            {
134                ${SETUP}
135                bool[3] x;
136                x = bool[3] (in0.z, in0.x, in0.y);
137                out0 = bvec3(x[0], x[1], x[2]);
138                ${OUTPUT}
139            }
140        ""
141    end
142
143    case bool4
144        version 310 es
145        values
146        {
147            input bvec4 in0 = [ bvec4(true, true, false, false) ];
148            output bvec4 out0 = [ bvec4(false, true, true, false) ];
149        }
150
151        both ""
152            #version 310 es
153            precision highp int;
154            precision highp float;
155            ${DECLARATIONS}
156
157            void main()
158            {
159                ${SETUP}
160                bool[4] x;
161                x = bool[4] (in0.z, in0.x, in0.y, in0.w);
162                out0 = bvec4(x[0], x[1], x[2], x[3]);
163                ${OUTPUT}
164            }
165        ""
166    end
167
168    case struct3
169        version 310 es
170        values
171        {
172            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
173            output vec3 out0 = [ vec3(2.0, -0.5, -1.0) ];
174        }
175
176        both ""
177            #version 310 es
178            precision highp float;
179            ${DECLARATIONS}
180
181
182
183            void main()
184            {
185                ${SETUP}
186
187                struct test
188                {
189                    float f;
190                    vec3 v;
191                };
192
193                test a = test(in0.z, vec3(in0.x, in0.y, in0.z));
194                test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
195                test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x));
196
197                test[3] x = test[3] (a, b, c);
198
199                out0 = vec3(x[0].f, x[1].v.y, x[2].v.x);
200                ${OUTPUT}
201            }
202        ""
203    end
204
205    case struct4
206        version 310 es
207        values
208        {
209            input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 1.5) ];
210            output vec4 out0 = [ vec4(2.0, -0.5, -1.0, -1.5) ];
211        }
212
213        both ""
214            #version 310 es
215            precision highp float;
216            ${DECLARATIONS}
217
218
219            void main()
220            {
221                ${SETUP}
222
223
224                struct test
225                {
226                    float f;
227                    vec3 v;
228                };
229
230                test a = test(in0.z, vec3(in0.x, in0.y, in0.z));
231                test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
232                test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x));
233                test d = test(-in0.w, vec3(-in0.w, -in0.x, -in0.z));
234
235                test[4] x = test[4] (a, b, c, d);
236
237                out0 = vec4(x[0].f, x[1].v.y, x[2].v.x, x[3].v.x);
238                ${OUTPUT}
239            }
240        ""
241    end
242
243
244    case float_vec3
245        version 310 es
246        values
247        {
248            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
249            output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(7.4, -2.0, -1.0) | vec3(3.0, 2.0, 1.6) ];
250        }
251
252        both ""
253            #version 310 es
254            precision highp float;
255            ${DECLARATIONS}
256
257            void main()
258            {
259                ${SETUP}
260
261                vec3[3] x;
262                x = vec3[3] (    vec3(in0.x, in0.y, in0.z)    ,
263                                vec3(-in0.y, -in0.z, -in0.x),
264                                vec3(in0.z, in0.x, in0.y)    );
265                out0 = vec3(x[0].x, x[1].y, x[2].z);
266                ${OUTPUT}
267            }
268        ""
269    end
270
271    case int_vec3
272        version 310 es
273        values
274        {
275            input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
276            output ivec3 out0 = [ ivec3(5, -2, 1) | ivec3(7, -2, -1) | ivec3(3, 2, 1) ];
277        }
278
279        both ""
280            #version 310 es
281            precision highp int;
282            precision highp float;
283            ${DECLARATIONS}
284
285            void main()
286            {
287                ${SETUP}
288
289                ivec3[3] x;
290                x = ivec3[3] (    ivec3(in0.x, in0.y, in0.z)    ,
291                                ivec3(-in0.y, -in0.z, -in0.x),
292                                ivec3(in0.z, in0.x, in0.y)    );
293                out0 = ivec3(x[0].x, x[1].y, x[2].z);
294                ${OUTPUT}
295            }
296        ""
297    end
298
299    case bool_vec3
300        version 310 es
301        values
302        {
303            input bvec3 in0 = [ bvec3(true, false, true) ];
304            output bvec3 out0 = [ bvec3(true, true, false) ];
305        }
306
307        both ""
308            #version 310 es
309            precision highp int;
310            precision highp float;
311            ${DECLARATIONS}
312
313            void main()
314            {
315                ${SETUP}
316
317                bvec3[3] x;
318                x = bvec3[3] (    bvec3(in0.x, in0.y, in0.z)    ,
319                                bvec3(in0.y, in0.z, in0.x),
320                                bvec3(in0.z, in0.x, in0.y)    );
321                out0 = bvec3(x[0].x, x[1].y, x[2].z);
322                ${OUTPUT}
323            }
324        ""
325    end
326
327    case float_mat3
328        version 310 es
329        values
330        {
331            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
332            output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
333        }
334
335        both ""
336            #version 310 es
337            precision highp float;
338            ${DECLARATIONS}
339
340            void main()
341            {
342                ${SETUP}
343                mat3[3] a = mat3[3] (    mat3(    in0.x, in0.y, in0.z,
344                                                in0.x, in0.y, in0.z,
345                                                in0.x, in0.y, in0.z)    ,
346                                        mat3(    in0.z, in0.x, -in0.y,
347                                                in0.z, in0.x, -in0.y,
348                                                in0.z, in0.x, -in0.y)    ,
349                                        mat3(    -in0.z, -in0.z, in0.z,
350                                                -in0.y, -in0.y, in0.y,
351                                                -in0.x, -in0.x, in0.x)    );
352
353                mat3 a0 = a[0];
354                mat3 a1 = a[1];
355                mat3 a2 = a[2];
356
357                float ret0 = a0[2][0];
358                float ret1 = a1[0][2];
359                float ret2 = a2[1][2];
360
361                out0 = vec3(ret0, ret1, ret2);
362                ${OUTPUT}
363            }
364        ""
365    end
366
367    case int_mat3
368        version 310 es
369        values
370        {
371            input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
372            output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
373        }
374
375        both ""
376            #version 310 es
377            precision highp int;
378            precision highp float;
379            ${DECLARATIONS}
380
381            void main()
382            {
383                ${SETUP}
384                mat3[3] a = mat3[3] (    mat3(    in0.x, in0.y, in0.z,
385                                                in0.x, in0.y, in0.z,
386                                                in0.x, in0.y, in0.z)    ,
387                                        mat3(    in0.z, in0.x, -in0.y,
388                                                in0.z, in0.x, -in0.y,
389                                                in0.z, in0.x, -in0.y)    ,
390                                        mat3(    -in0.z, -in0.z, in0.z,
391                                                -in0.y, -in0.y, in0.y,
392                                                -in0.x, -in0.x, in0.x)    );
393
394                mat3 a0 = a[0];
395                mat3 a1 = a[1];
396                mat3 a2 = a[2];
397
398                float ret0 = a0[2][0];
399                float ret1 = a1[0][2];
400                float ret2 = a2[1][2];
401
402                out0 = ivec3(ret0, ret1, ret2);
403                ${OUTPUT}
404            }
405        ""
406    end
407
408    case bool_mat3
409        version 310 es
410        values
411        {
412            input bvec3 in0 = [ bvec3(true, false, true) ];
413            output bvec3 out0 = [ bvec3(true, false, false) ];
414        }
415
416        both ""
417            #version 310 es
418            precision highp int;
419            precision highp float;
420            ${DECLARATIONS}
421
422            void main()
423            {
424                ${SETUP}
425                mat3[3] a = mat3[3] (    mat3(    in0.x, in0.y, in0.z,
426                                                in0.x, in0.y, in0.z,
427                                                in0.x, in0.y, in0.z)    ,
428                                        mat3(    in0.z, in0.x, in0.y,
429                                                in0.z, in0.x, in0.y,
430                                                in0.z, in0.x, in0.y)    ,
431                                        mat3(    in0.z, in0.z, in0.z,
432                                                in0.y, in0.y, in0.y,
433                                                in0.x, in0.x, in0.x)    );
434
435                mat3 a0 = a[0];
436                mat3 a1 = a[1];
437                mat3 a2 = a[2];
438
439                float ret0 = a0[2][0];
440                float ret1 = a1[0][2];
441                float ret2 = a2[1][2];
442
443                out0 = bvec3(ret0, ret1, ret2);
444                ${OUTPUT}
445            }
446        ""
447    end
448
449end # type
450
451group return "Arrays as return value"
452
453    case float
454        version 310 es
455        values
456        {
457            input vec3 in0 =    [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
458            output vec3 out0 = [ vec3(2.0, -0.5, 1.0) | vec3(2.0, -7.4, -1.0) | vec3(-2.0, -3.0, 1.6) ];
459        }
460
461        both ""
462            #version 310 es
463            precision highp float;
464            ${DECLARATIONS}
465
466            float[3] func(vec3 a)
467            {
468                return float[3] (a.z, -a.x, a.y);
469            }
470
471            void main()
472            {
473                ${SETUP}
474                float[3] x = func(in0);
475                out0 = vec3(x[0], x[1], x[2]);
476                ${OUTPUT}
477            }
478        ""
479    end
480
481    case int
482        version 310 es
483        values
484        {
485            input ivec3 in0 = [ ivec3(4, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
486            output ivec3 out0 =    [ ivec3(2, -4, 1) | ivec3(2, -7, -1) | ivec3(-2, -3, 1) ];
487        }
488
489        both ""
490            #version 310 es
491            precision highp int;
492            precision highp float;
493            ${DECLARATIONS}
494
495            int[3] func(ivec3 a)
496            {
497                return int[3] (a.z, -a.x, a.y);
498            }
499
500            void main()
501            {
502                ${SETUP}
503                int[3] x = func(in0);
504                out0 = ivec3(x[0], x[1], x[2]);
505                ${OUTPUT}
506            }
507        ""
508    end
509
510    case bool
511        version 310 es
512        values
513        {
514            input bvec3 in0 =    [ bvec3(false, true, true) ];
515            output bvec3 out0 = [ bvec3(true, false, true) ];
516        }
517
518        both ""
519            #version 310 es
520            precision highp int;
521            precision highp float;
522            ${DECLARATIONS}
523
524            bool[3] func(bvec3 a)
525            {
526                return bool[3] (a.z, a.x, a.y);
527            }
528
529            void main()
530            {
531                ${SETUP}
532                bool[3] x = func(in0);
533                out0 = bvec3(x[0], x[1], x[2]);
534                ${OUTPUT}
535            }
536        ""
537    end
538
539
540
541    case float_vec3
542        version 310 es
543        values
544        {
545            input vec3 in0 =    [ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
546            output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ];
547        }
548
549        both ""
550            #version 310 es
551            precision highp float;
552            ${DECLARATIONS}
553
554            vec3[3] func(vec3[3] a)
555            {
556                return vec3[3] (a[1], a[2], a[0]);
557            }
558
559            void main()
560            {
561                ${SETUP}
562                vec3[3] x = vec3[3](vec3(in0.x, in0.y, -in0.z)    ,
563                                    vec3(in0.y, -in0.z, in0.x)    ,
564                                    vec3(-in0.z, in0.x, in0.y)    );
565                x = func(x);
566                out0 = vec3(x[0].x, x[1].y, x[2].z);
567                ${OUTPUT}
568            }
569        ""
570    end
571
572    case struct
573        version 310 es
574        values
575        {
576            input vec3 in0 =    [ vec3(0.5, 1.0, 2.0) ];
577            output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ];
578        }
579
580        both ""
581            #version 310 es
582            precision highp float;
583            ${DECLARATIONS}
584
585            struct test
586            {
587                float f;
588                vec3 v;
589            };
590
591            test[3] func(test[3] a)
592            {
593                return test[3] (a[1], a[2], a[0]);
594            }
595
596            void main()
597            {
598                ${SETUP}
599
600                test a = test(in0.z, vec3(in0.x, in0.y, in0.z));
601                test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
602                test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x));
603
604                test[3] t = test[3] (a, b, c);
605                test[3] x = func(t);
606
607                out0 = vec3(x[0].v.z, x[1].v.y, x[2].v.x);
608                ${OUTPUT}
609            }
610        ""
611    end
612
613    case int_vec3
614        version 310 es
615        values
616        {
617            input ivec3 in0 =    [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ];
618            output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ];
619        }
620
621        both ""
622            #version 310 es
623            precision highp int;
624            precision highp float;
625            ${DECLARATIONS}
626
627            ivec3[3] func(ivec3[3] a)
628            {
629                return ivec3[3] (a[1], a[2], a[0]);
630            }
631
632            void main()
633            {
634                ${SETUP}
635                ivec3[3] x = ivec3[3](    ivec3(in0.x, in0.y, -in0.z)    ,
636                                        ivec3(in0.y, -in0.z, in0.x)    ,
637                                        ivec3(-in0.z, in0.x, in0.y)    );
638                x = func(x);
639                out0 = ivec3(x[0].x, x[1].y, x[2].z);
640                ${OUTPUT}
641            }
642        ""
643    end
644
645    case bool_vec3
646        version 310 es
647        values
648        {
649            input bvec3 in0 =    [ bvec3(true, false, false) ];
650            output bvec3 out0 = [ bvec3(false, true, false) ];
651        }
652
653        both ""
654            #version 310 es
655            precision highp int;
656            precision highp float;
657            ${DECLARATIONS}
658
659            bvec3[3] func(bvec3[3] a)
660            {
661                return bvec3[3] (a[1], a[2], a[0]);
662            }
663
664            void main()
665            {
666                ${SETUP}
667                bvec3[3] x = bvec3[3](    bvec3(in0.x, in0.y, in0.z)    ,
668                                        bvec3(in0.y, in0.z, in0.x)    ,
669                                        bvec3(in0.z, in0.x, in0.y)    );
670                x = func(x);
671                out0 = bvec3(x[0].x, x[1].y, x[2].z);
672                ${OUTPUT}
673            }
674        ""
675    end
676
677    case float_mat3
678        version 310 es
679        values
680        {
681            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
682            output vec3 out0 = [ vec3(2.0, -1.0, 2.0) | vec3(-2.3, 0.0, -2.3) ];
683        }
684
685        both ""
686            #version 310 es
687            precision highp float;
688            ${DECLARATIONS}
689
690            mat3[3] func(mat3[3] x)
691            {
692                mat3[3] r;
693                r[0] = x[1];
694                r[1] = x[2];
695                r[2] = x[0];
696                return r;
697            }
698
699            void main()
700            {
701                ${SETUP}
702                mat3[3] a, b;
703                a[0] = mat3(in0.x, in0.y, in0.z,
704                            in0.x, in0.y, in0.z,
705                            in0.x, in0.y, in0.z);
706                a[1] = mat3(in0.z, in0.x, -in0.y,
707                            in0.z, in0.x, -in0.y,
708                            in0.z, in0.x, -in0.y);
709                a[2] = mat3(-in0.z, -in0.z, in0.z,
710                            -in0.y, -in0.y, in0.y,
711                            -in0.x, -in0.x, in0.x);
712
713                b = func(a);
714
715                mat3 b0 = b[0];
716                mat3 b1 = b[1];
717                mat3 b2 = b[2];
718
719                float ret0 = b0[0][0];
720                float ret1 = b1[1][1];
721                float ret2 = b2[2][2];
722
723                out0 = vec3(ret0, ret1, ret2);
724                ${OUTPUT}
725            }
726        ""
727    end
728
729    case int_mat3
730        version 310 es
731        values
732        {
733            input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-1, 0, -2) ];
734            output ivec3 out0 = [ ivec3(2, -1, 2) | ivec3(-2, 0, -2) ];
735        }
736
737        both ""
738            #version 310 es
739            precision highp int;
740            precision highp float;
741            ${DECLARATIONS}
742
743            mat3[3] func(mat3[3] x)
744            {
745                mat3[3] r;
746                r[0] = x[1];
747                r[1] = x[2];
748                r[2] = x[0];
749                return r;
750            }
751
752            void main()
753            {
754                ${SETUP}
755                mat3[3] a, b;
756                a[0] = mat3(in0.x, in0.y, in0.z,
757                            in0.x, in0.y, in0.z,
758                            in0.x, in0.y, in0.z);
759                a[1] = mat3(in0.z, in0.x, -in0.y,
760                            in0.z, in0.x, -in0.y,
761                            in0.z, in0.x, -in0.y);
762                a[2] = mat3(-in0.z, -in0.z, in0.z,
763                            -in0.y, -in0.y, in0.y,
764                            -in0.x, -in0.x, in0.x);
765
766                b = func(a);
767
768                mat3 b0 = b[0];
769                mat3 b1 = b[1];
770                mat3 b2 = b[2];
771
772                float ret0 = b0[0][0];
773                float ret1 = b1[1][1];
774                float ret2 = b2[2][2];
775
776                out0 = ivec3(ret0, ret1, ret2);
777                ${OUTPUT}
778            }
779        ""
780    end
781
782    case bool_mat3
783        version 310 es
784        values
785        {
786            input bvec3 in0 = [ bvec3(true, false, true) | bvec3(true, true, false) ];
787            output bvec3 out0 = [ bvec3(true, false, true) | bvec3(false, true, false) ];
788        }
789
790        both ""
791            #version 310 es
792            precision highp int;
793            precision highp float;
794            ${DECLARATIONS}
795
796            mat3[3] func(mat3[3] x)
797            {
798                mat3[3] r;
799                r[0] = x[1];
800                r[1] = x[2];
801                r[2] = x[0];
802                return r;
803            }
804
805            void main()
806            {
807                ${SETUP}
808                mat3[3] a, b;
809                a[0] = mat3(in0.x, in0.y, in0.z,
810                            in0.x, in0.y, in0.z,
811                            in0.x, in0.y, in0.z);
812                a[1] = mat3(in0.z, in0.x, in0.y,
813                            in0.z, in0.x, in0.y,
814                            in0.z, in0.x, in0.y);
815                a[2] = mat3(in0.z, in0.z, in0.z,
816                            in0.y, in0.y, in0.y,
817                            in0.x, in0.x, in0.x);
818
819                b = func(a);
820
821                mat3 b0 = b[0];
822                mat3 b1 = b[1];
823                mat3 b2 = b[2];
824
825                float ret0 = b0[0][0];
826                float ret1 = b1[1][1];
827                float ret2 = b2[2][2];
828
829                out0 = bvec3(ret0, ret1, ret2);
830                ${OUTPUT}
831            }
832        ""
833    end
834
835end # return
836
837group unnamed_parameter "Array type as unnamed parameter of a function prototype"
838
839    case float
840        version 310 es
841        values
842        {
843            input vec3 in0 =    [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
844            output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
845        }
846
847        both ""
848            #version 310 es
849            precision highp float;
850            ${DECLARATIONS}
851
852            float[3] func(float[3]);
853
854            void main()
855            {
856                ${SETUP}
857                float[3] a = float[3] (in0.x, in0.y, in0.z);
858                float[3] b = func(a);
859                out0 = vec3(b[0], b[1], b[2]);
860                ${OUTPUT}
861            }
862
863            float[3] func(float[3] a)
864            {
865                return float[3] (a[2], a[0], a[1]);
866            }
867
868        ""
869    end
870
871    case int
872        version 310 es
873        values
874        {
875            input ivec3 in0 =    [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
876            output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
877        }
878
879        both ""
880            #version 310 es
881            precision highp int;
882            precision highp float;
883            ${DECLARATIONS}
884
885            int[3] func(int[3]);
886
887            void main()
888            {
889                ${SETUP}
890                int[3] a = int[3] (in0.x, in0.y, in0.z);
891                int[3] b = func(a);
892                out0 = ivec3(b[0], b[1], b[2]);
893                ${OUTPUT}
894            }
895
896            int[3] func(int[3] a)
897            {
898                return int[3] (a[2], a[0], a[1]);
899            }
900
901        ""
902    end
903
904    case bool
905        version 310 es
906        values
907        {
908            input bvec3 in0 =    [ bvec3(false, true, true) ];
909            output bvec3 out0 = [ bvec3(true, false, true) ];
910        }
911
912        both ""
913            #version 310 es
914            precision highp int;
915            precision highp float;
916            ${DECLARATIONS}
917
918            bool[3] func(bool[3]);
919
920            void main()
921            {
922                ${SETUP}
923                bool[3] a = bool[3] (in0.x, in0.y, in0.z);
924                bool[3] b = func(a);
925                out0 = bvec3(b[0], b[1], b[2]);
926                ${OUTPUT}
927            }
928
929            bool[3] func(bool[3] a)
930            {
931                return bool[3] (a[2], a[0], a[1]);
932            }
933
934        ""
935    end
936
937    case struct
938        version 310 es
939        values
940        {
941            input vec3 in0 =    [ vec3(0.5, 1.0, 2.0) ];
942            output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ];
943        }
944
945        both ""
946            #version 310 es
947            precision highp float;
948            ${DECLARATIONS}
949
950            struct test
951            {
952                float f;
953                vec3 v;
954            };
955
956            test[3] func(test[3]);
957
958            void main()
959            {
960                ${SETUP}
961
962                test a = test(in0.z, vec3(in0.x, in0.y, in0.z));
963                test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
964                test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x));
965
966                test[3] t = test[3] (a, b, c);
967                test[3] x = func(t);
968                out0 = vec3(x[0].v.z, x[1].v.y, x[2].v.x);
969                ${OUTPUT}
970            }
971
972            test[3] func(test[3] a)
973            {
974                return test[3] (a[1], a[2], a[0]);
975            }
976
977        ""
978    end
979
980    case float_vec3
981        version 310 es
982        values
983        {
984            input vec3 in0 =    [ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
985            output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ];
986        }
987
988        both ""
989            #version 310 es
990            precision highp float;
991            ${DECLARATIONS}
992
993            vec3[3] func(vec3[3]);
994
995            void main()
996            {
997                ${SETUP}
998                vec3[3] x = vec3[3](vec3(in0.x, in0.y, -in0.z)    ,
999                                    vec3(in0.y, -in0.z, in0.x)    ,
1000                                    vec3(-in0.z, in0.x, in0.y)    );
1001                x = func(x);
1002                out0 = vec3(x[0].x, x[1].y, x[2].z);
1003                ${OUTPUT}
1004            }
1005
1006            vec3[3] func(vec3[3] a)
1007            {
1008                return vec3[3] (a[1], a[2], a[0]);
1009            }
1010        ""
1011    end
1012
1013    case int_vec3
1014        version 310 es
1015        values
1016        {
1017            input ivec3 in0 =    [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ];
1018            output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ];
1019        }
1020
1021        both ""
1022            #version 310 es
1023            precision highp int;
1024            precision highp float;
1025            ${DECLARATIONS}
1026
1027            ivec3[3] func(ivec3[3]);
1028
1029            void main()
1030            {
1031                ${SETUP}
1032                ivec3[3] x = ivec3[3](    ivec3(in0.x, in0.y, -in0.z)    ,
1033                                        ivec3(in0.y, -in0.z, in0.x)    ,
1034                                        ivec3(-in0.z, in0.x, in0.y)    );
1035                x = func(x);
1036                out0 = ivec3(x[0].x, x[1].y, x[2].z);
1037                ${OUTPUT}
1038            }
1039
1040            ivec3[3] func(ivec3[3] a)
1041            {
1042                return ivec3[3] (a[1], a[2], a[0]);
1043            }
1044        ""
1045    end
1046
1047    case bool_vec3
1048        version 310 es
1049        values
1050        {
1051            input bvec3 in0 =    [ bvec3(true, false, false) ];
1052            output bvec3 out0 = [ bvec3(false, true, false) ];
1053        }
1054
1055        both ""
1056            #version 310 es
1057            precision highp int;
1058            precision highp float;
1059            ${DECLARATIONS}
1060
1061            bvec3[3] func(bvec3[3]);
1062
1063            void main()
1064            {
1065                ${SETUP}
1066                bvec3[3] x = bvec3[3](    bvec3(in0.x, in0.y, in0.z)    ,
1067                                        bvec3(in0.y, in0.z, in0.x)    ,
1068                                        bvec3(in0.z, in0.x, in0.y)    );
1069                x = func(x);
1070                out0 = bvec3(x[0].x, x[1].y, x[2].z);
1071                ${OUTPUT}
1072            }
1073
1074            bvec3[3] func(bvec3[3] a)
1075            {
1076                return bvec3[3] (a[1], a[2], a[0]);
1077            }
1078
1079        ""
1080    end
1081
1082    case float_mat3
1083        version 310 es
1084        values
1085        {
1086            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
1087            output vec3 out0 = [ vec3(2.0, -1.0, 2.0) | vec3(-2.3, 0.0, -2.3) ];
1088        }
1089
1090        both ""
1091            #version 310 es
1092            precision highp float;
1093            ${DECLARATIONS}
1094
1095            mat3[3] func(mat3[3]);
1096
1097            void main()
1098            {
1099                ${SETUP}
1100                mat3[3] a, b;
1101                a[0] = mat3(in0.x, in0.y, in0.z,
1102                            in0.x, in0.y, in0.z,
1103                            in0.x, in0.y, in0.z);
1104                a[1] = mat3(in0.z, in0.x, -in0.y,
1105                            in0.z, in0.x, -in0.y,
1106                            in0.z, in0.x, -in0.y);
1107                a[2] = mat3(-in0.z, -in0.z, in0.z,
1108                            -in0.y, -in0.y, in0.y,
1109                            -in0.x, -in0.x, in0.x);
1110
1111                b = func(a);
1112
1113                mat3 b0 = b[0];
1114                mat3 b1 = b[1];
1115                mat3 b2 = b[2];
1116
1117                float ret0 = b0[0][0];
1118                float ret1 = b1[1][1];
1119                float ret2 = b2[2][2];
1120
1121                out0 = vec3(ret0, ret1, ret2);
1122                ${OUTPUT}
1123            }
1124
1125            mat3[3] func(mat3[3] x)
1126            {
1127                mat3[3] r;
1128                r[0] = x[1];
1129                r[1] = x[2];
1130                r[2] = x[0];
1131                return r;
1132            }
1133        ""
1134    end
1135
1136    case int_mat3
1137        version 310 es
1138        values
1139        {
1140            input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-1, 0, -2) ];
1141            output ivec3 out0 = [ ivec3(2, -1, 2) | ivec3(-2, 0, -2) ];
1142        }
1143
1144        both ""
1145            #version 310 es
1146            precision highp int;
1147            precision highp float;
1148            ${DECLARATIONS}
1149
1150            mat3[3] func(mat3[3]);
1151
1152            void main()
1153            {
1154                ${SETUP}
1155                mat3[3] a, b;
1156                a[0] = mat3(in0.x, in0.y, in0.z,
1157                            in0.x, in0.y, in0.z,
1158                            in0.x, in0.y, in0.z);
1159                a[1] = mat3(in0.z, in0.x, -in0.y,
1160                            in0.z, in0.x, -in0.y,
1161                            in0.z, in0.x, -in0.y);
1162                a[2] = mat3(-in0.z, -in0.z, in0.z,
1163                            -in0.y, -in0.y, in0.y,
1164                            -in0.x, -in0.x, in0.x);
1165
1166                b = func(a);
1167
1168                mat3 b0 = b[0];
1169                mat3 b1 = b[1];
1170                mat3 b2 = b[2];
1171
1172                float ret0 = b0[0][0];
1173                float ret1 = b1[1][1];
1174                float ret2 = b2[2][2];
1175
1176                out0 = ivec3(ret0, ret1, ret2);
1177                ${OUTPUT}
1178            }
1179
1180            mat3[3] func(mat3[3] x)
1181            {
1182                mat3[3] r;
1183                r[0] = x[1];
1184                r[1] = x[2];
1185                r[2] = x[0];
1186                return r;
1187            }
1188        ""
1189    end
1190
1191    case bool_mat3
1192        version 310 es
1193        values
1194        {
1195            input bvec3 in0 = [ bvec3(true, false, true) | bvec3(true, true, false) ];
1196            output bvec3 out0 = [ bvec3(true, false, true) | bvec3(false, true, false) ];
1197        }
1198
1199        both ""
1200            #version 310 es
1201            precision highp int;
1202            precision highp float;
1203            ${DECLARATIONS}
1204
1205            mat3[3] func(mat3[3]);
1206            void main()
1207            {
1208                ${SETUP}
1209                mat3[3] a, b;
1210                a[0] = mat3(in0.x, in0.y, in0.z,
1211                            in0.x, in0.y, in0.z,
1212                            in0.x, in0.y, in0.z);
1213                a[1] = mat3(in0.z, in0.x, in0.y,
1214                            in0.z, in0.x, in0.y,
1215                            in0.z, in0.x, in0.y);
1216                a[2] = mat3(in0.z, in0.z, in0.z,
1217                            in0.y, in0.y, in0.y,
1218                            in0.x, in0.x, in0.x);
1219
1220                b = func(a);
1221
1222                mat3 b0 = b[0];
1223                mat3 b1 = b[1];
1224                mat3 b2 = b[2];
1225
1226                float ret0 = b0[0][0];
1227                float ret1 = b1[1][1];
1228                float ret2 = b2[2][2];
1229
1230                out0 = bvec3(ret0, ret1, ret2);
1231                ${OUTPUT}
1232            }
1233
1234            mat3[3] func(mat3[3] x)
1235            {
1236                mat3[3] r;
1237                r[0] = x[1];
1238                r[1] = x[2];
1239                r[2] = x[0];
1240                return r;
1241            }
1242        ""
1243    end
1244
1245end # unnamed_parameter
1246
1247group declaration "Declaring arrays"
1248
1249    case implicit_size_float
1250        version 310 es
1251        values
1252        {
1253            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
1254            output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
1255        }
1256
1257        both ""
1258            #version 310 es
1259            precision highp float;
1260            ${DECLARATIONS}
1261
1262            void main()
1263            {
1264                ${SETUP}
1265                float[] x = float[] (in0.z, in0.x, in0.y);
1266                float[] y = x;
1267
1268                out0 = vec3(y[0], y[1], y[2]);
1269                ${OUTPUT}
1270            }
1271        ""
1272    end
1273
1274    case implicit_size_int
1275        version 310 es
1276        values
1277        {
1278            input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
1279            output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
1280        }
1281
1282        both ""
1283            #version 310 es
1284            precision highp int;
1285            precision highp float;
1286            ${DECLARATIONS}
1287
1288            void main()
1289            {
1290                ${SETUP}
1291                int[] x = int[] (in0.z, in0.x, in0.y);
1292                int[] y = x;
1293
1294                out0 = ivec3(y[0], y[1], y[2]);
1295                ${OUTPUT}
1296            }
1297        ""
1298    end
1299
1300    case implicit_size_bool
1301        version 310 es
1302        values
1303        {
1304            input bvec3 in0 = [ bvec3(false, true, true) ];
1305            output bvec3 out0 = [ bvec3(true, false, true) ];
1306        }
1307
1308        both ""
1309            #version 310 es
1310            precision highp int;
1311            precision highp float;
1312            ${DECLARATIONS}
1313
1314            void main()
1315            {
1316                ${SETUP}
1317                bool[] x = bool[] (in0.z, in0.x, in0.y);
1318                bool[] y = x;
1319
1320                out0 = bvec3(y[0], y[1], y[2]);
1321                ${OUTPUT}
1322            }
1323        ""
1324    end
1325
1326    case implicit_size_struct
1327        version 310 es
1328        values
1329        {
1330            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
1331            output vec3 out0 = [ vec3(-1.0, -0.5, 2.0) ];
1332        }
1333
1334        both ""
1335            #version 310 es
1336            precision highp float;
1337            ${DECLARATIONS}
1338
1339            struct test
1340            {
1341                float f;
1342                vec3 v;
1343            };
1344
1345            void main()
1346            {
1347                ${SETUP}
1348
1349                test a = test(in0.z, vec3(in0.x, in0.y, in0.z));
1350                test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
1351                test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x));
1352
1353                test[] x = test[] (c, b, a);
1354                test[] y = x;
1355
1356                out0 = vec3(y[0].v.x, y[1].v.y, y[2].v.z);
1357                ${OUTPUT}
1358            }
1359        ""
1360    end
1361
1362    case implicit_size_float_vec3
1363        version 310 es
1364        values
1365        {
1366            input vec3 in0 =    [ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
1367            output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(-0.5, 1.0, 11.2) ];
1368        }
1369
1370        both ""
1371            #version 310 es
1372            precision highp float;
1373            ${DECLARATIONS}
1374
1375            void main()
1376            {
1377                ${SETUP}
1378                vec3[] x = vec3[] (    vec3(in0.x, in0.y, -in0.z)    ,
1379                                    vec3(in0.y, -in0.z, in0.x)    ,
1380                                    vec3(-in0.z, in0.x, in0.y)    );
1381                vec3[] y = x;
1382                out0 = vec3(y[0].x, y[1].y, y[2].z);
1383                ${OUTPUT}
1384            }
1385        ""
1386    end
1387
1388    case implicit_size_int_ivec3
1389        version 310 es
1390        values
1391        {
1392            input ivec3 in0 =    [ ivec3(0, 1, 2) | ivec3(5, 11, -1) ];
1393            output ivec3 out0 = [ ivec3(0, -2, 1) | ivec3(5, 1, 11) ];
1394        }
1395
1396        both ""
1397            #version 310 es
1398            precision highp int;
1399            precision highp float;
1400            ${DECLARATIONS}
1401
1402            void main()
1403            {
1404                ${SETUP}
1405                ivec3[] x = ivec3[] (    ivec3(in0.x, in0.y, -in0.z)    ,
1406                                        ivec3(in0.y, -in0.z, in0.x)    ,
1407                                        ivec3(-in0.z, in0.x, in0.y)    );
1408                ivec3[] y = x;
1409                out0 = ivec3(y[0].x, y[1].y, y[2].z);
1410                ${OUTPUT}
1411            }
1412        ""
1413    end
1414
1415    case implicit_size_bool_bvec3
1416        version 310 es
1417        values
1418        {
1419            input bvec3 in0 =    [ bvec3(true, false, true) ];
1420            output bvec3 out0 = [ bvec3(true, true, false) ];
1421        }
1422
1423        both ""
1424            #version 310 es
1425            precision highp int;
1426            precision highp float;
1427            ${DECLARATIONS}
1428
1429            void main()
1430            {
1431                ${SETUP}
1432                bvec3[] x = bvec3[] (    bvec3(in0.x, in0.y, in0.z)    ,
1433                                        bvec3(in0.y, in0.z, in0.x)    ,
1434                                        bvec3(in0.z, in0.x, in0.y)    );
1435                bvec3[] y = x;
1436                out0 = bvec3(y[0].x, y[1].y, y[2].z);
1437                ${OUTPUT}
1438            }
1439        ""
1440    end
1441
1442    case implicit_size_float_mat3
1443        version 310 es
1444        values
1445        {
1446            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
1447            output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
1448        }
1449
1450        both ""
1451            #version 310 es
1452            precision highp float;
1453            ${DECLARATIONS}
1454
1455            void main()
1456            {
1457                ${SETUP}
1458                mat3[] a = mat3[] (    mat3(    in0.x, in0.y, in0.z,
1459                                            in0.x, in0.y, in0.z,
1460                                            in0.x, in0.y, in0.z)    ,
1461                                    mat3(    in0.z, in0.x, -in0.y,
1462                                            in0.z, in0.x, -in0.y,
1463                                            in0.z, in0.x, -in0.y)    ,
1464                                    mat3(    -in0.z, -in0.z, in0.z,
1465                                            -in0.y, -in0.y, in0.y,
1466                                            -in0.x, -in0.x, in0.x)    );
1467
1468                mat3 a0 = a[0];
1469                mat3 a1 = a[1];
1470                mat3 a2 = a[2];
1471
1472                float ret0 = a0[2][0];
1473                float ret1 = a1[0][2];
1474                float ret2 = a2[1][2];
1475
1476                out0 = vec3(ret0, ret1, ret2);
1477                ${OUTPUT}
1478            }
1479        ""
1480    end
1481
1482    case implicit_size_int_mat3
1483        version 310 es
1484        values
1485        {
1486            input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
1487            output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
1488        }
1489
1490        both ""
1491            #version 310 es
1492            precision highp int;
1493            precision highp float;
1494            ${DECLARATIONS}
1495
1496            void main()
1497            {
1498                ${SETUP}
1499                mat3[] a = mat3[] (    mat3(    in0.x, in0.y, in0.z,
1500                                            in0.x, in0.y, in0.z,
1501                                            in0.x, in0.y, in0.z)    ,
1502                                    mat3(    in0.z, in0.x, -in0.y,
1503                                            in0.z, in0.x, -in0.y,
1504                                            in0.z, in0.x, -in0.y)    ,
1505                                    mat3(    -in0.z, -in0.z, in0.z,
1506                                            -in0.y, -in0.y, in0.y,
1507                                            -in0.x, -in0.x, in0.x)    );
1508
1509                mat3 a0 = a[0];
1510                mat3 a1 = a[1];
1511                mat3 a2 = a[2];
1512
1513                float ret0 = a0[2][0];
1514                float ret1 = a1[0][2];
1515                float ret2 = a2[1][2];
1516
1517                out0 = ivec3(ret0, ret1, ret2);
1518                ${OUTPUT}
1519            }
1520        ""
1521    end
1522
1523    case implicit_size_bool_mat3
1524        version 310 es
1525        values
1526        {
1527            input bvec3 in0 = [ bvec3(true, false, true) ];
1528            output bvec3 out0 = [ bvec3(true, false, false) ];
1529        }
1530
1531        both ""
1532            #version 310 es
1533            precision highp int;
1534            precision highp float;
1535            ${DECLARATIONS}
1536
1537            void main()
1538            {
1539                ${SETUP}
1540                mat3[] a = mat3[] (    mat3(    in0.x, in0.y, in0.z,
1541                                            in0.x, in0.y, in0.z,
1542                                            in0.x, in0.y, in0.z)    ,
1543                                    mat3(    in0.z, in0.x, in0.y,
1544                                            in0.z, in0.x, in0.y,
1545                                            in0.z, in0.x, in0.y)    ,
1546                                    mat3(    in0.z, in0.z, in0.z,
1547                                            in0.y, in0.y, in0.y,
1548                                            in0.x, in0.x, in0.x)    );
1549
1550                mat3 a0 = a[0];
1551                mat3 a1 = a[1];
1552                mat3 a2 = a[2];
1553
1554                float ret0 = a0[2][0];
1555                float ret1 = a1[0][2];
1556                float ret2 = a2[1][2];
1557
1558                out0 = bvec3(ret0, ret1, ret2);
1559                ${OUTPUT}
1560            }
1561        ""
1562    end
1563
1564
1565    case constant_expression_array_size
1566        version 310 es
1567
1568        both ""
1569            #version 310 es
1570            precision highp float;
1571            ${DECLARATIONS}
1572
1573            const int a = 4;
1574
1575            void main ()
1576            {
1577                const int b = 5;
1578                float[a] array1;
1579                float[b] array2;
1580                float[array1.length()] array3;
1581                float[a+b] array4;
1582                ${OUTPUT}
1583            }
1584        ""
1585    end
1586
1587    case constant_expression_array_access
1588        version 310 es
1589        values
1590        {
1591            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
1592            output vec3 out0 = [ vec3(-2.0, -1.0, -0.5) ];
1593        }
1594
1595        both ""
1596            #version 310 es
1597            precision highp float;
1598            ${DECLARATIONS}
1599
1600            const int a = 3;
1601
1602            void main ()
1603            {
1604                ${SETUP}
1605                const int b = 2;
1606                float x = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [a];
1607                float y = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [b+2];
1608                float z = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [5];
1609                out0 = vec3(x, y, z);
1610                ${OUTPUT}
1611            }
1612        ""
1613    end
1614
1615    case dynamic_expression_array_access
1616        version 310 es
1617        values
1618        {
1619            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
1620            input ivec2 in1 = ivec2(3, 2);
1621            output vec3 out0 = [ vec3(-2.0, -1.0, -0.5) ];
1622        }
1623
1624        both ""
1625            #version 310 es
1626            precision highp int;
1627            precision highp float;
1628            ${DECLARATIONS}
1629
1630            void main ()
1631            {
1632                ${SETUP}
1633                float x = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.x];
1634                float y = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.y+2];
1635                float z = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.x+in1.y];
1636                out0 = vec3(x, y, z);
1637                ${OUTPUT}
1638            }
1639        ""
1640    end
1641
1642    case multiple_declarations_single_statement_explicit
1643        version 310 es
1644        values
1645        {
1646            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
1647            output vec3 out0 = [ vec3(2.0, -1.0, 0.5) ];
1648        }
1649
1650        both ""
1651            #version 310 es
1652            precision highp float;
1653            ${DECLARATIONS}
1654
1655            void main ()
1656            {
1657                ${SETUP}
1658                float[] x = float[6] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
1659                        y = float[2] (in0.x, -in0.y);
1660                out0 = vec3(x[2], y[1], x[0]);
1661                ${OUTPUT}
1662            }
1663        ""
1664    end
1665
1666    case multiple_declarations_single_statement_implicit
1667        version 310 es
1668        values
1669        {
1670            input ivec3 in0 = [ ivec3(5, 1, 2) ];
1671            output ivec3 out0 = [ ivec3(2, -1, 5) ];
1672        }
1673
1674        both ""
1675            #version 310 es
1676            precision highp int;
1677            precision highp float;
1678            ${DECLARATIONS}
1679
1680            void main ()
1681            {
1682                ${SETUP}
1683                int[] x = int[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
1684                      y = int[] (in0.x, -in0.y);
1685                out0 = ivec3(x[2], y[1], x[0]);
1686                ${OUTPUT}
1687            }
1688        ""
1689    end
1690
1691end # declaration
1692
1693group length "Array length method"
1694
1695    case float
1696        version 310 es
1697        values
1698        {
1699            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
1700            output ivec3 out0 = [ ivec3(3, 5, 13) ];
1701        }
1702
1703        both ""
1704            #version 310 es
1705            precision highp float;
1706            ${DECLARATIONS}
1707
1708            void main()
1709            {
1710                ${SETUP}
1711                float[] x = float[3] (in0.z, in0.x, in0.y);
1712                float[] y = float[] (in0.z, in0.x, in0.y, in0.x, in0.y);
1713                float[13] z;
1714
1715                out0 = ivec3(x.length(), y.length(), z.length());
1716                ${OUTPUT}
1717            }
1718        ""
1719    end
1720
1721    case int
1722        version 310 es
1723        values
1724        {
1725            input ivec3 in0 = [ ivec3(0, 1, 2) ];
1726            output ivec3 out0 = [ ivec3(3, 5, 13) ];
1727        }
1728
1729        both ""
1730            #version 310 es
1731            precision highp int;
1732            precision highp float;
1733            ${DECLARATIONS}
1734
1735            void main()
1736            {
1737                ${SETUP}
1738                int[] x = int[3] (in0.z, in0.x, in0.y);
1739                int[] y = int[] (in0.z, in0.x, in0.y, in0.x, in0.y);
1740                int[13] z;
1741
1742                out0 = ivec3(x.length(), y.length(), z.length());
1743                ${OUTPUT}
1744            }
1745        ""
1746    end
1747
1748    case bool
1749        version 310 es
1750        values
1751        {
1752            input bvec3 in0 = [ bvec3(true, false, true) ];
1753            output ivec3 out0 = [ ivec3(3, 5, 13) ];
1754        }
1755
1756        both ""
1757            #version 310 es
1758            precision highp int;
1759            precision highp float;
1760            ${DECLARATIONS}
1761
1762            void main()
1763            {
1764                ${SETUP}
1765                bool[] x = bool[3] (in0.z, in0.x, in0.y);
1766                bool[] y = bool[] (in0.z, in0.x, in0.y, in0.x, in0.y);
1767                bool[13] z;
1768
1769                out0 = ivec3(x.length(), y.length(), z.length());
1770                ${OUTPUT}
1771            }
1772        ""
1773    end
1774
1775    case struct
1776        version 310 es
1777        values
1778        {
1779            input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
1780            output ivec3 out0 = [ ivec3(3, 5, 13) ];
1781        }
1782
1783        both ""
1784            #version 310 es
1785            precision highp float;
1786            ${DECLARATIONS}
1787
1788            struct test
1789            {
1790                float f;
1791                vec3 v;
1792            };
1793
1794            void main()
1795            {
1796                ${SETUP}
1797
1798                test a = test(in0.z, vec3(in0.x, in0.y, in0.z));
1799                test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
1800                test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x));
1801
1802                test[] x = test[3] (a, b, c);
1803                test[] y = test[] (c, a, b, b, a);
1804                test[13] z;
1805
1806                out0 = ivec3(x.length(), y.length(), z.length());
1807                ${OUTPUT}
1808            }
1809        ""
1810    end
1811
1812end # length
1813