1
2group varying "Default block varying matching"
3
4	case missing_input
5		version 310 es
6		desc "Variable has no matching input"
7		expect validation_fail
8
9		pipeline_program
10			active_stages {vertex}
11			vertex ""
12				#version 310 es
13				${VERTEX_DECLARATIONS}
14				out mediump float v_val;
15				out mediump float v_val_no_such_input;
16				void main()
17				{
18					v_val = float(gl_VertexID);
19					v_val_no_such_input = 1.0;
20					${VERTEX_OUTPUT}
21				}
22			""
23		end
24		pipeline_program
25			active_stages {fragment}
26			fragment ""
27				#version 310 es
28				${FRAGMENT_DECLARATIONS}
29				in mediump float v_val;
30				void main()
31				{
32					${FRAG_COLOR} = vec4(v_val);
33				}
34			""
35		end
36	end
37
38	case missing_output
39		version 310 es
40		desc "Variable has no matching output"
41		expect validation_fail
42
43		pipeline_program
44			active_stages {vertex}
45			vertex ""
46				#version 310 es
47				${VERTEX_DECLARATIONS}
48				out mediump float v_val;
49				void main()
50				{
51					v_val = float(gl_VertexID);
52					${VERTEX_OUTPUT}
53				}
54			""
55		end
56		pipeline_program
57			active_stages {fragment}
58			fragment ""
59				#version 310 es
60				${FRAGMENT_DECLARATIONS}
61				in mediump float v_val;
62				in mediump float v_val_no_such_output;
63				void main()
64				{
65					${FRAG_COLOR} = vec4(v_val + v_val_no_such_output);
66				}
67			""
68		end
69	end
70
71	case mismatch_type
72		version 310 es
73		desc "Variable type mismatch"
74		expect validation_fail
75
76		pipeline_program
77			active_stages {vertex}
78			vertex ""
79				#version 310 es
80				${VERTEX_DECLARATIONS}
81				out mediump vec3 v_val;
82				void main()
83				{
84					v_val = vec3(float(gl_VertexID));
85					${VERTEX_OUTPUT}
86				}
87			""
88		end
89		pipeline_program
90			active_stages {fragment}
91			fragment ""
92				#version 310 es
93				${FRAGMENT_DECLARATIONS}
94				in mediump vec4 v_val;
95				void main()
96				{
97					${FRAG_COLOR} = v_val;
98				}
99			""
100		end
101	end
102
103	case mismatch_precision
104		version 310 es
105		desc "Variable precision mismatch"
106		expect validation_fail
107
108		pipeline_program
109			active_stages {vertex}
110			vertex ""
111				#version 310 es
112				${VERTEX_DECLARATIONS}
113				out mediump float v_val;
114				void main()
115				{
116					v_val = float(gl_VertexID);
117					${VERTEX_OUTPUT}
118				}
119			""
120		end
121		pipeline_program
122			active_stages {fragment}
123			fragment ""
124				#version 310 es
125				${FRAGMENT_DECLARATIONS}
126				in highp float v_val;
127				void main()
128				{
129					${FRAG_COLOR} = vec4(v_val);
130				}
131			""
132		end
133	end
134
135	case mismatch_explicit_location_type
136		version 310 es
137		desc "Variable type mismatch, explicit varying locations"
138		expect validation_fail
139
140		pipeline_program
141			active_stages {vertex}
142			vertex ""
143				#version 310 es
144				${VERTEX_DECLARATIONS}
145				layout(location = 3) out mediump vec4 v_val;
146				void main()
147				{
148					v_val = vec4(float(gl_VertexID));
149					${VERTEX_OUTPUT}
150				}
151			""
152		end
153		pipeline_program
154			active_stages {fragment}
155			fragment ""
156				#version 310 es
157				${FRAGMENT_DECLARATIONS}
158				layout(location = 3) in mediump vec2 v_val;
159				void main()
160				{
161					${FRAG_COLOR} = v_val.xxyy;
162				}
163			""
164		end
165	end
166
167	case mismatch_explicit_location_precision
168		version 310 es
169		desc "Variable precision mismatch, explicit varying locations"
170		expect validation_fail
171
172		pipeline_program
173			active_stages {vertex}
174			vertex ""
175				#version 310 es
176				${VERTEX_DECLARATIONS}
177				layout(location = 3) out mediump float v_val;
178				void main()
179				{
180					v_val = float(gl_VertexID);
181					${VERTEX_OUTPUT}
182				}
183			""
184		end
185		pipeline_program
186			active_stages {fragment}
187			fragment ""
188				#version 310 es
189				${FRAGMENT_DECLARATIONS}
190				layout(location = 3) in highp float v_val;
191				void main()
192				{
193					${FRAG_COLOR} = vec4(v_val);
194				}
195			""
196		end
197	end
198
199	case mismatch_explicit_location
200		version 310 es
201		desc "Variable location mismatch"
202		expect validation_fail
203
204		pipeline_program
205			active_stages {vertex}
206			vertex ""
207				#version 310 es
208				${VERTEX_DECLARATIONS}
209				layout(location = 3) out mediump float v_val;
210				void main()
211				{
212					v_val = float(gl_VertexID);
213					${VERTEX_OUTPUT}
214				}
215			""
216		end
217		pipeline_program
218			active_stages {fragment}
219			fragment ""
220				#version 310 es
221				${FRAGMENT_DECLARATIONS}
222				layout(location = 4) in mediump float v_val;
223				void main()
224				{
225					${FRAG_COLOR} = vec4(v_val);
226				}
227			""
228		end
229	end
230
231	case mismatch_implicit_explicit_location_1
232		version 310 es
233		desc "Variable location mismatch"
234		expect validation_fail
235
236		pipeline_program
237			active_stages {vertex}
238			vertex ""
239				#version 310 es
240				${VERTEX_DECLARATIONS}
241				out mediump float v_val;
242				void main()
243				{
244					v_val = float(gl_VertexID);
245					${VERTEX_OUTPUT}
246				}
247			""
248		end
249		pipeline_program
250			active_stages {fragment}
251			fragment ""
252				#version 310 es
253				${FRAGMENT_DECLARATIONS}
254				layout(location = 3) in mediump float v_val;
255				void main()
256				{
257					${FRAG_COLOR} = vec4(v_val);
258				}
259			""
260		end
261	end
262
263	case mismatch_implicit_explicit_location_2
264		version 310 es
265		desc "Variable location mismatch"
266		expect validation_fail
267
268		pipeline_program
269			active_stages {vertex}
270			vertex ""
271				#version 310 es
272				${VERTEX_DECLARATIONS}
273				layout(location = 3) out mediump float v_val;
274				void main()
275				{
276					v_val = float(gl_VertexID);
277					${VERTEX_OUTPUT}
278				}
279			""
280		end
281		pipeline_program
282			active_stages {fragment}
283			fragment ""
284				#version 310 es
285				${FRAGMENT_DECLARATIONS}
286				in mediump float v_val;
287				layout(location = 3) in mediump float v_val_other_name;
288				void main()
289				{
290					${FRAG_COLOR} = vec4(v_val + v_val_other_name);
291				}
292			""
293		end
294	end
295
296	case mismatch_implicit_explicit_location_3
297		version 310 es
298		desc "Variable location mismatch"
299		expect validation_fail
300
301		pipeline_program
302			active_stages {vertex}
303			vertex ""
304				#version 310 es
305				${VERTEX_DECLARATIONS}
306				out mediump float v_val;
307				layout(location = 3) out mediump float v_val_other_name;
308				void main()
309				{
310					v_val = float(gl_VertexID);
311					v_val_other_name = 1.0;
312					${VERTEX_OUTPUT}
313				}
314			""
315		end
316		pipeline_program
317			active_stages {fragment}
318			fragment ""
319				#version 310 es
320				${FRAGMENT_DECLARATIONS}
321				layout(location = 3) in mediump float v_val;
322				void main()
323				{
324					${FRAG_COLOR} = vec4(v_val);
325				}
326			""
327		end
328	end
329
330	case mismatch_different_struct_names
331		version 310 es
332		desc "Variable struct names different but otherwise identical"
333		expect validation_fail
334
335		pipeline_program
336			active_stages {vertex}
337			vertex ""
338				#version 310 es
339				${VERTEX_DECLARATIONS}
340				struct StructureNameA
341				{
342					mediump float member;
343				};
344				out StructureNameA v_val;
345				void main()
346				{
347					v_val.member = float(gl_VertexID);
348					${VERTEX_OUTPUT}
349				}
350			""
351		end
352		pipeline_program
353			active_stages {fragment}
354			fragment ""
355				#version 310 es
356				${FRAGMENT_DECLARATIONS}
357				struct StructureNameB
358				{
359					mediump float member;
360				};
361				in StructureNameB v_val;
362				void main()
363				{
364					// should always produce white
365					${FRAG_COLOR} = (v_val.member > -1.0) ? (vec4(1.0)) : (vec4(0.0));
366				}
367			""
368		end
369	end
370
371	case mismatch_struct_member_name
372		version 310 es
373		desc "Struct member name mismatch"
374		expect validation_fail
375
376		pipeline_program
377			active_stages {vertex}
378			vertex ""
379				#version 310 es
380				${VERTEX_DECLARATIONS}
381				struct StructureName
382				{
383					mediump float member;
384				};
385				out StructureName v_val;
386				void main()
387				{
388					v_val.member = float(gl_VertexID);
389					${VERTEX_OUTPUT}
390				}
391			""
392		end
393		pipeline_program
394			active_stages {fragment}
395			fragment ""
396				#version 310 es
397				${FRAGMENT_DECLARATIONS}
398				struct StructureName
399				{
400					mediump float member_different_name;
401				};
402				in StructureName v_val;
403				void main()
404				{
405					${FRAG_COLOR} = vec4(v_val.member_different_name);
406				}
407			""
408		end
409	end
410
411	case mismatch_struct_member_type
412		version 310 es
413		desc "Struct member type mismatch"
414		expect validation_fail
415
416		pipeline_program
417			active_stages {vertex}
418			vertex ""
419				#version 310 es
420				${VERTEX_DECLARATIONS}
421				struct StructureName
422				{
423					mediump float member;
424				};
425				out StructureName v_val;
426				void main()
427				{
428					v_val.member = float(gl_VertexID);
429					${VERTEX_OUTPUT}
430				}
431			""
432		end
433		pipeline_program
434			active_stages {fragment}
435			fragment ""
436				#version 310 es
437				${FRAGMENT_DECLARATIONS}
438				struct StructureName
439				{
440					mediump vec2 member;
441				};
442				in StructureName v_val;
443				void main()
444				{
445					${FRAG_COLOR} = vec4(v_val.member.x);
446				}
447			""
448		end
449	end
450
451	case mismatch_struct_member_precision
452		version 310 es
453		desc "Struct member precision mismatch"
454		expect validation_fail
455
456		pipeline_program
457			active_stages {vertex}
458			vertex ""
459				#version 310 es
460				${VERTEX_DECLARATIONS}
461				struct StructureName
462				{
463					mediump float member;
464				};
465				out StructureName v_val;
466				void main()
467				{
468					v_val.member = float(gl_VertexID);
469					${VERTEX_OUTPUT}
470				}
471			""
472		end
473		pipeline_program
474			active_stages {fragment}
475			fragment ""
476				#version 310 es
477				${FRAGMENT_DECLARATIONS}
478				struct StructureName
479				{
480					highp float member;
481				};
482				in StructureName v_val;
483				void main()
484				{
485					${FRAG_COLOR} = vec4(v_val.member);
486				}
487			""
488		end
489	end
490
491	case mismatch_struct_member_order
492		version 310 es
493		desc "Struct member order mismatch"
494		expect validation_fail
495
496		pipeline_program
497			active_stages {vertex}
498			vertex ""
499				#version 310 es
500				${VERTEX_DECLARATIONS}
501				struct StructureName
502				{
503					mediump float memberA;
504					mediump float memberB;
505				};
506				out StructureName v_val;
507				void main()
508				{
509					v_val.memberA = float(gl_VertexID);
510					v_val.memberB = 1.0;
511					${VERTEX_OUTPUT}
512				}
513			""
514		end
515		pipeline_program
516			active_stages {fragment}
517			fragment ""
518				#version 310 es
519				${FRAGMENT_DECLARATIONS}
520				struct StructureName
521				{
522					mediump float memberB;
523					mediump float memberA;
524				};
525				in StructureName v_val;
526				void main()
527				{
528					${FRAG_COLOR} = vec4(v_val.memberA + v_val.memberB);
529				}
530			""
531		end
532	end
533
534	case mismatch_array_element_type
535		version 310 es
536		desc "Array element type mismatch"
537		expect validation_fail
538
539		pipeline_program
540			active_stages {vertex}
541			vertex ""
542				#version 310 es
543				${VERTEX_DECLARATIONS}
544				out mediump float v_val[2];
545				void main()
546				{
547					v_val[0] = 1.0;
548					v_val[1] = 2.0;
549					${VERTEX_OUTPUT}
550				}
551			""
552		end
553		pipeline_program
554			active_stages {fragment}
555			fragment ""
556				#version 310 es
557				${FRAGMENT_DECLARATIONS}
558				in mediump vec2 v_val[2];
559				void main()
560				{
561					${FRAG_COLOR} = vec4(v_val[0].x + v_val[1].y);
562				}
563			""
564		end
565	end
566
567	case mismatch_array_length
568		version 310 es
569		desc "Array length mismatch"
570		expect validation_fail
571
572		pipeline_program
573			active_stages {vertex}
574			vertex ""
575				#version 310 es
576				${VERTEX_DECLARATIONS}
577				out mediump float v_val[2];
578				void main()
579				{
580					v_val[0] = 1.0;
581					v_val[1] = 2.0;
582					${VERTEX_OUTPUT}
583				}
584			""
585		end
586		pipeline_program
587			active_stages {fragment}
588			fragment ""
589				#version 310 es
590				${FRAGMENT_DECLARATIONS}
591				in mediump float v_val[3];
592				void main()
593				{
594					${FRAG_COLOR} = vec4(v_val[0] + v_val[1] + v_val[2]);
595				}
596			""
597		end
598	end
599
600	case mismatch_array_precision
601		version 310 es
602		desc "Array length mismatch"
603		expect validation_fail
604
605		pipeline_program
606			active_stages {vertex}
607			vertex ""
608				#version 310 es
609				${VERTEX_DECLARATIONS}
610				out mediump float v_val[2];
611				void main()
612				{
613					v_val[0] = 1.0;
614					v_val[1] = 2.0;
615					${VERTEX_OUTPUT}
616				}
617			""
618		end
619		pipeline_program
620			active_stages {fragment}
621			fragment ""
622				#version 310 es
623				${FRAGMENT_DECLARATIONS}
624				in highp float v_val[2];
625				void main()
626				{
627					${FRAG_COLOR} = vec4(v_val[0] + v_val[1]);
628				}
629			""
630		end
631	end
632
633	case mismatch_qualifier_vertex_flat_fragment_none
634		version 310 es
635		desc "Interpolation qualifier mismatch"
636		expect validation_fail
637
638		pipeline_program
639			active_stages {vertex}
640			vertex ""
641				#version 310 es
642				${VERTEX_DECLARATIONS}
643				out flat highp vec4 v_val;
644				void main()
645				{
646					v_val = vec4(float(gl_VertexID));
647					${VERTEX_OUTPUT}
648				}
649			""
650		end
651		pipeline_program
652			active_stages {fragment}
653			fragment ""
654				#version 310 es
655				${FRAGMENT_DECLARATIONS}
656				in highp vec4 v_val;
657				void main()
658				{
659					${FRAG_COLOR} = v_val;
660				}
661			""
662		end
663	end
664
665	case mismatch_qualifier_vertex_flat_fragment_smooth
666		version 310 es
667		desc "Interpolation qualifier mismatch"
668		expect validation_fail
669
670		pipeline_program
671			active_stages {vertex}
672			vertex ""
673				#version 310 es
674				${VERTEX_DECLARATIONS}
675				out flat highp vec4 v_val;
676				void main()
677				{
678					v_val = vec4(float(gl_VertexID));
679					${VERTEX_OUTPUT}
680				}
681			""
682		end
683		pipeline_program
684			active_stages {fragment}
685			fragment ""
686				#version 310 es
687				${FRAGMENT_DECLARATIONS}
688				in smooth highp vec4 v_val;
689				void main()
690				{
691					${FRAG_COLOR} = v_val;
692				}
693			""
694		end
695	end
696
697	case mismatch_qualifier_vertex_flat_fragment_centroid
698		version 310 es
699		desc "Interpolation qualifier mismatch"
700		expect validation_fail
701
702		pipeline_program
703			active_stages {vertex}
704			vertex ""
705				#version 310 es
706				${VERTEX_DECLARATIONS}
707				out flat highp vec4 v_val;
708				void main()
709				{
710					v_val = vec4(float(gl_VertexID));
711					${VERTEX_OUTPUT}
712				}
713			""
714		end
715		pipeline_program
716			active_stages {fragment}
717			fragment ""
718				#version 310 es
719				${FRAGMENT_DECLARATIONS}
720				in centroid highp vec4 v_val;
721				void main()
722				{
723					${FRAG_COLOR} = v_val;
724				}
725			""
726		end
727	end
728
729	case mismatch_qualifier_vertex_smooth_fragment_flat
730		version 310 es
731		desc "Interpolation qualifier mismatch"
732		expect validation_fail
733
734		pipeline_program
735			active_stages {vertex}
736			vertex ""
737				#version 310 es
738				${VERTEX_DECLARATIONS}
739				out smooth highp vec4 v_val;
740				void main()
741				{
742					v_val = vec4(float(gl_VertexID));
743					${VERTEX_OUTPUT}
744				}
745			""
746		end
747		pipeline_program
748			active_stages {fragment}
749			fragment ""
750				#version 310 es
751				${FRAGMENT_DECLARATIONS}
752				in flat highp vec4 v_val;
753				void main()
754				{
755					${FRAG_COLOR} = v_val;
756				}
757			""
758		end
759	end
760
761	case mismatch_qualifier_vertex_centroid_fragment_flat
762		version 310 es
763		desc "Interpolation qualifier mismatch"
764		expect validation_fail
765
766		pipeline_program
767			active_stages {vertex}
768			vertex ""
769				#version 310 es
770				${VERTEX_DECLARATIONS}
771				out centroid highp vec4 v_val;
772				void main()
773				{
774					v_val = vec4(float(gl_VertexID));
775					${VERTEX_OUTPUT}
776				}
777			""
778		end
779		pipeline_program
780			active_stages {fragment}
781			fragment ""
782				#version 310 es
783				${FRAGMENT_DECLARATIONS}
784				in flat highp vec4 v_val;
785				void main()
786				{
787					${FRAG_COLOR} = v_val;
788				}
789			""
790		end
791	end
792end
793
794group io_blocks "shader io blocks"
795
796	case missing_input
797		version 310 es
798		desc "Missing input block"
799		expect validation_fail
800
801		pipeline_program
802			active_stages {vertex}
803			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
804			vertex ""
805				#version 310 es
806				${VERTEX_DECLARATIONS}
807				out IOBlockName
808				{
809					mediump float v_val;
810				};
811				void main()
812				{
813					v_val = 1.0;
814					${VERTEX_OUTPUT}
815				}
816			""
817		end
818		pipeline_program
819			active_stages {fragment}
820			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
821			fragment ""
822				#version 310 es
823				${FRAGMENT_DECLARATIONS}
824				void main()
825				{
826					${FRAG_COLOR} = vec4(1.0);
827				}
828			""
829		end
830	end
831
832	case missing_output
833		version 310 es
834		desc "Missing output block"
835		expect validation_fail
836
837		pipeline_program
838			active_stages {vertex}
839			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
840			vertex ""
841				#version 310 es
842				${VERTEX_DECLARATIONS}
843				void main()
844				{
845					${VERTEX_OUTPUT}
846				}
847			""
848		end
849		pipeline_program
850			active_stages {fragment}
851			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
852			fragment ""
853				#version 310 es
854				${FRAGMENT_DECLARATIONS}
855				in IOBlockName
856				{
857					mediump float v_val;
858				};
859				void main()
860				{
861					${FRAG_COLOR} = vec4(v_val);
862				}
863			""
864		end
865	end
866
867	case mismatch_number_of_declarations
868		version 310 es
869		desc "IO-blocks do not match due to mismatch in number of declarations"
870		expect validation_fail
871
872		pipeline_program
873			active_stages {vertex}
874			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
875			vertex ""
876				#version 310 es
877				${VERTEX_DECLARATIONS}
878				out IOBlockName
879				{
880					mediump float v_valA;
881					mediump float v_valB;
882				};
883				void main()
884				{
885					v_valA = 1.0;
886					v_valB = 2.0;
887					${VERTEX_OUTPUT}
888				}
889			""
890		end
891		pipeline_program
892			active_stages {fragment}
893			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
894			fragment ""
895				#version 310 es
896				${FRAGMENT_DECLARATIONS}
897				in IOBlockName
898				{
899					mediump float v_valA;
900				};
901				void main()
902				{
903					${FRAG_COLOR} = vec4(v_valA);
904				}
905			""
906		end
907	end
908
909	case mismatch_member_order
910		version 310 es
911		desc "IO-blocks do not match due to mismatch with member declaration order"
912		expect validation_fail
913
914		pipeline_program
915			active_stages {vertex}
916			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
917			vertex ""
918				#version 310 es
919				${VERTEX_DECLARATIONS}
920				out IOBlockName
921				{
922					mediump float v_valA;
923					mediump float v_valB;
924				};
925				void main()
926				{
927					v_valA = 1.0;
928					v_valB = 2.0;
929					${VERTEX_OUTPUT}
930				}
931			""
932		end
933		pipeline_program
934			active_stages {fragment}
935			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
936			fragment ""
937				#version 310 es
938				${FRAGMENT_DECLARATIONS}
939				in IOBlockName
940				{
941					mediump float v_valB;
942					mediump float v_valA;
943				};
944				void main()
945				{
946					${FRAG_COLOR} = vec4(v_valA+v_valB);
947				}
948			""
949		end
950	end
951
952	case mismatch_member_type
953		version 310 es
954		desc "IO-blocks do not match due to mismatch with member types"
955		expect validation_fail
956
957		pipeline_program
958			active_stages {vertex}
959			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
960			vertex ""
961				#version 310 es
962				${VERTEX_DECLARATIONS}
963				out IOBlockName
964				{
965					mediump float v_valA;
966				};
967				void main()
968				{
969					v_valA = 1.0;
970					${VERTEX_OUTPUT}
971				}
972			""
973		end
974		pipeline_program
975			active_stages {fragment}
976			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
977			fragment ""
978				#version 310 es
979				${FRAGMENT_DECLARATIONS}
980				in IOBlockName
981				{
982					mediump vec2 v_valA;
983				};
984				void main()
985				{
986					${FRAG_COLOR} = vec4(v_valA.xyxy);
987				}
988			""
989		end
990	end
991
992	case mismatch_member_name
993		version 310 es
994		desc "IO-blocks do not match due to mismatch with member names"
995		expect validation_fail
996
997		pipeline_program
998			active_stages {vertex}
999			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1000			vertex ""
1001				#version 310 es
1002				${VERTEX_DECLARATIONS}
1003				out IOBlockName
1004				{
1005					mediump float v_valA;
1006				};
1007				void main()
1008				{
1009					v_valA = 1.0;
1010					${VERTEX_OUTPUT}
1011				}
1012			""
1013		end
1014		pipeline_program
1015			active_stages {fragment}
1016			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1017			fragment ""
1018				#version 310 es
1019				${FRAGMENT_DECLARATIONS}
1020				in IOBlockName
1021				{
1022					mediump vec2 v_valB;
1023				};
1024				void main()
1025				{
1026					${FRAG_COLOR} = vec4(v_valB.y);
1027				}
1028			""
1029		end
1030	end
1031
1032	case mismatch_member_precision
1033		version 310 es
1034		desc "IO-blocks do not match due to mismatch with member precisions"
1035		expect validation_fail
1036
1037		pipeline_program
1038			active_stages {vertex}
1039			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1040			vertex ""
1041				#version 310 es
1042				${VERTEX_DECLARATIONS}
1043				out IOBlockName
1044				{
1045					mediump float v_valA;
1046				};
1047				void main()
1048				{
1049					v_valA = 1.0;
1050					${VERTEX_OUTPUT}
1051				}
1052			""
1053		end
1054		pipeline_program
1055			active_stages {fragment}
1056			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1057			fragment ""
1058				#version 310 es
1059				${FRAGMENT_DECLARATIONS}
1060				in IOBlockName
1061				{
1062					highp float v_valA;
1063				};
1064				void main()
1065				{
1066					${FRAG_COLOR} = vec4(v_valA);
1067				}
1068			""
1069		end
1070	end
1071
1072	case mismatch_different_member_interpolation
1073		version 310 es
1074		desc "IO-block members do not match due to different interpolation qualifiers"
1075		expect validation_fail
1076
1077		pipeline_program
1078			active_stages {vertex}
1079			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1080			vertex ""
1081				#version 310 es
1082				${VERTEX_DECLARATIONS}
1083				out IOBlockName
1084				{
1085					smooth out mediump float v_val;
1086				};
1087				void main()
1088				{
1089					v_val = 1.0;
1090					${VERTEX_OUTPUT}
1091				}
1092			""
1093		end
1094		pipeline_program
1095			active_stages {fragment}
1096			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1097			fragment ""
1098				#version 310 es
1099				${FRAGMENT_DECLARATIONS}
1100				in IOBlockName
1101				{
1102					flat in mediump float v_val;
1103				};
1104				void main()
1105				{
1106					${FRAG_COLOR} = vec4(v_val);
1107				}
1108			""
1109		end
1110	end
1111
1112	case mismatch_member_array_size
1113		version 310 es
1114		desc "IO-blocks do not match due to mismatch with member array size"
1115		expect validation_fail
1116
1117		pipeline_program
1118			active_stages {vertex}
1119			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1120			vertex ""
1121				#version 310 es
1122				${VERTEX_DECLARATIONS}
1123				out IOBlockName
1124				{
1125					mediump float v_val_arr[2];
1126				};
1127				void main()
1128				{
1129					v_val_arr[0] = 1.0;
1130					v_val_arr[1] = 2.0;
1131					${VERTEX_OUTPUT}
1132				}
1133			""
1134		end
1135		pipeline_program
1136			active_stages {fragment}
1137			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1138			fragment ""
1139				#version 310 es
1140				${FRAGMENT_DECLARATIONS}
1141				in IOBlockName
1142				{
1143					mediump float v_val_arr[1];
1144				};
1145				void main()
1146				{
1147					${FRAG_COLOR} = vec4(v_val_arr[0]);
1148				}
1149			""
1150		end
1151	end
1152
1153	case mismatch_different_member_struct_names
1154		version 310 es
1155		desc "IO-blocks match with structs with different names"
1156		expect validation_fail
1157
1158		pipeline_program
1159			active_stages {vertex}
1160			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1161			vertex ""
1162				#version 310 es
1163				${VERTEX_DECLARATIONS}
1164				struct StructNameA
1165				{
1166					mediump float v;
1167				};
1168				out IOBlockName
1169				{
1170					StructNameA v_val;
1171				};
1172
1173				void main()
1174				{
1175					v_val.v = 1.0;
1176					${VERTEX_OUTPUT}
1177				}
1178			""
1179		end
1180		pipeline_program
1181			active_stages {fragment}
1182			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1183			fragment ""
1184				#version 310 es
1185				${FRAGMENT_DECLARATIONS}
1186				struct StructNameB
1187				{
1188					mediump float v;
1189				};
1190				in IOBlockName
1191				{
1192					StructNameB v_val;
1193				};
1194				void main()
1195				{
1196					${FRAG_COLOR} = vec4(v_val.v);
1197				}
1198			""
1199		end
1200	end
1201
1202	case mismatch_member_struct_member_name
1203		version 310 es
1204		desc "IO-blocks do not match due to mismatch with member structs"
1205		expect validation_fail
1206
1207		pipeline_program
1208			active_stages {vertex}
1209			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1210			vertex ""
1211				#version 310 es
1212				${VERTEX_DECLARATIONS}
1213				struct StructName
1214				{
1215					mediump float v;
1216				};
1217				out IOBlockName
1218				{
1219					StructName v_val;
1220				};
1221
1222				void main()
1223				{
1224					v_val.v = 1.0;
1225					${VERTEX_OUTPUT}
1226				}
1227			""
1228		end
1229		pipeline_program
1230			active_stages {fragment}
1231			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1232			fragment ""
1233				#version 310 es
1234				${FRAGMENT_DECLARATIONS}
1235				struct StructName
1236				{
1237					mediump float v_alt_name;
1238				};
1239				in IOBlockName
1240				{
1241					StructName v_val;
1242				};
1243				void main()
1244				{
1245					${FRAG_COLOR} = vec4(v_val.v_alt_name);
1246				}
1247			""
1248		end
1249	end
1250
1251	case mismatch_member_struct_member_type
1252		version 310 es
1253		desc "IO-blocks do not match due to mismatch with member structs"
1254		expect validation_fail
1255
1256		pipeline_program
1257			active_stages {vertex}
1258			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1259			vertex ""
1260				#version 310 es
1261				${VERTEX_DECLARATIONS}
1262				struct StructName
1263				{
1264					mediump float v;
1265				};
1266				out IOBlockName
1267				{
1268					StructName v_val;
1269				};
1270
1271				void main()
1272				{
1273					v_val.v = 1.0;
1274					${VERTEX_OUTPUT}
1275				}
1276			""
1277		end
1278		pipeline_program
1279			active_stages {fragment}
1280			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1281			fragment ""
1282				#version 310 es
1283				${FRAGMENT_DECLARATIONS}
1284				struct StructName
1285				{
1286					mediump vec2 v;
1287				};
1288				in IOBlockName
1289				{
1290					StructName v_val;
1291				};
1292				void main()
1293				{
1294					${FRAG_COLOR} = vec4(v_val.v.x);
1295				}
1296			""
1297		end
1298	end
1299
1300	case mismatch_member_struct_member_precision
1301		version 310 es
1302		desc "IO-blocks do not match due to mismatch with member structs"
1303		expect validation_fail
1304
1305		pipeline_program
1306			active_stages {vertex}
1307			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1308			vertex ""
1309				#version 310 es
1310				${VERTEX_DECLARATIONS}
1311				struct StructName
1312				{
1313					mediump float v;
1314				};
1315				out IOBlockName
1316				{
1317					StructName v_val;
1318				};
1319
1320				void main()
1321				{
1322					v_val.v = 1.0;
1323					${VERTEX_OUTPUT}
1324				}
1325			""
1326		end
1327		pipeline_program
1328			active_stages {fragment}
1329			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1330			fragment ""
1331				#version 310 es
1332				${FRAGMENT_DECLARATIONS}
1333				struct StructName
1334				{
1335					highp float v;
1336				};
1337				in IOBlockName
1338				{
1339					StructName v_val;
1340				};
1341				void main()
1342				{
1343					${FRAG_COLOR} = vec4(v_val.v);
1344				}
1345			""
1346		end
1347	end
1348
1349	case mismatch_member_struct_member_order
1350		version 310 es
1351		desc "IO-blocks do not match due to mismatch with member structs"
1352		expect validation_fail
1353
1354		pipeline_program
1355			active_stages {vertex}
1356			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1357			vertex ""
1358				#version 310 es
1359				${VERTEX_DECLARATIONS}
1360				struct StructName
1361				{
1362					mediump float v_a;
1363					mediump float v_b;
1364				};
1365				out IOBlockName
1366				{
1367					StructName v_val;
1368				};
1369
1370				void main()
1371				{
1372					v_val.v_a = 1.0;
1373					v_val.v_b = 1.0;
1374					${VERTEX_OUTPUT}
1375				}
1376			""
1377		end
1378		pipeline_program
1379			active_stages {fragment}
1380			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1381			fragment ""
1382				#version 310 es
1383				${FRAGMENT_DECLARATIONS}
1384				struct StructName
1385				{
1386					mediump float v_b;
1387					mediump float v_a;
1388				};
1389				in IOBlockName
1390				{
1391					StructName v_val;
1392				};
1393				void main()
1394				{
1395					${FRAG_COLOR} = vec4(v_val.v_a);
1396				}
1397			""
1398		end
1399	end
1400
1401	case mismatch_array_size
1402		version 310 es
1403		desc "IO-blocks do not match due to mismatch with array sizes"
1404		expect validation_fail
1405
1406		pipeline_program
1407			active_stages {vertex}
1408			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1409			vertex ""
1410				#version 310 es
1411				${VERTEX_DECLARATIONS}
1412				out IOBlockName
1413				{
1414					mediump float v_val;
1415				} ioBlock[2];
1416				void main()
1417				{
1418					ioBlock[0].v_val = 1.0;
1419					ioBlock[1].v_val = 2.0;
1420					${VERTEX_OUTPUT}
1421				}
1422			""
1423		end
1424		pipeline_program
1425			active_stages {fragment}
1426			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1427			fragment ""
1428				#version 310 es
1429				${FRAGMENT_DECLARATIONS}
1430				in IOBlockName
1431				{
1432					mediump float v_val;
1433				} ioBlock[1];
1434				void main()
1435				{
1436					${FRAG_COLOR} = vec4(ioBlock[0].v_val);
1437				}
1438			""
1439		end
1440	end
1441
1442	case mismatch_variable_and_block_member_1
1443		version 310 es
1444		desc "IO-block does not match with variable"
1445		expect validation_fail
1446
1447		pipeline_program
1448			active_stages {vertex}
1449			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1450			vertex ""
1451				#version 310 es
1452				${VERTEX_DECLARATIONS}
1453				out IOBlockName
1454				{
1455					mediump float v_val;
1456				};
1457
1458				void main()
1459				{
1460					v_val = 1.0;
1461					${VERTEX_OUTPUT}
1462				}
1463			""
1464		end
1465		pipeline_program
1466			active_stages {fragment}
1467			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1468			fragment ""
1469				#version 310 es
1470				${FRAGMENT_DECLARATIONS}
1471				in mediump float v_val;
1472				void main()
1473				{
1474					${FRAG_COLOR} = vec4(v_val);
1475				}
1476			""
1477		end
1478	end
1479
1480	case mismatch_variable_and_block_member_2
1481		version 310 es
1482		desc "IO-block does not match with variable"
1483		expect validation_fail
1484
1485		pipeline_program
1486			active_stages {vertex}
1487			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
1488			vertex ""
1489				#version 310 es
1490				${VERTEX_DECLARATIONS}
1491				out VariableAndBlockName
1492				{
1493					mediump float v_val;
1494				};
1495
1496				void main()
1497				{
1498					v_val = 1.0;
1499					${VERTEX_OUTPUT}
1500				}
1501			""
1502		end
1503		pipeline_program
1504			active_stages {fragment}
1505			require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
1506			fragment ""
1507				#version 310 es
1508				${FRAGMENT_DECLARATIONS}
1509				in mediump float VariableAndBlockName;
1510				void main()
1511				{
1512					${FRAG_COLOR} = vec4(VariableAndBlockName);
1513				}
1514			""
1515		end
1516	end
1517end
1518