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