• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# -------------------------------------------------
2# drawElements Quality Program OpenGL ES 3.2 Module
3# -------------------------------------------------
4#
5# Copyright 2016 The Android Open Source Project
6#
7# Licensed under the Apache License, Version 2.0 (the "License");
8# you may not use this file except in compliance with the License.
9# You may obtain a copy of the License at
10#
11#      http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS,
15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16# See the License for the specific language governing permissions and
17# limitations under the License.
18
19
20group varying "Varying linkage"
21	group rules "Rules"
22
23		case type_mismatch
24			version 320 es
25			desc "Tessellation output and geometry input type mismatch"
26			expect link_fail
27			values
28			{
29				input float in0 = 1.0;
30				output float out0 = 1.0;
31			}
32			vertex ""
33				#version 320 es
34				${VERTEX_DECLARATIONS}
35				out mediump float vtx_out;
36				void main()
37				{
38					vtx_out = in0;
39					${VERTEX_OUTPUT}
40				}
41			""
42			tessellation_control ""
43				#version 320 es
44				${TESSELLATION_CONTROL_DECLARATIONS}
45				in mediump float vtx_out[];
46				out mediump float tc_out[];
47				void main()
48				{
49					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
50					${TESSELLATION_CONTROL_OUTPUT}
51				}
52			""
53			tessellation_evaluation ""
54				#version 320 es
55				${TESSELLATION_EVALUATION_DECLARATIONS}
56				in mediump float tc_out[];
57				out mediump float te_out;
58				void main()
59				{
60					te_out = tc_out[2];
61					${TESSELLATION_EVALUATION_OUTPUT}
62				}
63			""
64			geometry ""
65				#version 320 es
66				${GEOMETRY_DECLARATIONS}
67				in mediump vec2 te_out[];
68				out mediump float geo_out;
69				void main()
70				{
71					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
72					{
73						geo_out = te_out[ndx].y;
74						gl_Position = gl_in[ndx].gl_Position;
75						EmitVertex();
76					}
77				}
78			""
79			fragment ""
80				#version 320 es
81				precision mediump float;
82				${FRAGMENT_DECLARATIONS}
83				in mediump float geo_out;
84				void main()
85				{
86					out0 = geo_out;
87					${FRAGMENT_OUTPUT}
88				}
89			""
90		end
91
92		case different_precision
93			version 320 es
94			desc "Tessellation output and geometry input precisions are different"
95			values
96			{
97				input float in0 = 1.0;
98				output float out0 = 1.0;
99			}
100			vertex ""
101				#version 320 es
102				${VERTEX_DECLARATIONS}
103				out mediump float vtx_out;
104				void main()
105				{
106					vtx_out = in0;
107					${VERTEX_OUTPUT}
108				}
109			""
110			tessellation_control ""
111				#version 320 es
112				${TESSELLATION_CONTROL_DECLARATIONS}
113				in mediump float vtx_out[];
114				out mediump float tc_out[];
115				void main()
116				{
117					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
118					${TESSELLATION_CONTROL_OUTPUT}
119				}
120			""
121			tessellation_evaluation ""
122				#version 320 es
123				${TESSELLATION_EVALUATION_DECLARATIONS}
124				in mediump float tc_out[];
125				out mediump float te_out;
126				void main()
127				{
128					te_out = tc_out[2];
129					${TESSELLATION_EVALUATION_OUTPUT}
130				}
131			""
132			geometry ""
133				#version 320 es
134				${GEOMETRY_DECLARATIONS}
135				in highp float te_out[];
136				out mediump float geo_out;
137				void main()
138				{
139					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
140					{
141						geo_out = te_out[ndx];
142						gl_Position = gl_in[ndx].gl_Position;
143						EmitVertex();
144					}
145				}
146			""
147			fragment ""
148				#version 320 es
149				precision mediump float;
150				${FRAGMENT_DECLARATIONS}
151				in mediump float geo_out;
152				void main()
153				{
154					out0 = geo_out;
155					${FRAGMENT_OUTPUT}
156				}
157			""
158		end
159
160		case no_output_declaration
161			version 320 es
162			desc "Geometry input has no matching output"
163			expect link_fail
164			values
165			{
166				input float in0 = 1.0;
167				output float out0 = 1.0;
168			}
169			vertex ""
170				#version 320 es
171				${VERTEX_DECLARATIONS}
172				out mediump float vtx_out;
173				void main()
174				{
175					vtx_out = in0;
176					${VERTEX_OUTPUT}
177				}
178			""
179			tessellation_control ""
180				#version 320 es
181				${TESSELLATION_CONTROL_DECLARATIONS}
182				in mediump float vtx_out[];
183				out mediump float tc_out[];
184				void main()
185				{
186					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
187					${TESSELLATION_CONTROL_OUTPUT}
188				}
189			""
190			tessellation_evaluation ""
191				#version 320 es
192				${TESSELLATION_EVALUATION_DECLARATIONS}
193				in mediump float tc_out[];
194				out mediump float te_out;
195				void main()
196				{
197					te_out = tc_out[2];
198					${TESSELLATION_EVALUATION_OUTPUT}
199				}
200			""
201			geometry ""
202				#version 320 es
203				${GEOMETRY_DECLARATIONS}
204				in mediump float te_out[];
205				in mediump float te_out_nonexistent[];
206				out mediump float geo_out;
207				void main()
208				{
209					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
210					{
211						geo_out = te_out[ndx] + te_out_nonexistent[ndx];
212						gl_Position = gl_in[ndx].gl_Position;
213						EmitVertex();
214					}
215				}
216			""
217			fragment ""
218				#version 320 es
219				precision mediump float;
220				${FRAGMENT_DECLARATIONS}
221				in mediump float geo_out;
222				void main()
223				{
224					out0 = geo_out;
225					${FRAGMENT_OUTPUT}
226				}
227			""
228		end
229
230		case superfluous_output_declaration
231			version 320 es
232			desc "Tessellation shader output is never used"
233			values
234			{
235				input float in0 = 1.0;
236				output float out0 = 1.0;
237			}
238			vertex ""
239				#version 320 es
240				${VERTEX_DECLARATIONS}
241				out mediump float vtx_out;
242				void main()
243				{
244					vtx_out = in0;
245					${VERTEX_OUTPUT}
246				}
247			""
248			tessellation_control ""
249				#version 320 es
250				${TESSELLATION_CONTROL_DECLARATIONS}
251				in mediump float vtx_out[];
252				out mediump float tc_out[];
253				void main()
254				{
255					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
256					${TESSELLATION_CONTROL_OUTPUT}
257				}
258			""
259			tessellation_evaluation ""
260				#version 320 es
261				${TESSELLATION_EVALUATION_DECLARATIONS}
262				in mediump float tc_out[];
263				out mediump float te_out;
264				out mediump float te_out_nonexistent;
265				void main()
266				{
267					te_out = tc_out[2];
268					te_out_nonexistent = tc_out[0];
269					${TESSELLATION_EVALUATION_OUTPUT}
270				}
271			""
272			geometry ""
273				#version 320 es
274				${GEOMETRY_DECLARATIONS}
275				in mediump float te_out[];
276				out mediump float geo_out;
277				void main()
278				{
279					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
280					{
281						geo_out = te_out[ndx];
282						gl_Position = gl_in[ndx].gl_Position;
283						EmitVertex();
284					}
285				}
286			""
287			fragment ""
288				#version 320 es
289				precision mediump float;
290				${FRAGMENT_DECLARATIONS}
291				in mediump float geo_out;
292				void main()
293				{
294					out0 = geo_out;
295					${FRAGMENT_OUTPUT}
296				}
297			""
298		end
299
300		case vertex_geometry_same_varying_name_1
301			version 320 es
302			desc "Vertex output and geometry input share the same name"
303			values
304			{
305				input float in0 = 1.0;
306				output float out0 = 1.0;
307			}
308			vertex ""
309				#version 320 es
310				${VERTEX_DECLARATIONS}
311				out mediump float sharedVaringName;
312				void main()
313				{
314					sharedVaringName = in0;
315					${VERTEX_OUTPUT}
316				}
317			""
318			tessellation_control ""
319				#version 320 es
320				${TESSELLATION_CONTROL_DECLARATIONS}
321				in mediump float sharedVaringName[];
322				out mediump float tc_out[];
323				void main()
324				{
325					tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID];
326					${TESSELLATION_CONTROL_OUTPUT}
327				}
328			""
329			tessellation_evaluation ""
330				#version 320 es
331				${TESSELLATION_EVALUATION_DECLARATIONS}
332				in mediump float tc_out[];
333				out mediump float sharedVaringName;
334				void main()
335				{
336					sharedVaringName = tc_out[2];
337					${TESSELLATION_EVALUATION_OUTPUT}
338				}
339			""
340			geometry ""
341				#version 320 es
342				${GEOMETRY_DECLARATIONS}
343				in mediump float sharedVaringName[];
344				out mediump float geo_out;
345				void main()
346				{
347					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
348					{
349						geo_out = sharedVaringName[ndx];
350						gl_Position = gl_in[ndx].gl_Position;
351						EmitVertex();
352					}
353				}
354			""
355			fragment ""
356				#version 320 es
357				precision mediump float;
358				${FRAGMENT_DECLARATIONS}
359				in mediump float geo_out;
360				void main()
361				{
362					out0 = geo_out;
363					${FRAGMENT_OUTPUT}
364				}
365			""
366		end
367
368		case vertex_geometry_same_varying_name_2
369			version 320 es
370			desc "Vertex output and geometry input share the same name"
371			values
372			{
373				input vec2 in0 = vec2(1.0, 1.0);
374				output float out0 = 1.0;
375			}
376			vertex ""
377				#version 320 es
378				${VERTEX_DECLARATIONS}
379				out mediump vec2 sharedVaringName;
380				void main()
381				{
382					sharedVaringName = in0;
383					${VERTEX_OUTPUT}
384				}
385			""
386			tessellation_control ""
387				#version 320 es
388				${TESSELLATION_CONTROL_DECLARATIONS}
389				in mediump vec2 sharedVaringName[];
390				out mediump float tc_out[];
391				void main()
392				{
393					tc_out[gl_InvocationID] = 2.0 * sharedVaringName[gl_InvocationID].x - sharedVaringName[gl_InvocationID].y;
394					${TESSELLATION_CONTROL_OUTPUT}
395				}
396			""
397			tessellation_evaluation ""
398				#version 320 es
399				${TESSELLATION_EVALUATION_DECLARATIONS}
400				in mediump float tc_out[];
401				out mediump float sharedVaringName;
402				void main()
403				{
404					sharedVaringName = tc_out[2];
405					${TESSELLATION_EVALUATION_OUTPUT}
406				}
407			""
408			geometry ""
409				#version 320 es
410				${GEOMETRY_DECLARATIONS}
411				in mediump float sharedVaringName[];
412				out mediump float geo_out;
413				void main()
414				{
415					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
416					{
417						geo_out = sharedVaringName[ndx];
418						gl_Position = gl_in[ndx].gl_Position;
419						EmitVertex();
420					}
421				}
422			""
423			fragment ""
424				#version 320 es
425				precision mediump float;
426				${FRAGMENT_DECLARATIONS}
427				in mediump float geo_out;
428				void main()
429				{
430					out0 = geo_out;
431					${FRAGMENT_OUTPUT}
432				}
433			""
434		end
435
436		case io_block
437			version 320 es
438			desc "Use of io block between tessellation and geometry shaders"
439			values
440			{
441				input float in0 = 1.0;
442				output float out0 = 1.0;
443			}
444			vertex ""
445				#version 320 es
446				${VERTEX_DECLARATIONS}
447				out mediump float vtx_out;
448				void main()
449				{
450					vtx_out = in0;
451					${VERTEX_OUTPUT}
452				}
453			""
454			tessellation_control ""
455				#version 320 es
456				${TESSELLATION_CONTROL_DECLARATIONS}
457				in mediump float vtx_out[];
458				out mediump float tc_out[];
459				void main()
460				{
461					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
462					${TESSELLATION_CONTROL_OUTPUT}
463				}
464			""
465			tessellation_evaluation ""
466				#version 320 es
467				${TESSELLATION_EVALUATION_DECLARATIONS}
468				in mediump float tc_out[];
469				out IOBlockName { mediump float val; } instanceName;
470				void main()
471				{
472					instanceName.val = tc_out[2];
473					${TESSELLATION_EVALUATION_OUTPUT}
474				}
475			""
476			geometry ""
477				#version 320 es
478				${GEOMETRY_DECLARATIONS}
479				in IOBlockName { mediump float val; } instanceName[];
480				out mediump float geo_out;
481				void main()
482				{
483					geo_out = instanceName[0].val;
484					gl_Position = gl_in[0].gl_Position;
485					EmitVertex();
486
487					geo_out = instanceName[1].val;
488					gl_Position = gl_in[1].gl_Position;
489					EmitVertex();
490
491					geo_out = instanceName[2].val;
492					gl_Position = gl_in[2].gl_Position;
493					EmitVertex();
494				}
495			""
496			fragment ""
497				#version 320 es
498				precision mediump float;
499				${FRAGMENT_DECLARATIONS}
500				in mediump float geo_out;
501				void main()
502				{
503					out0 = geo_out;
504					${FRAGMENT_OUTPUT}
505				}
506			""
507		end
508
509		case array_in_io_block
510			version 320 es
511			desc "Float array in a io block between tessellation and geometry shaders"
512			values
513			{
514				input float in0 = 1.0;
515				output float out0 = 1.0;
516			}
517			vertex ""
518				#version 320 es
519				${VERTEX_DECLARATIONS}
520				out mediump float vtx_out;
521				void main()
522				{
523					vtx_out = in0;
524					${VERTEX_OUTPUT}
525				}
526			""
527			tessellation_control ""
528				#version 320 es
529				${TESSELLATION_CONTROL_DECLARATIONS}
530				in mediump float vtx_out[];
531				out mediump float tc_out[];
532				void main()
533				{
534					tc_out[gl_InvocationID] = vtx_out[gl_InvocationID];
535					${TESSELLATION_CONTROL_OUTPUT}
536				}
537			""
538			tessellation_evaluation ""
539				#version 320 es
540				${TESSELLATION_EVALUATION_DECLARATIONS}
541				in mediump float tc_out[];
542				out IOBlockName { mediump float val[2]; } instanceName;
543				void main()
544				{
545					instanceName.val[0] = tc_out[2] + 1.0;
546					instanceName.val[1] = -1.0;
547					${TESSELLATION_EVALUATION_OUTPUT}
548				}
549			""
550			geometry ""
551				#version 320 es
552				${GEOMETRY_DECLARATIONS}
553				in IOBlockName { mediump float val[2]; } instanceName[];
554				out mediump float geo_out;
555				void main()
556				{
557					geo_out = instanceName[0].val[0] + instanceName[0].val[1];
558					gl_Position = gl_in[0].gl_Position;
559					EmitVertex();
560
561					geo_out = instanceName[1].val[0] + instanceName[1].val[1];
562					gl_Position = gl_in[1].gl_Position;
563					EmitVertex();
564
565					geo_out = instanceName[2].val[0] + instanceName[2].val[1];
566					gl_Position = gl_in[2].gl_Position;
567					EmitVertex();
568				}
569			""
570			fragment ""
571				#version 320 es
572				precision mediump float;
573				${FRAGMENT_DECLARATIONS}
574				in mediump float geo_out;
575				void main()
576				{
577					out0 = geo_out;
578					${FRAGMENT_OUTPUT}
579				}
580			""
581		end
582	end
583
584	import "linkage_tessellation_geometry_varying_types.test"
585end
586
587group uniform "Uniform linkage"
588	group rules "Rules"
589		case type_mismatch_1
590			version 320 es
591			desc "Uniform type mismatch"
592			expect link_fail
593			vertex ""
594				#version 320 es
595				${VERTEX_DECLARATIONS}
596				void main()
597				{
598					${VERTEX_OUTPUT}
599				}
600			""
601			tessellation_control ""
602				#version 320 es
603				${TESSELLATION_CONTROL_DECLARATIONS}
604				void main()
605				{
606					${TESSELLATION_CONTROL_OUTPUT}
607				}
608			""
609			tessellation_evaluation ""
610				#version 320 es
611				${TESSELLATION_EVALUATION_DECLARATIONS}
612				uniform mediump float u_value;
613				out mediump float te_out;
614				void main()
615				{
616					te_out = u_value;
617					${TESSELLATION_EVALUATION_OUTPUT}
618				}
619			""
620			geometry ""
621				#version 320 es
622				${GEOMETRY_DECLARATIONS}
623				uniform mediump vec2 u_value;
624				in mediump float te_out[];
625				out mediump float geo_out;
626				void main()
627				{
628					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
629					{
630						geo_out = te_out[ndx] + u_value.y;
631						gl_Position = gl_in[ndx].gl_Position;
632						EmitVertex();
633					}
634				}
635			""
636			fragment ""
637				#version 320 es
638				precision mediump float;
639				${FRAGMENT_DECLARATIONS}
640				in mediump float geo_out;
641				void main()
642				{
643					${FRAG_COLOR} = vec4(geo_out);
644				}
645			""
646		end
647
648		case precision_mismatch_1
649			version 320 es
650			desc "Uniform precision mismatch"
651			expect link_fail
652			vertex ""
653				#version 320 es
654				${VERTEX_DECLARATIONS}
655				void main()
656				{
657					${VERTEX_OUTPUT}
658				}
659			""
660			tessellation_control ""
661				#version 320 es
662				${TESSELLATION_CONTROL_DECLARATIONS}
663				void main()
664				{
665					${TESSELLATION_CONTROL_OUTPUT}
666				}
667			""
668			tessellation_evaluation ""
669				#version 320 es
670				${TESSELLATION_EVALUATION_DECLARATIONS}
671				uniform mediump float u_value;
672				out mediump float te_out;
673				void main()
674				{
675					te_out = u_value;
676					${TESSELLATION_EVALUATION_OUTPUT}
677				}
678			""
679			geometry ""
680				#version 320 es
681				${GEOMETRY_DECLARATIONS}
682				uniform highp float u_value;
683				in mediump float te_out[];
684				out mediump float geo_out;
685				void main()
686				{
687					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
688					{
689						geo_out = te_out[ndx] + u_value;
690						gl_Position = gl_in[ndx].gl_Position;
691						EmitVertex();
692					}
693				}
694			""
695			fragment ""
696				#version 320 es
697				precision mediump float;
698				${FRAGMENT_DECLARATIONS}
699				in mediump float geo_out;
700				void main()
701				{
702					${FRAG_COLOR} = vec4(geo_out);
703				}
704			""
705		end
706
707		case struct_partial_usage
708			version 320 es
709			desc "Uniform precision mismatch"
710			values
711			{
712				uniform float u_value.teVal = 1.0;
713				uniform float u_value.geoVal = 2.0;
714				output float out0 = 5.0;
715			}
716			vertex ""
717				#version 320 es
718				${VERTEX_DECLARATIONS}
719				void main()
720				{
721					${VERTEX_OUTPUT}
722				}
723			""
724			tessellation_control ""
725				#version 320 es
726				${TESSELLATION_CONTROL_DECLARATIONS}
727				void main()
728				{
729					${TESSELLATION_CONTROL_OUTPUT}
730				}
731			""
732			tessellation_evaluation ""
733				#version 320 es
734				${TESSELLATION_EVALUATION_DECLARATIONS}
735				struct S
736				{
737					mediump float teVal;
738					mediump float geoVal;
739				};
740				uniform S u_value;
741				out mediump float te_out;
742				void main()
743				{
744					te_out = u_value.teVal;
745					${TESSELLATION_EVALUATION_OUTPUT}
746				}
747			""
748			geometry ""
749				#version 320 es
750				${GEOMETRY_DECLARATIONS}
751				struct S
752				{
753					mediump float teVal;
754					mediump float geoVal;
755				};
756				uniform S u_value;
757				in mediump float te_out[];
758				out mediump float geo_out;
759				void main()
760				{
761					for (int ndx = 0; ndx < gl_in.length(); ++ndx)
762					{
763						geo_out = te_out[ndx] + 2.0 * u_value.geoVal;
764						gl_Position = gl_in[ndx].gl_Position;
765						EmitVertex();
766					}
767				}
768			""
769			fragment ""
770				#version 320 es
771				precision mediump float;
772				${FRAGMENT_DECLARATIONS}
773				in mediump float geo_out;
774				void main()
775				{
776					out0 = geo_out;
777					${FRAGMENT_OUTPUT}
778				}
779			""
780		end
781	end
782end
783