xref: /aosp_15_r20/external/deqp/data/gles31/shaders/es31/linkage_geometry.test (revision 35238bce31c2a825756842865a792f8cf7f89930)
1
2group varying "Varying linkage"
3    group rules "Rules"
4        case input_type_mismatch
5            version 310 es
6            desc "Geometry shader input type mismatch"
7            expect link_fail
8            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
9            values { output float out0 = 1.0; }
10            vertex ""
11                #version 310 es
12                ${VERTEX_DECLARATIONS}
13                out mediump float geo_in;
14                void main()
15                {
16                    geo_in = 1.0;
17                    ${VERTEX_OUTPUT}
18                }
19            ""
20            geometry ""
21                #version 310 es
22                ${GEOMETRY_DECLARATIONS}
23                in mediump vec2 geo_in[];
24                out mediump float geo_out;
25                void main()
26                {
27                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
28                    {
29                        geo_out = geo_in[ndx].x + geo_in[ndx].y;
30                        gl_Position = gl_in[ndx].gl_Position;
31                        EmitVertex();
32                    }
33                }
34            ""
35            fragment ""
36                #version 310 es
37                precision mediump float;
38                ${FRAGMENT_DECLARATIONS}
39                in mediump float geo_out;
40                void main()
41                {
42                    out0 = geo_out;
43                    ${FRAGMENT_OUTPUT}
44                }
45            ""
46        end
47
48        case output_type_mismatch
49            version 310 es
50            desc "Geometry shader output type mismatch"
51            expect link_fail
52            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
53            values { output float out0 = 1.0; }
54            vertex ""
55                #version 310 es
56                ${VERTEX_DECLARATIONS}
57                void main()
58                {
59                    ${VERTEX_OUTPUT}
60                }
61            ""
62            geometry ""
63                #version 310 es
64                ${GEOMETRY_DECLARATIONS}
65                out mediump float geo_out;
66                void main()
67                {
68                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
69                    {
70                        geo_out = 1.0;
71                        gl_Position = gl_in[ndx].gl_Position;
72                        EmitVertex();
73                    }
74                }
75            ""
76            fragment ""
77                #version 310 es
78                precision mediump float;
79                ${FRAGMENT_DECLARATIONS}
80                in mediump vec2 geo_out;
81                void main()
82                {
83                    out0 = geo_out.x + geo_out.y;
84                    ${FRAGMENT_OUTPUT}
85                }
86            ""
87        end
88
89        case input_different_precision
90            version 310 es
91            desc "Geometry shader input precision mismatch"
92            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
93            values { output float out0 = 1.0; }
94            vertex ""
95                #version 310 es
96                ${VERTEX_DECLARATIONS}
97                out highp float geo_in;
98                void main()
99                {
100                    geo_in = 1.0;
101                    ${VERTEX_OUTPUT}
102                }
103            ""
104            geometry ""
105                #version 310 es
106                ${GEOMETRY_DECLARATIONS}
107                in lowp float geo_in[];
108                out mediump float geo_out;
109                void main()
110                {
111                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
112                    {
113                        geo_out = geo_in[ndx];
114                        gl_Position = gl_in[ndx].gl_Position;
115                        EmitVertex();
116                    }
117                }
118            ""
119            fragment ""
120                #version 310 es
121                precision mediump float;
122                ${FRAGMENT_DECLARATIONS}
123                in mediump float geo_out;
124                void main()
125                {
126                    out0 = geo_out;
127                    ${FRAGMENT_OUTPUT}
128                }
129            ""
130        end
131
132        case output_different_precision
133            version 310 es
134            desc "Geometry shader output precision mismatch"
135            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
136            values { output float out0 = 1.0; }
137            vertex ""
138                #version 310 es
139                ${VERTEX_DECLARATIONS}
140                void main()
141                {
142                    ${VERTEX_OUTPUT}
143                }
144            ""
145            geometry ""
146                #version 310 es
147                ${GEOMETRY_DECLARATIONS}
148                out highp float geo_out;
149                void main()
150                {
151                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
152                    {
153                        geo_out = 1.0;
154                        gl_Position = gl_in[ndx].gl_Position;
155                        EmitVertex();
156                    }
157                }
158            ""
159            fragment ""
160                #version 310 es
161                precision mediump float;
162                ${FRAGMENT_DECLARATIONS}
163                in lowp float geo_out;
164                void main()
165                {
166                    out0 = geo_out;
167                    ${FRAGMENT_OUTPUT}
168                }
169            ""
170        end
171
172        case input_no_declaration
173            version 310 es
174            desc "Geometry shader input has no matching output"
175            expect link_fail
176            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
177            values { output float out0 = 1.0; }
178            vertex ""
179                #version 310 es
180                ${VERTEX_DECLARATIONS}
181                void main()
182                {
183                    ${VERTEX_OUTPUT}
184                }
185            ""
186            geometry ""
187                #version 310 es
188                ${GEOMETRY_DECLARATIONS}
189                in lowp float geo_in[];
190                out mediump float geo_out;
191                void main()
192                {
193                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
194                    {
195                        geo_out = geo_in[ndx];
196                        gl_Position = gl_in[ndx].gl_Position;
197                        EmitVertex();
198                    }
199                }
200            ""
201            fragment ""
202                #version 310 es
203                precision mediump float;
204                ${FRAGMENT_DECLARATIONS}
205                in mediump float geo_out;
206                void main()
207                {
208                    out0 = geo_out;
209                    ${FRAGMENT_OUTPUT}
210                }
211            ""
212        end
213
214        case output_no_declaration
215            version 310 es
216            desc "Geometry shader has no output for an input"
217            expect link_fail
218            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
219            values { output float out0 = 1.0; }
220            vertex ""
221                #version 310 es
222                ${VERTEX_DECLARATIONS}
223                void main()
224                {
225                    ${VERTEX_OUTPUT}
226                }
227            ""
228            geometry ""
229                #version 310 es
230                ${GEOMETRY_DECLARATIONS}
231                void main()
232                {
233                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
234                    {
235                        gl_Position = gl_in[ndx].gl_Position;
236                        EmitVertex();
237                    }
238                }
239            ""
240            fragment ""
241                #version 310 es
242                precision mediump float;
243                ${FRAGMENT_DECLARATIONS}
244                in mediump float geo_out;
245                void main()
246                {
247                    out0 = geo_out;
248                    ${FRAGMENT_OUTPUT}
249                }
250            ""
251        end
252
253        case input_superfluous_declaration
254            version 310 es
255            desc "Geometry shader has no input for an output"
256            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
257            values { output float out0 = 1.0; }
258            vertex ""
259                #version 310 es
260                ${VERTEX_DECLARATIONS}
261                out mediump float geo_in;
262                void main()
263                {
264                    geo_in = 1.0;
265                    ${VERTEX_OUTPUT}
266                }
267            ""
268            geometry ""
269                #version 310 es
270                ${GEOMETRY_DECLARATIONS}
271                out mediump float geo_out;
272                void main()
273                {
274                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
275                    {
276                        geo_out = 1.0;
277                        gl_Position = gl_in[ndx].gl_Position;
278                        EmitVertex();
279                    }
280                }
281            ""
282            fragment ""
283                #version 310 es
284                precision mediump float;
285                ${FRAGMENT_DECLARATIONS}
286                in mediump float geo_out;
287                void main()
288                {
289                    out0 = geo_out;
290                    ${FRAGMENT_OUTPUT}
291                }
292            ""
293        end
294
295        case output_superfluous_declaration
296            version 310 es
297            desc "Geometry shader has output without an matching input"
298            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
299            values { output float out0 = 1.0; }
300            vertex ""
301                #version 310 es
302                ${VERTEX_DECLARATIONS}
303                void main()
304                {
305                    ${VERTEX_OUTPUT}
306                }
307            ""
308            geometry ""
309                #version 310 es
310                ${GEOMETRY_DECLARATIONS}
311                out mediump float geo_out;
312                void main()
313                {
314                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
315                    {
316                        geo_out = 1.0;
317                        gl_Position = gl_in[ndx].gl_Position;
318                        EmitVertex();
319                    }
320                }
321            ""
322            fragment ""
323                #version 310 es
324                precision mediump float;
325                ${FRAGMENT_DECLARATIONS}
326                void main()
327                {
328                    out0 = 1.0;
329                    ${FRAGMENT_OUTPUT}
330                }
331            ""
332        end
333
334        case input_array_explicit_size
335            version 310 es
336            desc "Geometry shader input is explicitly sized array"
337            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
338            values { output float out0 = 1.0; }
339            vertex ""
340                #version 310 es
341                ${VERTEX_DECLARATIONS}
342                out mediump float geo_in;
343                void main()
344                {
345                    geo_in = 1.0;
346                    ${VERTEX_OUTPUT}
347                }
348            ""
349            geometry ""
350                #version 310 es
351                ${GEOMETRY_DECLARATIONS}
352                in mediump float geo_in[3];
353                out mediump float geo_out;
354                void main()
355                {
356                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
357                    {
358                        geo_out = geo_in[ndx];
359                        gl_Position = gl_in[ndx].gl_Position;
360                        EmitVertex();
361                    }
362                }
363            ""
364            fragment ""
365                #version 310 es
366                precision mediump float;
367                ${FRAGMENT_DECLARATIONS}
368                in mediump float geo_out;
369                void main()
370                {
371                    out0 = geo_out;
372                    ${FRAGMENT_OUTPUT}
373                }
374            ""
375        end
376
377        case input_non_array
378            version 310 es
379            desc "Geometry shader has no input for an output"
380            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
381            expect compile_or_link_fail
382            values { output float out0 = 1.0; }
383            vertex ""
384                #version 310 es
385                ${VERTEX_DECLARATIONS}
386                out mediump float geo_in;
387                void main()
388                {
389                    geo_in = 1.0;
390                    ${VERTEX_OUTPUT}
391                }
392            ""
393            geometry ""
394                #version 310 es
395                ${GEOMETRY_DECLARATIONS}
396                in mediump float geo_in;
397                out mediump float geo_out;
398                void main()
399                {
400                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
401                    {
402                        geo_out = geo_in;
403                        gl_Position = gl_in[ndx].gl_Position;
404                        EmitVertex();
405                    }
406                }
407            ""
408            fragment ""
409                #version 310 es
410                precision mediump float;
411                ${FRAGMENT_DECLARATIONS}
412                in mediump float geo_out;
413                void main()
414                {
415                    out0 = geo_out;
416                    ${FRAGMENT_OUTPUT}
417                }
418            ""
419        end
420
421        case input_array_size_mismatch
422            version 310 es
423            desc "Geometry shader input is explicitly sized array, but size does not match input primitive"
424            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
425            expect compile_or_link_fail
426            values { output float out0 = 1.0; }
427            vertex ""
428                #version 310 es
429                ${VERTEX_DECLARATIONS}
430                out mediump float geo_in;
431                void main()
432                {
433                    geo_in = 1.0;
434                    ${VERTEX_OUTPUT}
435                }
436            ""
437            geometry ""
438                #version 310 es
439                ${GEOMETRY_DECLARATIONS}
440                in mediump float geo_in[4];
441                out mediump float geo_out;
442                void main()
443                {
444                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
445                    {
446                        geo_out = geo_in[ndx+1];
447                        gl_Position = gl_in[ndx].gl_Position;
448                        EmitVertex();
449                    }
450                }
451            ""
452            fragment ""
453                #version 310 es
454                precision mediump float;
455                ${FRAGMENT_DECLARATIONS}
456                in mediump float geo_out;
457                void main()
458                {
459                    out0 = geo_out;
460                    ${FRAGMENT_OUTPUT}
461                }
462            ""
463        end
464
465        case input_block
466            version 310 es
467            desc "Geometry shader input block"
468            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
469            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
470            values { output float out0 = 1.0; }
471            vertex ""
472                #version 310 es
473                ${VERTEX_DECLARATIONS}
474                out IOBlockName
475                {
476                    mediump float var;
477                } outputInstanceName;
478                void main()
479                {
480                    outputInstanceName.var = 1.0;
481                    ${VERTEX_OUTPUT}
482                }
483            ""
484            geometry ""
485                #version 310 es
486                ${GEOMETRY_DECLARATIONS}
487                in IOBlockName
488                {
489                    mediump float var;
490                } inputInstanceName[];
491                out mediump float geo_out;
492                void main()
493                {
494                    geo_out = inputInstanceName[0].var;
495                    gl_Position = gl_in[0].gl_Position;
496                    EmitVertex();
497                    geo_out = inputInstanceName[1].var;
498                    gl_Position = gl_in[1].gl_Position;
499                    EmitVertex();
500                    geo_out = inputInstanceName[2].var;
501                    gl_Position = gl_in[2].gl_Position;
502                    EmitVertex();
503                }
504            ""
505            fragment ""
506                #version 310 es
507                precision mediump float;
508                ${FRAGMENT_DECLARATIONS}
509                in mediump float geo_out;
510                void main()
511                {
512                    out0 = geo_out;
513                    ${FRAGMENT_OUTPUT}
514                }
515            ""
516        end
517
518        case input_block_explicit_size
519            version 310 es
520            desc "Geometry shader input block with explicit size"
521            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
522            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
523            values { output float out0 = 1.0; }
524            vertex ""
525                #version 310 es
526                ${VERTEX_DECLARATIONS}
527                out IOBlockName
528                {
529                    mediump float var;
530                } outputInstanceName;
531                void main()
532                {
533                    outputInstanceName.var = 1.0;
534                    ${VERTEX_OUTPUT}
535                }
536            ""
537            geometry ""
538                #version 310 es
539                ${GEOMETRY_DECLARATIONS}
540                in IOBlockName
541                {
542                    mediump float var;
543                } inputInstanceName[3];
544                out mediump float geo_out;
545                void main()
546                {
547                    geo_out = inputInstanceName[0].var;
548                    gl_Position = gl_in[0].gl_Position;
549                    EmitVertex();
550                    geo_out = inputInstanceName[1].var;
551                    gl_Position = gl_in[1].gl_Position;
552                    EmitVertex();
553                    geo_out = inputInstanceName[2].var;
554                    gl_Position = gl_in[2].gl_Position;
555                    EmitVertex();
556                }
557            ""
558            fragment ""
559                #version 310 es
560                precision mediump float;
561                ${FRAGMENT_DECLARATIONS}
562                in mediump float geo_out;
563                void main()
564                {
565                    out0 = geo_out;
566                    ${FRAGMENT_OUTPUT}
567                }
568            ""
569        end
570
571        case input_block_non_array
572            version 310 es
573            desc "Geometry shader input block is non an array"
574            expect compile_or_link_fail
575            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
576            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
577            values { output float out0 = 1.0; }
578            vertex ""
579                #version 310 es
580                ${VERTEX_DECLARATIONS}
581                out IOBlockName
582                {
583                    mediump float var;
584                } outputInstanceName;
585                void main()
586                {
587                    outputInstanceName.var = 1.0;
588                    ${VERTEX_OUTPUT}
589                }
590            ""
591            geometry ""
592                #version 310 es
593                ${GEOMETRY_DECLARATIONS}
594                in IOBlockName
595                {
596                    mediump float var;
597                } inputInstanceName;
598                out mediump float geo_out;
599                void main()
600                {
601                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
602                    {
603                        geo_out = inputInstanceName.var;
604                        gl_Position = gl_in[ndx].gl_Position;
605                        EmitVertex();
606                    }
607                }
608            ""
609            fragment ""
610                #version 310 es
611                precision mediump float;
612                ${FRAGMENT_DECLARATIONS}
613                in mediump float geo_out;
614                void main()
615                {
616                    out0 = geo_out;
617                    ${FRAGMENT_OUTPUT}
618                }
619            ""
620        end
621
622        case input_block_array_size_mismatch
623            version 310 es
624            desc "Geometry shader input block invalid array size"
625            expect compile_or_link_fail
626            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
627            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex }
628            values { output float out0 = 1.0; }
629            vertex ""
630                #version 310 es
631                ${VERTEX_DECLARATIONS}
632                out IOBlockName
633                {
634                    mediump float var;
635                } outputInstanceName;
636                void main()
637                {
638                    outputInstanceName.var = 1.0;
639                    ${VERTEX_OUTPUT}
640                }
641            ""
642            geometry ""
643                #version 310 es
644                ${GEOMETRY_DECLARATIONS}
645                in IOBlockName
646                {
647                    mediump float var;
648                } inputInstanceName[4];
649                out mediump float geo_out;
650                void main()
651                {
652                    geo_out = inputInstanceName[0].var;
653                    gl_Position = gl_in[0].gl_Position;
654                    EmitVertex();
655                    geo_out = inputInstanceName[1].var;
656                    gl_Position = gl_in[1].gl_Position;
657                    EmitVertex();
658                    geo_out = inputInstanceName[2].var + inputInstanceName[3].var;
659                    gl_Position = gl_in[2].gl_Position;
660                    EmitVertex();
661                }
662            ""
663            fragment ""
664                #version 310 es
665                precision mediump float;
666                ${FRAGMENT_DECLARATIONS}
667                in mediump float geo_out;
668                void main()
669                {
670                    out0 = geo_out;
671                    ${FRAGMENT_OUTPUT}
672                }
673            ""
674        end
675
676        case output_block
677            version 310 es
678            desc "Geometry shader output block"
679            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
680            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
681            values { output float out0 = 1.0; }
682            vertex ""
683                #version 310 es
684                ${VERTEX_DECLARATIONS}
685                void main()
686                {
687                    ${VERTEX_OUTPUT}
688                }
689            ""
690            geometry ""
691                #version 310 es
692                ${GEOMETRY_DECLARATIONS}
693                out IOBlockName
694                {
695                    mediump float var;
696                } outputInstanceName;
697                void main()
698                {
699                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
700                    {
701                        outputInstanceName.var = 1.0;
702                        gl_Position = gl_in[ndx].gl_Position;
703                        EmitVertex();
704                    }
705                }
706            ""
707            fragment ""
708                #version 310 es
709                precision mediump float;
710                ${FRAGMENT_DECLARATIONS}
711                in IOBlockName
712                {
713                    mediump float var;
714                } inputInstanceName;
715                void main()
716                {
717                    out0 = inputInstanceName.var;
718                    ${FRAGMENT_OUTPUT}
719                }
720            ""
721        end
722
723        case output_block_array
724            version 310 es
725            desc "Geometry shader output block array"
726            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
727            require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment }
728            values { output float out0 = 1.0; }
729            vertex ""
730                #version 310 es
731                ${VERTEX_DECLARATIONS}
732                void main()
733                {
734                    ${VERTEX_OUTPUT}
735                }
736            ""
737            geometry ""
738                #version 310 es
739                ${GEOMETRY_DECLARATIONS}
740                out IOBlockName
741                {
742                    mediump float var;
743                } outputInstanceName[2];
744                void main()
745                {
746                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
747                    {
748                        outputInstanceName[0].var = 2.0;
749                        outputInstanceName[1].var = 1.0;
750                        gl_Position = gl_in[ndx].gl_Position;
751                        EmitVertex();
752                    }
753                }
754            ""
755            fragment ""
756                #version 310 es
757                precision mediump float;
758                ${FRAGMENT_DECLARATIONS}
759                in IOBlockName
760                {
761                    mediump float var;
762                } inputInstanceName[2];
763                void main()
764                {
765                    out0 = inputInstanceName[0].var - inputInstanceName[1].var;
766                    ${FRAGMENT_OUTPUT}
767                }
768            ""
769        end
770
771        case unspecified_input_primitive_type
772            version 310 es
773            desc "Geometry shader input type unspecified"
774            expect compile_or_link_fail
775            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
776            vertex ""
777                #version 310 es
778                ${VERTEX_DECLARATIONS}
779                void main()
780                {
781                    ${VERTEX_OUTPUT}
782                }
783            ""
784            geometry ""
785                #version 310 es
786                layout (triangle_strip, max_vertices=3) out;
787                void main()
788                {
789                    gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
790                    EmitVertex();
791                    gl_Position = vec4(0.0, 1.0, 0.0, 1.0);
792                    EmitVertex();
793                    gl_Position = vec4(1.0, 1.0, 0.0, 1.0);
794                    EmitVertex();
795                }
796            ""
797            fragment ""
798                #version 310 es
799                precision mediump float;
800                ${FRAGMENT_DECLARATIONS}
801                void main()
802                {
803                    ${FRAGMENT_OUTPUT}
804                }
805            ""
806        end
807
808        case unspecified_output_primitive_type
809            version 310 es
810            desc "Geometry shader output type unspecified"
811            expect compile_or_link_fail
812            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
813            vertex ""
814                #version 310 es
815                ${VERTEX_DECLARATIONS}
816                void main()
817                {
818                    ${VERTEX_OUTPUT}
819                }
820            ""
821            geometry ""
822                #version 310 es
823                layout (triangles) in;
824                layout (max_vertices=3) out;
825                void main()
826                {
827                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
828                    {
829                        gl_Position = gl_in[ndx].gl_Position;
830                        EmitVertex();
831                    }
832                }
833            ""
834            fragment ""
835                #version 310 es
836                precision mediump float;
837                ${FRAGMENT_DECLARATIONS}
838                void main()
839                {
840                    ${FRAGMENT_OUTPUT}
841                }
842            ""
843        end
844
845        case unspecified_output_primitive_num_vertices
846            version 310 es
847            desc "Geometry shader output type unspecified"
848            expect compile_or_link_fail
849            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
850            vertex ""
851                #version 310 es
852                ${VERTEX_DECLARATIONS}
853                void main()
854                {
855                    ${VERTEX_OUTPUT}
856                }
857            ""
858            geometry ""
859                #version 310 es
860                layout (triangles) in;
861                layout (triangle_strip) out;
862                void main()
863                {
864                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
865                    {
866                        gl_Position = gl_in[ndx].gl_Position;
867                        EmitVertex();
868                    }
869                }
870            ""
871            fragment ""
872                #version 310 es
873                precision mediump float;
874                ${FRAGMENT_DECLARATIONS}
875                void main()
876                {
877                    ${FRAGMENT_OUTPUT}
878                }
879            ""
880        end
881
882        # access_more_than_available_input_vertices
883        case access_more_than_available_input_vertices
884            version 310 es
885            desc "Geometry shader input block with explicit size"
886            expect compile_or_link_fail
887            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
888            vertex ""
889                #version 310 es
890                ${VERTEX_DECLARATIONS}
891                void main()
892                {
893                    ${VERTEX_OUTPUT}
894                }
895            ""
896            geometry ""
897                #version 310 es
898                ${GEOMETRY_DECLARATIONS}
899                void main()
900                {
901                    gl_Position = gl_in[0].gl_Position;
902                    EmitVertex();
903                    gl_Position = gl_in[1].gl_Position;
904                    EmitVertex();
905                    gl_Position = gl_in[4].gl_Position; // access more than available
906                    EmitVertex();
907                }
908            ""
909            fragment ""
910                #version 310 es
911                precision mediump float;
912                ${FRAGMENT_DECLARATIONS}
913                void main()
914                {
915                    ${FRAGMENT_OUTPUT}
916                }
917            ""
918        end
919    end
920
921    import "linkage_geometry_varying_types.test"
922
923    group qualifiers "Varying qualifiers"
924        case smooth
925            version 310 es
926            desc "varying with smooth interpolation"
927            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
928            values
929            {
930                input float in0 = 1.0;
931                output float out0 = 1.0;
932            }
933            vertex ""
934                #version 310 es
935                ${VERTEX_DECLARATIONS}
936                smooth out mediump float vtx_var;
937                void main()
938                {
939                    vtx_var = in0;
940                    ${VERTEX_OUTPUT}
941                }
942            ""
943            geometry ""
944                #version 310 es
945                ${GEOMETRY_DECLARATIONS}
946                smooth in mediump float vtx_var[];
947                smooth out mediump float geo_var;
948                void main()
949                {
950                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
951                    {
952                        geo_var = vtx_var[ndx];
953                        gl_Position = gl_in[ndx].gl_Position;
954                        EmitVertex();
955                    }
956                }
957            ""
958            fragment ""
959                #version 310 es
960                precision mediump float;
961                ${FRAGMENT_DECLARATIONS}
962                smooth in float geo_var;
963                void main()
964                {
965                    out0 = geo_var;
966                    ${FRAGMENT_OUTPUT}
967                }
968            ""
969        end
970
971        case flat
972            version 310 es
973            desc "varying with flat interpolation"
974            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
975            values
976            {
977                input float in0 = 1.0;
978                output float out0 = 1.0;
979            }
980            vertex ""
981                #version 310 es
982                ${VERTEX_DECLARATIONS}
983                flat out mediump float vtx_var;
984                void main()
985                {
986                    vtx_var = in0;
987                    ${VERTEX_OUTPUT}
988                }
989            ""
990            geometry ""
991                #version 310 es
992                ${GEOMETRY_DECLARATIONS}
993                flat in mediump float vtx_var[];
994                flat out mediump float geo_var;
995                void main()
996                {
997                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
998                    {
999                        geo_var = vtx_var[ndx];
1000                        gl_Position = gl_in[ndx].gl_Position;
1001                        EmitVertex();
1002                    }
1003                }
1004            ""
1005            fragment ""
1006                #version 310 es
1007                precision mediump float;
1008                ${FRAGMENT_DECLARATIONS}
1009                flat in float geo_var;
1010                void main()
1011                {
1012                    out0 = geo_var;
1013                    ${FRAGMENT_OUTPUT}
1014                }
1015            ""
1016        end
1017
1018        case centroid
1019            version 310 es
1020            desc "varying declared with centroid qualifier"
1021            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
1022            values
1023            {
1024                input float in0 = 1.0;
1025                output float out0 = 1.0;
1026            }
1027            vertex ""
1028                #version 310 es
1029                ${VERTEX_DECLARATIONS}
1030                centroid out mediump float vtx_var;
1031                void main()
1032                {
1033                    vtx_var = in0;
1034                    ${VERTEX_OUTPUT}
1035                }
1036            ""
1037            geometry ""
1038                #version 310 es
1039                ${GEOMETRY_DECLARATIONS}
1040                centroid in mediump float vtx_var[];
1041                centroid out mediump float geo_var;
1042                void main()
1043                {
1044                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1045                    {
1046                        geo_var = vtx_var[ndx];
1047                        gl_Position = gl_in[ndx].gl_Position;
1048                        EmitVertex();
1049                    }
1050                }
1051            ""
1052            fragment ""
1053                #version 310 es
1054                precision mediump float;
1055                ${FRAGMENT_DECLARATIONS}
1056                centroid in float geo_var;
1057                void main()
1058                {
1059                    out0 = geo_var;
1060                    ${FRAGMENT_OUTPUT}
1061                }
1062            ""
1063        end
1064
1065        case sample
1066            version 310 es
1067            desc "varying declared with sample qualifier"
1068            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
1069            require extension { "GL_OES_shader_multisample_interpolation" }
1070            values
1071            {
1072                input float in0 = 1.0;
1073                output float out0 = 1.0;
1074            }
1075            vertex ""
1076                #version 310 es
1077                ${VERTEX_DECLARATIONS}
1078                sample out mediump float vtx_var;
1079                void main()
1080                {
1081                    vtx_var = in0;
1082                    ${VERTEX_OUTPUT}
1083                }
1084            ""
1085            geometry ""
1086                #version 310 es
1087                ${GEOMETRY_DECLARATIONS}
1088                sample in mediump float vtx_var[];
1089                sample out mediump float geo_var;
1090                void main()
1091                {
1092                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1093                    {
1094                        geo_var = vtx_var[ndx];
1095                        gl_Position = gl_in[ndx].gl_Position;
1096                        EmitVertex();
1097                    }
1098                }
1099            ""
1100            fragment ""
1101                #version 310 es
1102                precision mediump float;
1103                ${FRAGMENT_DECLARATIONS}
1104                sample in float geo_var;
1105                void main()
1106                {
1107                    out0 = geo_var;
1108                    ${FRAGMENT_OUTPUT}
1109                }
1110            ""
1111        end
1112    end
1113end
1114
1115group uniform "Uniform linkage"
1116    group rules "Rules"
1117
1118        case type_mismatch_1
1119            version 310 es
1120            desc "uniforms declared with different types"
1121            expect link_fail
1122            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
1123            vertex ""
1124                #version 310 es
1125                ${VERTEX_DECLARATIONS}
1126                uniform mediump float u_var;
1127                out mediump float vtx_var;
1128                void main()
1129                {
1130                    vtx_var = u_var;
1131                    ${VERTEX_OUTPUT}
1132                }
1133            ""
1134            geometry ""
1135                #version 310 es
1136                ${GEOMETRY_DECLARATIONS}
1137                uniform mediump vec4 u_var;
1138                in mediump float vtx_var[];
1139                out mediump float geo_var;
1140                void main()
1141                {
1142                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1143                    {
1144                        geo_var = vtx_var[ndx];
1145                        gl_Position = gl_in[ndx].gl_Position + u_var;
1146                        EmitVertex();
1147                    }
1148                }
1149            ""
1150            fragment ""
1151                #version 310 es
1152                precision mediump float;
1153                ${FRAGMENT_DECLARATIONS}
1154                in float geo_var;
1155                void main()
1156                {
1157                    ${FRAG_COLOR} = vec4(geo_var);
1158                }
1159            ""
1160        end
1161
1162        case type_mismatch_2
1163            version 310 es
1164            desc "uniforms declared with different types"
1165            expect link_fail
1166            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
1167            require limit "GL_MAX_VERTEX_ATOMIC_COUNTERS" > 0
1168            vertex ""
1169                #version 310 es
1170                ${VERTEX_DECLARATIONS}
1171                layout(binding=0) uniform atomic_uint u_var;
1172                out mediump float vtx_var;
1173                void main()
1174                {
1175                    uint result = atomicCounterIncrement(u_var);
1176                    vtx_var = float(result);
1177                    ${VERTEX_OUTPUT}
1178                }
1179            ""
1180            geometry ""
1181                #version 310 es
1182                ${GEOMETRY_DECLARATIONS}
1183                uniform mediump vec4 u_var;
1184                in mediump float vtx_var[];
1185                out mediump float geo_var;
1186                void main()
1187                {
1188                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1189                    {
1190                        geo_var = vtx_var[ndx];
1191                        gl_Position = gl_in[ndx].gl_Position + u_var;
1192                        EmitVertex();
1193                    }
1194                }
1195            ""
1196            fragment ""
1197                #version 310 es
1198                precision mediump float;
1199                ${FRAGMENT_DECLARATIONS}
1200                in float geo_var;
1201                void main()
1202                {
1203                    ${FRAG_COLOR} = vec4(geo_var);
1204                }
1205            ""
1206        end
1207
1208        case type_mismatch_3
1209            version 310 es
1210            desc "uniforms declared with different types"
1211            expect link_fail
1212            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
1213            require limit "GL_MAX_VERTEX_IMAGE_UNIFORMS" > 0
1214            vertex ""
1215                #version 310 es
1216                ${VERTEX_DECLARATIONS}
1217                layout(binding=0) layout(rgba8i) uniform readonly highp iimage2D u_var;
1218                out mediump float vtx_var;
1219                void main()
1220                {
1221                    int result = imageSize(u_var).x;
1222                    vtx_var = float(result);
1223                    ${VERTEX_OUTPUT}
1224                }
1225            ""
1226            geometry ""
1227                #version 310 es
1228                ${GEOMETRY_DECLARATIONS}
1229                uniform mediump vec4 u_var;
1230                in mediump float vtx_var[];
1231                out mediump float geo_var;
1232                void main()
1233                {
1234                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1235                    {
1236                        geo_var = vtx_var[ndx];
1237                        gl_Position = gl_in[ndx].gl_Position + u_var;
1238                        EmitVertex();
1239                    }
1240                }
1241            ""
1242            fragment ""
1243                #version 310 es
1244                precision mediump float;
1245                ${FRAGMENT_DECLARATIONS}
1246                in float geo_var;
1247                void main()
1248                {
1249                    ${FRAG_COLOR} = vec4(geo_var);
1250                }
1251            ""
1252        end
1253
1254        case precision_mismatch
1255            version 310 es
1256            desc "uniforms declared with different precisions"
1257            expect link_fail
1258            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
1259            vertex ""
1260                #version 310 es
1261                ${VERTEX_DECLARATIONS}
1262                uniform highp float u_var;
1263                out mediump float vtx_var;
1264                void main()
1265                {
1266                    vtx_var = u_var;
1267                    ${VERTEX_OUTPUT}
1268                }
1269            ""
1270            geometry ""
1271                #version 310 es
1272                ${GEOMETRY_DECLARATIONS}
1273                uniform mediump float u_var;
1274                in mediump float vtx_var[];
1275                out mediump float geo_var;
1276                void main()
1277                {
1278                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1279                    {
1280                        geo_var = vtx_var[ndx];
1281                        gl_Position = gl_in[ndx].gl_Position + vec4(u_var);
1282                        EmitVertex();
1283                    }
1284                }
1285            ""
1286            fragment ""
1287                #version 310 es
1288                precision mediump float;
1289                ${FRAGMENT_DECLARATIONS}
1290                in float geo_var;
1291                void main()
1292                {
1293                    ${FRAG_COLOR} = vec4(geo_var);
1294                }
1295            ""
1296        end
1297
1298        case struct_partial_usage
1299            version 310 es
1300            desc "uniforms struct used partially in different stages"
1301            require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry }
1302            values
1303            {
1304                uniform float val.vtxValue = 1.0;
1305                uniform float val.geoValue = 1.0;
1306                uniform float val.frgValue = 1.0;
1307            }
1308            vertex ""
1309                #version 310 es
1310                ${VERTEX_DECLARATIONS}
1311                struct S
1312                {
1313                    mediump float vtxValue;
1314                    mediump float geoValue;
1315                    mediump float frgValue;
1316                };
1317                uniform S val;
1318                out mediump float vtx_var;
1319                void main()
1320                {
1321                    vtx_var = val.vtxValue;
1322                    ${VERTEX_OUTPUT}
1323                }
1324            ""
1325            geometry ""
1326                #version 310 es
1327                ${GEOMETRY_DECLARATIONS}
1328                struct S
1329                {
1330                    mediump float vtxValue;
1331                    mediump float geoValue;
1332                    mediump float frgValue;
1333                };
1334                uniform S val;
1335                in mediump float vtx_var[];
1336                out mediump float geo_var;
1337                void main()
1338                {
1339                    for (int ndx = 0; ndx < gl_in.length(); ++ndx)
1340                    {
1341                        geo_var = vtx_var[ndx] + val.geoValue;
1342                        gl_Position = gl_in[ndx].gl_Position;
1343                        EmitVertex();
1344                    }
1345                }
1346            ""
1347            fragment ""
1348                #version 310 es
1349                precision mediump float;
1350                ${FRAGMENT_DECLARATIONS}
1351                struct S
1352                {
1353                    mediump float vtxValue;
1354                    mediump float geoValue;
1355                    mediump float frgValue;
1356                };
1357                uniform S val;
1358                in float geo_var;
1359                void main()
1360                {
1361                    ${FRAG_COLOR} = vec4(geo_var + val.frgValue);
1362                }
1363            ""
1364        end
1365    end
1366
1367    import "linkage_geometry_uniform_types.test"
1368end
1369