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