xref: /aosp_15_r20/external/deqp/data/gles31/shaders/es32/linkage_tessellation.test (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 input_type_mismatch
24            version 320 es
25            desc "Tessellation control shader 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 tc_in;
36                void main()
37                {
38                    tc_in = in0;
39                    ${VERTEX_OUTPUT}
40                }
41            ""
42            tessellation_control ""
43                #version 320 es
44                ${TESSELLATION_CONTROL_DECLARATIONS}
45                in mediump vec2 tc_in[];
46                out mediump float tc_out[];
47                void main()
48                {
49                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID].x;
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            fragment ""
65                #version 320 es
66                precision mediump float;
67                ${FRAGMENT_DECLARATIONS}
68                in mediump float te_out;
69                void main()
70                {
71                    out0 = te_out;
72                    ${FRAGMENT_OUTPUT}
73                }
74            ""
75        end
76
77        case output_type_mismatch
78            version 320 es
79            desc "Tessellation evaluation shader output type mismatch"
80            expect link_fail
81            values
82            {
83                input float in0 = 1.0;
84                output float out0 = 1.0;
85            }
86            vertex ""
87                #version 320 es
88                ${VERTEX_DECLARATIONS}
89                out mediump float tc_in;
90                void main()
91                {
92                    tc_in = in0;
93                    ${VERTEX_OUTPUT}
94                }
95            ""
96            tessellation_control ""
97                #version 320 es
98                ${TESSELLATION_CONTROL_DECLARATIONS}
99                in mediump float tc_in[];
100                out mediump float tc_out[];
101                void main()
102                {
103                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
104                    ${TESSELLATION_CONTROL_OUTPUT}
105                }
106            ""
107            tessellation_evaluation ""
108                #version 320 es
109                ${TESSELLATION_EVALUATION_DECLARATIONS}
110                in mediump float tc_out[];
111                out mediump float te_out;
112                void main()
113                {
114                    te_out = tc_out[2];
115                    ${TESSELLATION_EVALUATION_OUTPUT}
116                }
117            ""
118            fragment ""
119                #version 320 es
120                precision mediump float;
121                ${FRAGMENT_DECLARATIONS}
122                in mediump vec2 te_out;
123                void main()
124                {
125                    out0 = te_out.x + te_out.y;
126                    ${FRAGMENT_OUTPUT}
127                }
128            ""
129        end
130
131        case internal_type_mismatch
132            version 320 es
133            desc "Tessellation control and evaluation shader varying type mismatch"
134            expect link_fail
135            values
136            {
137                input float in0 = 1.0;
138                output float out0 = 1.0;
139            }
140            vertex ""
141                #version 320 es
142                ${VERTEX_DECLARATIONS}
143                out mediump float tc_in;
144                void main()
145                {
146                    tc_in = in0;
147                    ${VERTEX_OUTPUT}
148                }
149            ""
150            tessellation_control ""
151                #version 320 es
152                ${TESSELLATION_CONTROL_DECLARATIONS}
153                in mediump float tc_in[];
154                out mediump float tc_out[];
155                void main()
156                {
157                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
158                    ${TESSELLATION_CONTROL_OUTPUT}
159                }
160            ""
161            tessellation_evaluation ""
162                #version 320 es
163                ${TESSELLATION_EVALUATION_DECLARATIONS}
164                in mediump vec2 tc_out[];
165                out mediump float te_out;
166                void main()
167                {
168                    te_out = tc_out[2].x + tc_out[0].y;
169                    ${TESSELLATION_EVALUATION_OUTPUT}
170                }
171            ""
172            fragment ""
173                #version 320 es
174                precision mediump float;
175                ${FRAGMENT_DECLARATIONS}
176                in mediump float te_out;
177                void main()
178                {
179                    out0 = te_out;
180                    ${FRAGMENT_OUTPUT}
181                }
182            ""
183        end
184
185        case input_different_precision
186            version 320 es
187            desc "Tessellation control shader input precisions different"
188            values
189            {
190                input float in0 = 1.0;
191                output float out0 = 1.0;
192            }
193            vertex ""
194                #version 320 es
195                ${VERTEX_DECLARATIONS}
196                out highp float tc_in;
197                void main()
198                {
199                    tc_in = in0;
200                    ${VERTEX_OUTPUT}
201                }
202            ""
203            tessellation_control ""
204                #version 320 es
205                ${TESSELLATION_CONTROL_DECLARATIONS}
206                in lowp float tc_in[];
207                out mediump float tc_out[];
208                void main()
209                {
210                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
211                    ${TESSELLATION_CONTROL_OUTPUT}
212                }
213            ""
214            tessellation_evaluation ""
215                #version 320 es
216                ${TESSELLATION_EVALUATION_DECLARATIONS}
217                in mediump float tc_out[];
218                out mediump float te_out;
219                void main()
220                {
221                    te_out = tc_out[2];
222                    ${TESSELLATION_EVALUATION_OUTPUT}
223                }
224            ""
225            fragment ""
226                #version 320 es
227                precision mediump float;
228                ${FRAGMENT_DECLARATIONS}
229                in mediump float te_out;
230                void main()
231                {
232                    out0 = te_out;
233                    ${FRAGMENT_OUTPUT}
234                }
235            ""
236        end
237
238        case output_different_precision
239            version 320 es
240            desc "Tessellation evaluation shader output precisions different"
241            values
242            {
243                input float in0 = 1.0;
244                output float out0 = 1.0;
245            }
246            vertex ""
247                #version 320 es
248                ${VERTEX_DECLARATIONS}
249                out mediump float tc_in;
250                void main()
251                {
252                    tc_in = in0;
253                    ${VERTEX_OUTPUT}
254                }
255            ""
256            tessellation_control ""
257                #version 320 es
258                ${TESSELLATION_CONTROL_DECLARATIONS}
259                in mediump float tc_in[];
260                out mediump float tc_out[];
261                void main()
262                {
263                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
264                    ${TESSELLATION_CONTROL_OUTPUT}
265                }
266            ""
267            tessellation_evaluation ""
268                #version 320 es
269                ${TESSELLATION_EVALUATION_DECLARATIONS}
270                in mediump float tc_out[];
271                out highp float te_out;
272                void main()
273                {
274                    te_out = tc_out[2];
275                    ${TESSELLATION_EVALUATION_OUTPUT}
276                }
277            ""
278            fragment ""
279                #version 320 es
280                precision mediump float;
281                ${FRAGMENT_DECLARATIONS}
282                in lowp float te_out;
283                void main()
284                {
285                    out0 = te_out;
286                    ${FRAGMENT_OUTPUT}
287                }
288            ""
289        end
290
291        case internal_different_precision
292            version 320 es
293            desc "Tessellation control and evaluation shader varying precisions different"
294            values
295            {
296                input float in0 = 1.0;
297                output float out0 = 1.0;
298            }
299            vertex ""
300                #version 320 es
301                ${VERTEX_DECLARATIONS}
302                out mediump float tc_in;
303                void main()
304                {
305                    tc_in = in0;
306                    ${VERTEX_OUTPUT}
307                }
308            ""
309            tessellation_control ""
310                #version 320 es
311                ${TESSELLATION_CONTROL_DECLARATIONS}
312                in mediump float tc_in[];
313                out highp float tc_out[];
314                void main()
315                {
316                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
317                    ${TESSELLATION_CONTROL_OUTPUT}
318                }
319            ""
320            tessellation_evaluation ""
321                #version 320 es
322                ${TESSELLATION_EVALUATION_DECLARATIONS}
323                in lowp float tc_out[];
324                out mediump float te_out;
325                void main()
326                {
327                    te_out = tc_out[2];
328                    ${TESSELLATION_EVALUATION_OUTPUT}
329                }
330            ""
331            fragment ""
332                #version 320 es
333                precision mediump float;
334                ${FRAGMENT_DECLARATIONS}
335                in mediump float te_out;
336                void main()
337                {
338                    out0 = te_out;
339                    ${FRAGMENT_OUTPUT}
340                }
341            ""
342        end
343
344        case input_no_declaration
345            version 320 es
346            desc "Tessellation control shader input with no matching output"
347            expect link_fail
348            values
349            {
350                input float in0 = 1.0;
351                output float out0 = 1.0;
352            }
353            vertex ""
354                #version 320 es
355                ${VERTEX_DECLARATIONS}
356                void main()
357                {
358                    ${VERTEX_OUTPUT}
359                }
360            ""
361            tessellation_control ""
362                #version 320 es
363                ${TESSELLATION_CONTROL_DECLARATIONS}
364                in mediump float tc_in[];
365                out mediump float tc_out[];
366                void main()
367                {
368                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
369                    ${TESSELLATION_CONTROL_OUTPUT}
370                }
371            ""
372            tessellation_evaluation ""
373                #version 320 es
374                ${TESSELLATION_EVALUATION_DECLARATIONS}
375                in mediump float tc_out[];
376                out mediump float te_out;
377                void main()
378                {
379                    te_out = tc_out[2];
380                    ${TESSELLATION_EVALUATION_OUTPUT}
381                }
382            ""
383            fragment ""
384                #version 320 es
385                precision mediump float;
386                ${FRAGMENT_DECLARATIONS}
387                in mediump float te_out;
388                void main()
389                {
390                    out0 = te_out;
391                    ${FRAGMENT_OUTPUT}
392                }
393            ""
394        end
395
396        case output_no_declaration
397            version 320 es
398            desc "Tessellation evaluation shader without output for an fragment shader input"
399            expect link_fail
400            values
401            {
402                output float out0 = 1.0;
403            }
404            vertex ""
405                #version 320 es
406                ${VERTEX_DECLARATIONS}
407                void main()
408                {
409                    ${VERTEX_OUTPUT}
410                }
411            ""
412            tessellation_control ""
413                #version 320 es
414                ${TESSELLATION_CONTROL_DECLARATIONS}
415                void main()
416                {
417                    ${TESSELLATION_CONTROL_OUTPUT}
418                }
419            ""
420            tessellation_evaluation ""
421                #version 320 es
422                ${TESSELLATION_EVALUATION_DECLARATIONS}
423                void main()
424                {
425                    ${TESSELLATION_EVALUATION_OUTPUT}
426                }
427            ""
428            fragment ""
429                #version 320 es
430                precision mediump float;
431                ${FRAGMENT_DECLARATIONS}
432                in mediump float te_out;
433                void main()
434                {
435                    out0 = te_out;
436                    ${FRAGMENT_OUTPUT}
437                }
438            ""
439        end
440
441        case internal_no_declaration
442            version 320 es
443            desc "Tessellation evaluation shader input without matching output"
444            expect link_fail
445            values
446            {
447                output float out0 = 1.0;
448            }
449            vertex ""
450                #version 320 es
451                ${VERTEX_DECLARATIONS}
452                void main()
453                {
454                    ${VERTEX_OUTPUT}
455                }
456            ""
457            tessellation_control ""
458                #version 320 es
459                ${TESSELLATION_CONTROL_DECLARATIONS}
460                void main()
461                {
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 mediump float te_out;
470                void main()
471                {
472                    te_out = tc_out[2];
473                    ${TESSELLATION_EVALUATION_OUTPUT}
474                }
475            ""
476            fragment ""
477                #version 320 es
478                precision mediump float;
479                ${FRAGMENT_DECLARATIONS}
480                in mediump float te_out;
481                void main()
482                {
483                    out0 = te_out;
484                    ${FRAGMENT_OUTPUT}
485                }
486            ""
487        end
488
489        case input_superfluous_declaration
490            version 320 es
491            desc "Tessellation control has no input for an output"
492            values
493            {
494                input float in0 = 1.0;
495                output float out0 = 1.0;
496            }
497            vertex ""
498                #version 320 es
499                ${VERTEX_DECLARATIONS}
500                out mediump float tc_in;
501                out mediump float tc_in_unused;
502                void main()
503                {
504                    tc_in = in0;
505                    tc_in_unused = in0 + 1.0;
506                    ${VERTEX_OUTPUT}
507                }
508            ""
509            tessellation_control ""
510                #version 320 es
511                ${TESSELLATION_CONTROL_DECLARATIONS}
512                in mediump float tc_in[];
513                out mediump float tc_out[];
514                void main()
515                {
516                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
517                    ${TESSELLATION_CONTROL_OUTPUT}
518                }
519            ""
520            tessellation_evaluation ""
521                #version 320 es
522                ${TESSELLATION_EVALUATION_DECLARATIONS}
523                in mediump float tc_out[];
524                out mediump float te_out;
525                void main()
526                {
527                    te_out = tc_out[2];
528                    ${TESSELLATION_EVALUATION_OUTPUT}
529                }
530            ""
531            fragment ""
532                #version 320 es
533                precision mediump float;
534                ${FRAGMENT_DECLARATIONS}
535                in mediump float te_out;
536                void main()
537                {
538                    out0 = te_out;
539                    ${FRAGMENT_OUTPUT}
540                }
541            ""
542        end
543
544        case output_superfluous_declaration
545            version 320 es
546            desc "Tessellation has an output without a matching input"
547            values
548            {
549                input float in0 = 1.0;
550                output float out0 = 1.0;
551            }
552            vertex ""
553                #version 320 es
554                ${VERTEX_DECLARATIONS}
555                out mediump float tc_in;
556                void main()
557                {
558                    tc_in = in0;
559                    ${VERTEX_OUTPUT}
560                }
561            ""
562            tessellation_control ""
563                #version 320 es
564                ${TESSELLATION_CONTROL_DECLARATIONS}
565                in mediump float tc_in[];
566                out mediump float tc_out[];
567                void main()
568                {
569                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
570                    ${TESSELLATION_CONTROL_OUTPUT}
571                }
572            ""
573            tessellation_evaluation ""
574                #version 320 es
575                ${TESSELLATION_EVALUATION_DECLARATIONS}
576                in mediump float tc_out[];
577                out mediump float te_out;
578                out mediump float te_out_unused;
579                void main()
580                {
581                    te_out = tc_out[2];
582                    te_out_unused = tc_out[0];
583                    ${TESSELLATION_EVALUATION_OUTPUT}
584                }
585            ""
586            fragment ""
587                #version 320 es
588                precision mediump float;
589                ${FRAGMENT_DECLARATIONS}
590                in mediump float te_out;
591                void main()
592                {
593                    out0 = te_out;
594                    ${FRAGMENT_OUTPUT}
595                }
596            ""
597        end
598
599        case internal_superfluous_declaration
600            version 320 es
601            desc "Tessellation control has an output without a matching input"
602            values
603            {
604                input float in0 = 1.0;
605                output float out0 = 1.0;
606            }
607            vertex ""
608                #version 320 es
609                ${VERTEX_DECLARATIONS}
610                out mediump float tc_in;
611                void main()
612                {
613                    tc_in = in0;
614                    ${VERTEX_OUTPUT}
615                }
616            ""
617            tessellation_control ""
618                #version 320 es
619                ${TESSELLATION_CONTROL_DECLARATIONS}
620                in mediump float tc_in[];
621                out mediump float tc_out[];
622                out mediump float tc_out_unused[];
623                void main()
624                {
625                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
626                    tc_out_unused[gl_InvocationID] = tc_in[gl_InvocationID] + 1.0;
627                    ${TESSELLATION_CONTROL_OUTPUT}
628                }
629            ""
630            tessellation_evaluation ""
631                #version 320 es
632                ${TESSELLATION_EVALUATION_DECLARATIONS}
633                in mediump float tc_out[];
634                out mediump float te_out;
635                void main()
636                {
637                    te_out = tc_out[2];
638                    ${TESSELLATION_EVALUATION_OUTPUT}
639                }
640            ""
641            fragment ""
642                #version 320 es
643                precision mediump float;
644                ${FRAGMENT_DECLARATIONS}
645                in mediump float te_out;
646                void main()
647                {
648                    out0 = te_out;
649                    ${FRAGMENT_OUTPUT}
650                }
651            ""
652        end
653
654        case vertex_fragment_same_varying_name_1
655            version 320 es
656            desc "Tessellation control has an output without a matching input"
657            values
658            {
659                input float in0 = 1.0;
660                output float out0 = 2.0;
661            }
662            vertex ""
663                #version 320 es
664                ${VERTEX_DECLARATIONS}
665                out mediump float sharedVaringName;
666                void main()
667                {
668                    sharedVaringName = in0;
669                    ${VERTEX_OUTPUT}
670                }
671            ""
672            tessellation_control ""
673                #version 320 es
674                ${TESSELLATION_CONTROL_DECLARATIONS}
675                in mediump float sharedVaringName[];
676                out mediump float tc_out[];
677                void main()
678                {
679                    tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID];
680                    ${TESSELLATION_CONTROL_OUTPUT}
681                }
682            ""
683            tessellation_evaluation ""
684                #version 320 es
685                ${TESSELLATION_EVALUATION_DECLARATIONS}
686                in mediump float tc_out[];
687                out mediump float sharedVaringName;
688                void main()
689                {
690                    sharedVaringName = 2.0 * tc_out[2];
691                    ${TESSELLATION_EVALUATION_OUTPUT}
692                }
693            ""
694            fragment ""
695                #version 320 es
696                precision mediump float;
697                ${FRAGMENT_DECLARATIONS}
698                in mediump float sharedVaringName;
699                void main()
700                {
701                    out0 = sharedVaringName;
702                    ${FRAGMENT_OUTPUT}
703                }
704            ""
705        end
706
707        case vertex_fragment_same_varying_name_2
708            version 320 es
709            desc "Tessellation control has an output without a matching input"
710            values
711            {
712                input vec2 in0 = vec2(1.0, 3.0);
713                output float out0 = 4.0;
714            }
715            vertex ""
716                #version 320 es
717                ${VERTEX_DECLARATIONS}
718                out mediump vec2 sharedVaringName;
719                void main()
720                {
721                    sharedVaringName = in0;
722                    ${VERTEX_OUTPUT}
723                }
724            ""
725            tessellation_control ""
726                #version 320 es
727                ${TESSELLATION_CONTROL_DECLARATIONS}
728                in mediump vec2 sharedVaringName[];
729                out mediump float tc_out[];
730                void main()
731                {
732                    tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID].x + sharedVaringName[gl_InvocationID].y;
733                    ${TESSELLATION_CONTROL_OUTPUT}
734                }
735            ""
736            tessellation_evaluation ""
737                #version 320 es
738                ${TESSELLATION_EVALUATION_DECLARATIONS}
739                in mediump float tc_out[];
740                out mediump float sharedVaringName;
741                void main()
742                {
743                    sharedVaringName = tc_out[2];
744                    ${TESSELLATION_EVALUATION_OUTPUT}
745                }
746            ""
747            fragment ""
748                #version 320 es
749                precision mediump float;
750                ${FRAGMENT_DECLARATIONS}
751                in mediump float sharedVaringName;
752                void main()
753                {
754                    out0 = sharedVaringName;
755                    ${FRAGMENT_OUTPUT}
756                }
757            ""
758        end
759
760        case invalid_vertex_index
761            version 320 es
762            desc "Tessellation control output not indexed with gl_InvocationID"
763            expect compile_or_link_fail
764            vertex ""
765                #version 320 es
766                ${VERTEX_DECLARATIONS}
767                void main()
768                {
769                    ${VERTEX_OUTPUT}
770                }
771            ""
772            tessellation_control ""
773                #version 320 es
774                ${TESSELLATION_CONTROL_DECLARATIONS}
775                out mediump float tc_out[];
776                void main()
777                {
778                    tc_out[2 - gl_InvocationID] = float(gl_InvocationID);
779                    ${TESSELLATION_CONTROL_OUTPUT}
780                }
781            ""
782            tessellation_evaluation ""
783                #version 320 es
784                ${TESSELLATION_EVALUATION_DECLARATIONS}
785                in mediump float tc_out[];
786                out mediump float te_out;
787                void main()
788                {
789                    te_out = tc_out[2];
790                    ${TESSELLATION_EVALUATION_OUTPUT}
791                }
792            ""
793            fragment ""
794                #version 320 es
795                precision mediump float;
796                ${FRAGMENT_DECLARATIONS}
797                in mediump float te_out;
798                void main()
799                {
800                    ${FRAG_COLOR} = vec4(te_out);
801                }
802            ""
803        end
804
805        case input_non_array
806            version 320 es
807            desc "Tessellation control input in not an array"
808            expect compile_or_link_fail
809            values
810            {
811                input float in0 = 1.0;
812                output float out0 = 1.0;
813            }
814            vertex ""
815                #version 320 es
816                ${VERTEX_DECLARATIONS}
817                out mediump float tc_in;
818                void main()
819                {
820                    tc_in = in0;
821                    ${VERTEX_OUTPUT}
822                }
823            ""
824            tessellation_control ""
825                #version 320 es
826                ${TESSELLATION_CONTROL_DECLARATIONS}
827                in mediump float tc_in;
828                out mediump float tc_out[];
829                void main()
830                {
831                    tc_out[gl_InvocationID] = tc_in;
832                    ${TESSELLATION_CONTROL_OUTPUT}
833                }
834            ""
835            tessellation_evaluation ""
836                #version 320 es
837                ${TESSELLATION_EVALUATION_DECLARATIONS}
838                in mediump float tc_out[];
839                out mediump float te_out;
840                void main()
841                {
842                    te_out = tc_out[2];
843                    ${TESSELLATION_EVALUATION_OUTPUT}
844                }
845            ""
846            fragment ""
847                #version 320 es
848                precision mediump float;
849                ${FRAGMENT_DECLARATIONS}
850                in mediump float te_out;
851                void main()
852                {
853                    out0 = te_out;
854                    ${FRAGMENT_OUTPUT}
855                }
856            ""
857        end
858
859        case input_array_size_mismatch
860            version 320 es
861            desc "Tessellation control input array size is not gl_MaxPatchVertices"
862            expect compile_or_link_fail
863            values
864            {
865                input float in0 = 1.0;
866                output float out0 = 1.0;
867            }
868            vertex ""
869                #version 320 es
870                ${VERTEX_DECLARATIONS}
871                out mediump float tc_in;
872                void main()
873                {
874                    tc_in = in0;
875                    ${VERTEX_OUTPUT}
876                }
877            ""
878            tessellation_control ""
879                #version 320 es
880                ${TESSELLATION_CONTROL_DECLARATIONS}
881                in mediump float tc_in[2]; // not gl_MaxPatchVertices
882                out mediump float tc_out[];
883                void main()
884                {
885                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
886                    ${TESSELLATION_CONTROL_OUTPUT}
887                }
888            ""
889            tessellation_evaluation ""
890                #version 320 es
891                ${TESSELLATION_EVALUATION_DECLARATIONS}
892                in mediump float tc_out[];
893                out mediump float te_out;
894                void main()
895                {
896                    te_out = tc_out[2];
897                    ${TESSELLATION_EVALUATION_OUTPUT}
898                }
899            ""
900            fragment ""
901                #version 320 es
902                precision mediump float;
903                ${FRAGMENT_DECLARATIONS}
904                in mediump float te_out;
905                void main()
906                {
907                    out0 = te_out;
908                    ${FRAGMENT_OUTPUT}
909                }
910            ""
911        end
912
913        case internal_array_size_mismatch
914            version 320 es
915            desc "Tessellation control output array size is not consistent with layout qualifier"
916            expect compile_or_link_fail
917            values
918            {
919                input float in0 = 1.0;
920                output float out0 = 1.0;
921            }
922            vertex ""
923                #version 320 es
924                ${VERTEX_DECLARATIONS}
925                out mediump float tc_in;
926                void main()
927                {
928                    tc_in = in0;
929                    ${VERTEX_OUTPUT}
930                }
931            ""
932            tessellation_control ""
933                #version 320 es
934                ${TESSELLATION_CONTROL_DECLARATIONS}
935                in mediump float tc_in[];
936                out mediump float tc_out[2]; // does not match output layout qualifier
937                void main()
938                {
939                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
940                    ${TESSELLATION_CONTROL_OUTPUT}
941                }
942            ""
943            tessellation_evaluation ""
944                #version 320 es
945                ${TESSELLATION_EVALUATION_DECLARATIONS}
946                in mediump float tc_out[2];
947                out mediump float te_out;
948                void main()
949                {
950                    te_out = tc_out[1];
951                    ${TESSELLATION_EVALUATION_OUTPUT}
952                }
953            ""
954            fragment ""
955                #version 320 es
956                precision mediump float;
957                ${FRAGMENT_DECLARATIONS}
958                in mediump float te_out;
959                void main()
960                {
961                    out0 = te_out;
962                    ${FRAGMENT_OUTPUT}
963                }
964            ""
965        end
966
967        case per_patch_qualifier_mismatch_1
968            version 320 es
969            desc "Tessellation control output is per-patch qualified, evaluation input is not"
970            expect compile_or_link_fail
971            values
972            {
973                input float in0 = 1.0;
974                output float out0 = 1.0;
975            }
976            vertex ""
977                #version 320 es
978                ${VERTEX_DECLARATIONS}
979                out mediump float tc_in;
980                void main()
981                {
982                    tc_in = in0;
983                    ${VERTEX_OUTPUT}
984                }
985            ""
986            tessellation_control ""
987                #version 320 es
988                ${TESSELLATION_CONTROL_DECLARATIONS}
989                in mediump float tc_in[];
990                patch out mediump float tc_out[gl_MaxPatchVertices];
991                void main()
992                {
993                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
994                    ${TESSELLATION_CONTROL_OUTPUT}
995                }
996            ""
997            tessellation_evaluation ""
998                #version 320 es
999                ${TESSELLATION_EVALUATION_DECLARATIONS}
1000                in mediump float tc_out[gl_MaxPatchVertices];
1001                out mediump float te_out;
1002                void main()
1003                {
1004                    te_out = tc_out[2];
1005                    ${TESSELLATION_EVALUATION_OUTPUT}
1006                }
1007            ""
1008            fragment ""
1009                #version 320 es
1010                precision mediump float;
1011                ${FRAGMENT_DECLARATIONS}
1012                in mediump float te_out;
1013                void main()
1014                {
1015                    out0 = te_out;
1016                    ${FRAGMENT_OUTPUT}
1017                }
1018            ""
1019        end
1020
1021        case per_patch_qualifier_mismatch_2
1022            version 320 es
1023            desc "Tessellation control output is not per-patch qualified, evaluation input is"
1024            expect compile_or_link_fail
1025            values
1026            {
1027                input float in0 = 1.0;
1028                output float out0 = 1.0;
1029            }
1030            vertex ""
1031                #version 320 es
1032                ${VERTEX_DECLARATIONS}
1033                out mediump float tc_in;
1034                void main()
1035                {
1036                    tc_in = in0;
1037                    ${VERTEX_OUTPUT}
1038                }
1039            ""
1040            tessellation_control ""
1041                #version 320 es
1042                ${TESSELLATION_CONTROL_DECLARATIONS}
1043                in mediump float tc_in[];
1044                out mediump float tc_out[gl_MaxPatchVertices];
1045                void main()
1046                {
1047                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1048                    ${TESSELLATION_CONTROL_OUTPUT}
1049                }
1050            ""
1051            tessellation_evaluation ""
1052                #version 320 es
1053                ${TESSELLATION_EVALUATION_DECLARATIONS}
1054                patch in mediump float tc_out[gl_MaxPatchVertices];
1055                out mediump float te_out;
1056                void main()
1057                {
1058                    te_out = tc_out[2];
1059                    ${TESSELLATION_EVALUATION_OUTPUT}
1060                }
1061            ""
1062            fragment ""
1063                #version 320 es
1064                precision mediump float;
1065                ${FRAGMENT_DECLARATIONS}
1066                in mediump float te_out;
1067                void main()
1068                {
1069                    out0 = te_out;
1070                    ${FRAGMENT_OUTPUT}
1071                }
1072            ""
1073        end
1074
1075        case input_block
1076            version 320 es
1077            desc "Tessellation control shader input block"
1078            values { output float out0 = 1.0; }
1079            vertex ""
1080                #version 320 es
1081                ${VERTEX_DECLARATIONS}
1082                out IOBlockName
1083                {
1084                    mediump float var;
1085                } outputInstanceName;
1086                void main()
1087                {
1088                    outputInstanceName.var = 1.0;
1089                    ${VERTEX_OUTPUT}
1090                }
1091            ""
1092            tessellation_control ""
1093                #version 320 es
1094                ${TESSELLATION_CONTROL_DECLARATIONS}
1095                in IOBlockName
1096                {
1097                    mediump float var;
1098                } inputInstanceName[];
1099                out mediump float tc_out[];
1100                void main()
1101                {
1102                    tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID].var;
1103                    ${TESSELLATION_CONTROL_OUTPUT}
1104                }
1105            ""
1106            tessellation_evaluation ""
1107                #version 320 es
1108                ${TESSELLATION_EVALUATION_DECLARATIONS}
1109                in mediump float tc_out[];
1110                out mediump float te_out;
1111                void main()
1112                {
1113                    te_out = tc_out[2];
1114                    ${TESSELLATION_EVALUATION_OUTPUT}
1115                }
1116            ""
1117            fragment ""
1118                #version 320 es
1119                precision mediump float;
1120                ${FRAGMENT_DECLARATIONS}
1121                in mediump float te_out;
1122                void main()
1123                {
1124                    out0 = te_out;
1125                    ${FRAGMENT_OUTPUT}
1126                }
1127            ""
1128        end
1129
1130        case input_block_non_array
1131            version 320 es
1132            desc "Tessellation control shader input block with explicit array"
1133            expect compile_or_link_fail
1134            values { output float out0 = 1.0; }
1135            vertex ""
1136                #version 320 es
1137                ${VERTEX_DECLARATIONS}
1138                out IOBlockName
1139                {
1140                    mediump float var;
1141                } outputInstanceName;
1142                void main()
1143                {
1144                    outputInstanceName.var = 1.0;
1145                    ${VERTEX_OUTPUT}
1146                }
1147            ""
1148            tessellation_control ""
1149                #version 320 es
1150                ${TESSELLATION_CONTROL_DECLARATIONS}
1151                in IOBlockName
1152                {
1153                    mediump float var;
1154                } inputInstanceName;
1155                out mediump float tc_out[];
1156                void main()
1157                {
1158                    tc_out[gl_InvocationID] = inputInstanceName.var;
1159                    ${TESSELLATION_CONTROL_OUTPUT}
1160                }
1161            ""
1162            tessellation_evaluation ""
1163                #version 320 es
1164                ${TESSELLATION_EVALUATION_DECLARATIONS}
1165                in mediump float tc_out[];
1166                out mediump float te_out;
1167                void main()
1168                {
1169                    te_out = tc_out[2];
1170                    ${TESSELLATION_EVALUATION_OUTPUT}
1171                }
1172            ""
1173            fragment ""
1174                #version 320 es
1175                precision mediump float;
1176                ${FRAGMENT_DECLARATIONS}
1177                in mediump float geo_out;
1178                void main()
1179                {
1180                    out0 = geo_out;
1181                    ${FRAGMENT_OUTPUT}
1182                }
1183            ""
1184        end
1185
1186        case input_block_array_size_mismatch
1187            version 320 es
1188            desc "Tessellation control shader input block array, size not gl_MaxPatchVertices"
1189            expect compile_or_link_fail
1190            values { output float out0 = 1.0; }
1191            vertex ""
1192                #version 320 es
1193                ${VERTEX_DECLARATIONS}
1194                out IOBlockName
1195                {
1196                    mediump float var;
1197                } outputInstanceName;
1198                void main()
1199                {
1200                    outputInstanceName.var = 1.0;
1201                    ${VERTEX_OUTPUT}
1202                }
1203            ""
1204            tessellation_control ""
1205                #version 320 es
1206                ${TESSELLATION_CONTROL_DECLARATIONS}
1207                in IOBlockName
1208                {
1209                    mediump float var;
1210                } inputInstanceName[4]; // not gl_MaxPatchVertices
1211                out mediump float tc_out[];
1212                void main()
1213                {
1214                    tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID + 1].var;
1215                    ${TESSELLATION_CONTROL_OUTPUT}
1216                }
1217            ""
1218            tessellation_evaluation ""
1219                #version 320 es
1220                ${TESSELLATION_EVALUATION_DECLARATIONS}
1221                in mediump float tc_out[];
1222                out mediump float te_out;
1223                void main()
1224                {
1225                    te_out = tc_out[2];
1226                    ${TESSELLATION_EVALUATION_OUTPUT}
1227                }
1228            ""
1229            fragment ""
1230                #version 320 es
1231                precision mediump float;
1232                ${FRAGMENT_DECLARATIONS}
1233                in mediump float geo_out;
1234                void main()
1235                {
1236                    out0 = geo_out;
1237                    ${FRAGMENT_OUTPUT}
1238                }
1239            ""
1240        end
1241
1242        case output_block
1243            version 320 es
1244            desc "Tessellation shader output block"
1245            values { output float out0 = 1.0; }
1246            vertex ""
1247                #version 320 es
1248                ${VERTEX_DECLARATIONS}
1249                void main()
1250                {
1251                    ${VERTEX_OUTPUT}
1252                }
1253            ""
1254            tessellation_control ""
1255                #version 320 es
1256                ${TESSELLATION_CONTROL_DECLARATIONS}
1257                void main()
1258                {
1259                    ${TESSELLATION_CONTROL_OUTPUT}
1260                }
1261            ""
1262            tessellation_evaluation ""
1263                #version 320 es
1264                ${TESSELLATION_EVALUATION_DECLARATIONS}
1265                out IOBlockName
1266                {
1267                    mediump float var;
1268                } outputInstanceName;
1269                void main()
1270                {
1271                    outputInstanceName.var = 1.0;
1272                    ${TESSELLATION_EVALUATION_OUTPUT}
1273                }
1274            ""
1275            fragment ""
1276                #version 320 es
1277                precision mediump float;
1278                ${FRAGMENT_DECLARATIONS}
1279                in IOBlockName
1280                {
1281                    mediump float var;
1282                } inputInstanceName;
1283                void main()
1284                {
1285                    out0 = inputInstanceName.var;
1286                    ${FRAGMENT_OUTPUT}
1287                }
1288            ""
1289        end
1290
1291        case output_block_array
1292            version 320 es
1293            desc "Tessellation shader output block array"
1294            values { output float out0 = 1.0; }
1295            vertex ""
1296                #version 320 es
1297                ${VERTEX_DECLARATIONS}
1298                void main()
1299                {
1300                    ${VERTEX_OUTPUT}
1301                }
1302            ""
1303            tessellation_control ""
1304                #version 320 es
1305                ${TESSELLATION_CONTROL_DECLARATIONS}
1306                void main()
1307                {
1308                    ${TESSELLATION_CONTROL_OUTPUT}
1309                }
1310            ""
1311            tessellation_evaluation ""
1312                #version 320 es
1313                ${TESSELLATION_EVALUATION_DECLARATIONS}
1314                out IOBlockName
1315                {
1316                    mediump float var;
1317                } outputInstanceName[2];
1318                void main()
1319                {
1320                    outputInstanceName[0].var = 2.0;
1321                    outputInstanceName[1].var = 1.0;
1322                    ${TESSELLATION_EVALUATION_OUTPUT}
1323                }
1324            ""
1325            fragment ""
1326                #version 320 es
1327                precision mediump float;
1328                ${FRAGMENT_DECLARATIONS}
1329                in IOBlockName
1330                {
1331                    mediump float var;
1332                } inputInstanceName[2];
1333                void main()
1334                {
1335                    out0 = inputInstanceName[0].var - inputInstanceName[1].var;
1336                    ${FRAGMENT_OUTPUT}
1337                }
1338            ""
1339        end
1340
1341        case unspecified_vertex_count
1342            version 320 es
1343            desc "Tessellation shader unspecified vertex count"
1344            expect compile_or_link_fail
1345            vertex ""
1346                #version 320 es
1347                ${VERTEX_DECLARATIONS}
1348                void main()
1349                {
1350                    ${VERTEX_OUTPUT}
1351                }
1352            ""
1353            tessellation_control ""
1354                #version 320 es
1355                void main()
1356                {
1357                    ${TESSELLATION_CONTROL_OUTPUT}
1358                }
1359            ""
1360            tessellation_evaluation ""
1361                #version 320 es
1362                ${TESSELLATION_EVALUATION_DECLARATIONS}
1363                void main()
1364                {
1365                    ${TESSELLATION_EVALUATION_OUTPUT}
1366                }
1367            ""
1368            fragment ""
1369                #version 320 es
1370                precision mediump float;
1371                ${FRAGMENT_DECLARATIONS}
1372                void main()
1373                {
1374                    ${FRAGMENT_OUTPUT}
1375                }
1376            ""
1377        end
1378
1379        case unspecified_primitive_mode
1380            version 320 es
1381            desc "Tessellation shader unspecified vertex count"
1382            expect compile_or_link_fail
1383            vertex ""
1384                #version 320 es
1385                ${VERTEX_DECLARATIONS}
1386                void main()
1387                {
1388                    ${VERTEX_OUTPUT}
1389                }
1390            ""
1391            tessellation_control ""
1392                #version 320 es
1393                ${TESSELLATION_CONTROL_DECLARATIONS}
1394                void main()
1395                {
1396                    ${TESSELLATION_CONTROL_OUTPUT}
1397                }
1398            ""
1399            tessellation_evaluation ""
1400                #version 320 es
1401                void main()
1402                {
1403                    ${TESSELLATION_EVALUATION_OUTPUT}
1404                }
1405            ""
1406            fragment ""
1407                #version 320 es
1408                precision mediump float;
1409                ${FRAGMENT_DECLARATIONS}
1410                void main()
1411                {
1412                    ${FRAGMENT_OUTPUT}
1413                }
1414            ""
1415        end
1416    end
1417
1418    group qualifiers "Varying qualifiers"
1419        case smooth
1420            version 320 es
1421            desc "Smooth varying"
1422            values
1423            {
1424                input float in0 = 1.0;
1425                output float out0 = 1.0;
1426            }
1427            vertex ""
1428                #version 320 es
1429                ${VERTEX_DECLARATIONS}
1430                smooth out mediump float tc_in;
1431                void main()
1432                {
1433                    tc_in = in0;
1434                    ${VERTEX_OUTPUT}
1435                }
1436            ""
1437            tessellation_control ""
1438                #version 320 es
1439                ${TESSELLATION_CONTROL_DECLARATIONS}
1440                smooth in mediump float tc_in[];
1441                smooth out mediump float tc_out[];
1442                void main()
1443                {
1444                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1445                    ${TESSELLATION_CONTROL_OUTPUT}
1446                }
1447            ""
1448            tessellation_evaluation ""
1449                #version 320 es
1450                ${TESSELLATION_EVALUATION_DECLARATIONS}
1451                smooth in mediump float tc_out[];
1452                smooth out mediump float te_out;
1453                void main()
1454                {
1455                    te_out = tc_out[2];
1456                    ${TESSELLATION_EVALUATION_OUTPUT}
1457                }
1458            ""
1459            fragment ""
1460                #version 320 es
1461                precision mediump float;
1462                ${FRAGMENT_DECLARATIONS}
1463                smooth in mediump float te_out;
1464                void main()
1465                {
1466                    out0 = te_out;
1467                    ${FRAGMENT_OUTPUT}
1468                }
1469            ""
1470        end
1471
1472        case flat
1473            version 320 es
1474            desc "Flat varying"
1475            values
1476            {
1477                input float in0 = 1.0;
1478                output float out0 = 1.0;
1479            }
1480            vertex ""
1481                #version 320 es
1482                ${VERTEX_DECLARATIONS}
1483                flat out mediump float tc_in;
1484                void main()
1485                {
1486                    tc_in = in0;
1487                    ${VERTEX_OUTPUT}
1488                }
1489            ""
1490            tessellation_control ""
1491                #version 320 es
1492                ${TESSELLATION_CONTROL_DECLARATIONS}
1493                flat in mediump float tc_in[];
1494                flat out mediump float tc_out[];
1495                void main()
1496                {
1497                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1498                    ${TESSELLATION_CONTROL_OUTPUT}
1499                }
1500            ""
1501            tessellation_evaluation ""
1502                #version 320 es
1503                ${TESSELLATION_EVALUATION_DECLARATIONS}
1504                flat in mediump float tc_out[];
1505                flat out mediump float te_out;
1506                void main()
1507                {
1508                    te_out = tc_out[2];
1509                    ${TESSELLATION_EVALUATION_OUTPUT}
1510                }
1511            ""
1512            fragment ""
1513                #version 320 es
1514                precision mediump float;
1515                ${FRAGMENT_DECLARATIONS}
1516                flat in mediump float te_out;
1517                void main()
1518                {
1519                    out0 = te_out;
1520                    ${FRAGMENT_OUTPUT}
1521                }
1522            ""
1523        end
1524
1525        case centroid
1526            version 320 es
1527            desc "Centroid varying"
1528            values
1529            {
1530                input float in0 = 1.0;
1531                output float out0 = 1.0;
1532            }
1533            vertex ""
1534                #version 320 es
1535                ${VERTEX_DECLARATIONS}
1536                centroid out mediump float tc_in;
1537                void main()
1538                {
1539                    tc_in = in0;
1540                    ${VERTEX_OUTPUT}
1541                }
1542            ""
1543            tessellation_control ""
1544                #version 320 es
1545                ${TESSELLATION_CONTROL_DECLARATIONS}
1546                centroid in mediump float tc_in[];
1547                centroid out mediump float tc_out[];
1548                void main()
1549                {
1550                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1551                    ${TESSELLATION_CONTROL_OUTPUT}
1552                }
1553            ""
1554            tessellation_evaluation ""
1555                #version 320 es
1556                ${TESSELLATION_EVALUATION_DECLARATIONS}
1557                centroid in mediump float tc_out[];
1558                centroid out mediump float te_out;
1559                void main()
1560                {
1561                    te_out = tc_out[2];
1562                    ${TESSELLATION_EVALUATION_OUTPUT}
1563                }
1564            ""
1565            fragment ""
1566                #version 320 es
1567                precision mediump float;
1568                ${FRAGMENT_DECLARATIONS}
1569                centroid in mediump float te_out;
1570                void main()
1571                {
1572                    out0 = te_out;
1573                    ${FRAGMENT_OUTPUT}
1574                }
1575            ""
1576        end
1577
1578        case sample
1579            version 320 es
1580            desc "Sample varying"
1581            values
1582            {
1583                input float in0 = 1.0;
1584                output float out0 = 1.0;
1585            }
1586            vertex ""
1587                #version 320 es
1588                ${VERTEX_DECLARATIONS}
1589                sample out mediump float tc_in;
1590                void main()
1591                {
1592                    tc_in = in0;
1593                    ${VERTEX_OUTPUT}
1594                }
1595            ""
1596            tessellation_control ""
1597                #version 320 es
1598                ${TESSELLATION_CONTROL_DECLARATIONS}
1599                sample in mediump float tc_in[];
1600                sample out mediump float tc_out[];
1601                void main()
1602                {
1603                    tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
1604                    ${TESSELLATION_CONTROL_OUTPUT}
1605                }
1606            ""
1607            tessellation_evaluation ""
1608                #version 320 es
1609                ${TESSELLATION_EVALUATION_DECLARATIONS}
1610                sample in mediump float tc_out[];
1611                sample out mediump float te_out;
1612                void main()
1613                {
1614                    te_out = tc_out[2];
1615                    ${TESSELLATION_EVALUATION_OUTPUT}
1616                }
1617            ""
1618            fragment ""
1619                #version 320 es
1620                precision mediump float;
1621                ${FRAGMENT_DECLARATIONS}
1622                sample in mediump float te_out;
1623                void main()
1624                {
1625                    out0 = te_out;
1626                    ${FRAGMENT_OUTPUT}
1627                }
1628            ""
1629        end
1630
1631        case patch
1632            version 320 es
1633            desc "Pre-patch varying"
1634            values
1635            {
1636                input float in0 = 1.0;
1637                output float out0 = 1.0;
1638            }
1639            vertex ""
1640                #version 320 es
1641                ${VERTEX_DECLARATIONS}
1642                out mediump float tc_in;
1643                void main()
1644                {
1645                    tc_in = in0;
1646                    ${VERTEX_OUTPUT}
1647                }
1648            ""
1649            tessellation_control ""
1650                #version 320 es
1651                ${TESSELLATION_CONTROL_DECLARATIONS}
1652                in mediump float tc_in[];
1653                patch out mediump float tc_out;
1654                void main()
1655                {
1656                    tc_out = tc_in[gl_InvocationID];
1657                    ${TESSELLATION_CONTROL_OUTPUT}
1658                }
1659            ""
1660            tessellation_evaluation ""
1661                #version 320 es
1662                ${TESSELLATION_EVALUATION_DECLARATIONS}
1663                patch in mediump float tc_out;
1664                out mediump float te_out;
1665                void main()
1666                {
1667                    te_out = tc_out;
1668                    ${TESSELLATION_EVALUATION_OUTPUT}
1669                }
1670            ""
1671            fragment ""
1672                #version 320 es
1673                precision mediump float;
1674                ${FRAGMENT_DECLARATIONS}
1675                in mediump float te_out;
1676                void main()
1677                {
1678                    out0 = te_out;
1679                    ${FRAGMENT_OUTPUT}
1680                }
1681            ""
1682        end
1683    end
1684
1685    import "linkage_tessellation_varying_types.test"
1686end
1687
1688group uniform "Uniform"
1689    group rules "Rules"
1690        case type_mismatch_1
1691            version 320 es
1692            desc "uniform type mismatch between vertex and tessellation control shaders"
1693            expect link_fail
1694            vertex ""
1695                #version 320 es
1696                ${VERTEX_DECLARATIONS}
1697                uniform mediump float val;
1698                out mediump float vtx_out;
1699                void main()
1700                {
1701                    vtx_out = val;
1702                    ${VERTEX_OUTPUT}
1703                }
1704            ""
1705            tessellation_control ""
1706                #version 320 es
1707                ${TESSELLATION_CONTROL_DECLARATIONS}
1708                uniform mediump vec2 val;
1709                in mediump float vtx_out[];
1710                out mediump float tc_out[];
1711                void main()
1712                {
1713                    tc_out[gl_InvocationID] = vtx_out[0] + val.x + val.y;
1714                    ${TESSELLATION_CONTROL_OUTPUT}
1715                }
1716            ""
1717            tessellation_evaluation ""
1718                #version 320 es
1719                ${TESSELLATION_EVALUATION_DECLARATIONS}
1720                in mediump float tc_out[];
1721                out mediump float te_out;
1722                void main()
1723                {
1724                    te_out = tc_out[2];
1725                    ${TESSELLATION_EVALUATION_OUTPUT}
1726                }
1727            ""
1728            fragment ""
1729                #version 320 es
1730                precision mediump float;
1731                ${FRAGMENT_DECLARATIONS}
1732                in mediump float te_out;
1733                void main()
1734                {
1735                    ${FRAG_COLOR} = vec4(te_out);
1736                }
1737            ""
1738        end
1739
1740        case type_mismatch_2
1741            version 320 es
1742            desc "uniform type mismatch between fragment and tessellation eval shaders"
1743            expect link_fail
1744            vertex ""
1745                #version 320 es
1746                ${VERTEX_DECLARATIONS}
1747                out mediump float vtx_out;
1748                void main()
1749                {
1750                    ${VERTEX_OUTPUT}
1751                }
1752            ""
1753            tessellation_control ""
1754                #version 320 es
1755                ${TESSELLATION_CONTROL_DECLARATIONS}
1756                void main()
1757                {
1758                    ${TESSELLATION_CONTROL_OUTPUT}
1759                }
1760            ""
1761            tessellation_evaluation ""
1762                #version 320 es
1763                ${TESSELLATION_EVALUATION_DECLARATIONS}
1764                uniform mediump vec3 val;
1765                out mediump float te_out;
1766                void main()
1767                {
1768                    te_out = val.x + val.y + val.z;
1769                    ${TESSELLATION_EVALUATION_OUTPUT}
1770                }
1771            ""
1772            fragment ""
1773                #version 320 es
1774                precision mediump float;
1775                ${FRAGMENT_DECLARATIONS}
1776                uniform mediump vec4 val;
1777                in mediump float te_out;
1778                void main()
1779                {
1780                    ${FRAG_COLOR} = vec4(te_out) + val;
1781                }
1782            ""
1783        end
1784
1785        case type_mismatch_3
1786            version 320 es
1787            desc "uniform type mismatch between tessellation control and eval shaders"
1788            expect link_fail
1789            vertex ""
1790                #version 320 es
1791                ${VERTEX_DECLARATIONS}
1792                out mediump float vtx_out;
1793                void main()
1794                {
1795                    ${VERTEX_OUTPUT}
1796                }
1797            ""
1798            tessellation_control ""
1799                #version 320 es
1800                ${TESSELLATION_CONTROL_DECLARATIONS}
1801                uniform mediump vec4 val;
1802                out mediump vec4 tc_out[];
1803                void main()
1804                {
1805                    tc_out[gl_InvocationID] = val;
1806                    ${TESSELLATION_CONTROL_OUTPUT}
1807                }
1808            ""
1809            tessellation_evaluation ""
1810                #version 320 es
1811                ${TESSELLATION_EVALUATION_DECLARATIONS}
1812                uniform mediump vec3 val;
1813                in mediump vec4 tc_out[];
1814                out mediump float te_out;
1815                void main()
1816                {
1817                    te_out = tc_out[0].w * val.z;
1818                    ${TESSELLATION_EVALUATION_OUTPUT}
1819                }
1820            ""
1821            fragment ""
1822                #version 320 es
1823                precision mediump float;
1824                ${FRAGMENT_DECLARATIONS}
1825                in mediump float te_out;
1826                void main()
1827                {
1828                    ${FRAG_COLOR} = vec4(te_out);
1829                }
1830            ""
1831        end
1832
1833        case type_mismatch_4
1834            version 320 es
1835            desc "uniform type mismatch between vertex and tessellation control shaders"
1836            expect link_fail
1837            require limit "GL_MAX_VERTEX_ATOMIC_COUNTERS" > 0
1838            vertex ""
1839                #version 320 es
1840                ${VERTEX_DECLARATIONS}
1841                layout(binding=0) uniform atomic_uint u_var;
1842                out mediump float vtx_out;
1843                void main()
1844                {
1845                    uint result = atomicCounterIncrement(u_var);
1846                    vtx_out = float(result);
1847                    ${VERTEX_OUTPUT}
1848                }
1849            ""
1850            tessellation_control ""
1851                #version 320 es
1852                ${TESSELLATION_CONTROL_DECLARATIONS}
1853                uniform mediump float u_var;
1854                in mediump float vtx_out[];
1855                out mediump float tc_out[];
1856                void main()
1857                {
1858                    tc_out[gl_InvocationID] = vtx_out[0] + u_var;
1859                    ${TESSELLATION_CONTROL_OUTPUT}
1860                }
1861            ""
1862            tessellation_evaluation ""
1863                #version 320 es
1864                ${TESSELLATION_EVALUATION_DECLARATIONS}
1865                in mediump float tc_out[];
1866                out mediump float te_out;
1867                void main()
1868                {
1869                    te_out = tc_out[2];
1870                    ${TESSELLATION_EVALUATION_OUTPUT}
1871                }
1872            ""
1873            fragment ""
1874                #version 320 es
1875                precision mediump float;
1876                ${FRAGMENT_DECLARATIONS}
1877                in mediump float te_out;
1878                void main()
1879                {
1880                    ${FRAG_COLOR} = vec4(te_out);
1881                }
1882            ""
1883        end
1884
1885        case type_mismatch_5
1886            version 320 es
1887            desc "uniform type mismatch between vertex and tessellation control shaders"
1888            expect link_fail
1889            require limit "GL_MAX_VERTEX_IMAGE_UNIFORMS" > 0
1890            vertex ""
1891                #version 320 es
1892                ${VERTEX_DECLARATIONS}
1893                layout(binding=0) layout(rgba8i) uniform readonly highp iimage2D u_var;
1894                out mediump float vtx_out;
1895                void main()
1896                {
1897                    int result = imageSize(u_var).x;
1898                    vtx_out = float(result);
1899                    ${VERTEX_OUTPUT}
1900                }
1901            ""
1902            tessellation_control ""
1903                #version 320 es
1904                ${TESSELLATION_CONTROL_DECLARATIONS}
1905                uniform mediump float u_var;
1906                in mediump float vtx_out[];
1907                out mediump float tc_out[];
1908                void main()
1909                {
1910                    tc_out[gl_InvocationID] = vtx_out[0] + u_var;
1911                    ${TESSELLATION_CONTROL_OUTPUT}
1912                }
1913            ""
1914            tessellation_evaluation ""
1915                #version 320 es
1916                ${TESSELLATION_EVALUATION_DECLARATIONS}
1917                in mediump float tc_out[];
1918                out mediump float te_out;
1919                void main()
1920                {
1921                    te_out = tc_out[2];
1922                    ${TESSELLATION_EVALUATION_OUTPUT}
1923                }
1924            ""
1925            fragment ""
1926                #version 320 es
1927                precision mediump float;
1928                ${FRAGMENT_DECLARATIONS}
1929                in mediump float te_out;
1930                void main()
1931                {
1932                    ${FRAG_COLOR} = vec4(te_out);
1933                }
1934            ""
1935        end
1936
1937        case precision_mismatch_1
1938            version 320 es
1939            desc "uniform precision mismatch between tessellation control and eval shaders"
1940            expect link_fail
1941            vertex ""
1942                #version 320 es
1943                ${VERTEX_DECLARATIONS}
1944                out mediump float vtx_out;
1945                void main()
1946                {
1947                    ${VERTEX_OUTPUT}
1948                }
1949            ""
1950            tessellation_control ""
1951                #version 320 es
1952                ${TESSELLATION_CONTROL_DECLARATIONS}
1953                uniform mediump vec4 val;
1954                out mediump vec4 tc_out[];
1955                void main()
1956                {
1957                    tc_out[gl_InvocationID] = val;
1958                    ${TESSELLATION_CONTROL_OUTPUT}
1959                }
1960            ""
1961            tessellation_evaluation ""
1962                #version 320 es
1963                ${TESSELLATION_EVALUATION_DECLARATIONS}
1964                uniform highp vec4 val;
1965                in mediump vec4 tc_out[];
1966                out mediump float te_out;
1967                void main()
1968                {
1969                    te_out = tc_out[0].w * val.z;
1970                    ${TESSELLATION_EVALUATION_OUTPUT}
1971                }
1972            ""
1973            fragment ""
1974                #version 320 es
1975                precision mediump float;
1976                ${FRAGMENT_DECLARATIONS}
1977                in mediump float te_out;
1978                void main()
1979                {
1980                    ${FRAG_COLOR} = vec4(te_out);
1981                }
1982            ""
1983        end
1984
1985        case precision_mismatch_2
1986            version 320 es
1987            desc "uniform precision mismatch between vertex and tessellation control shaders"
1988            expect link_fail
1989            vertex ""
1990                #version 320 es
1991                ${VERTEX_DECLARATIONS}
1992                uniform highp float val;
1993                out mediump float vtx_out;
1994                void main()
1995                {
1996                    vtx_out = val;
1997                    ${VERTEX_OUTPUT}
1998                }
1999            ""
2000            tessellation_control ""
2001                #version 320 es
2002                ${TESSELLATION_CONTROL_DECLARATIONS}
2003                uniform mediump float val;
2004                in mediump float vtx_out[];
2005                out mediump float tc_out[];
2006                void main()
2007                {
2008                    tc_out[gl_InvocationID] = vtx_out[0] + val;
2009                    ${TESSELLATION_CONTROL_OUTPUT}
2010                }
2011            ""
2012            tessellation_evaluation ""
2013                #version 320 es
2014                ${TESSELLATION_EVALUATION_DECLARATIONS}
2015                in mediump float tc_out[];
2016                out mediump float te_out;
2017                void main()
2018                {
2019                    te_out = tc_out[2];
2020                    ${TESSELLATION_EVALUATION_OUTPUT}
2021                }
2022            ""
2023            fragment ""
2024                #version 320 es
2025                precision mediump float;
2026                ${FRAGMENT_DECLARATIONS}
2027                in mediump float te_out;
2028                void main()
2029                {
2030                    ${FRAG_COLOR} = vec4(te_out);
2031                }
2032            ""
2033        end
2034
2035        case struct_partial_usage
2036            version 320 es
2037            desc "uniform is partially used in different shader stages"
2038            values
2039            {
2040                uniform float val.vtxVal = 1.5;
2041                uniform float val.tcVal = 2.5;
2042                uniform float val.teVal = 6.0;
2043                uniform float val.fragVal = 11.0;
2044                output float out0 = 68.5;
2045            }
2046            vertex ""
2047                #version 320 es
2048                ${VERTEX_DECLARATIONS}
2049                struct S
2050                {
2051                    mediump float vtxVal;
2052                    mediump float tcVal;
2053                    mediump float teVal;
2054                    mediump float fragVal;
2055                };
2056                uniform S val;
2057                out mediump float vtx_out;
2058                void main()
2059                {
2060                    vtx_out = val.vtxVal;
2061                    ${VERTEX_OUTPUT}
2062                }
2063            ""
2064            tessellation_control ""
2065                #version 320 es
2066                ${TESSELLATION_CONTROL_DECLARATIONS}
2067                struct S
2068                {
2069                    mediump float vtxVal;
2070                    mediump float tcVal;
2071                    mediump float teVal;
2072                    mediump float fragVal;
2073                };
2074                uniform S val;
2075                in mediump float vtx_out[];
2076                out mediump float tc_out[];
2077                void main()
2078                {
2079                    tc_out[gl_InvocationID] = vtx_out[0] + 2.0 * val.tcVal;
2080                    ${TESSELLATION_CONTROL_OUTPUT}
2081                }
2082            ""
2083            tessellation_evaluation ""
2084                #version 320 es
2085                ${TESSELLATION_EVALUATION_DECLARATIONS}
2086                struct S
2087                {
2088                    mediump float vtxVal;
2089                    mediump float tcVal;
2090                    mediump float teVal;
2091                    mediump float fragVal;
2092                };
2093                uniform S val;
2094                in mediump float tc_out[];
2095                out mediump float te_out;
2096                void main()
2097                {
2098                    te_out = tc_out[2] + 3.0 * val.teVal;
2099                    ${TESSELLATION_EVALUATION_OUTPUT}
2100                }
2101            ""
2102            fragment ""
2103                #version 320 es
2104                precision mediump float;
2105                ${FRAGMENT_DECLARATIONS}
2106                struct S
2107                {
2108                    mediump float vtxVal;
2109                    mediump float tcVal;
2110                    mediump float teVal;
2111                    mediump float fragVal;
2112                };
2113                uniform S val;
2114                in mediump float te_out;
2115                void main()
2116                {
2117                    out0 = te_out + 4.0 * val.fragVal;
2118                    ${FRAGMENT_OUTPUT};
2119                }
2120            ""
2121        end
2122    end
2123
2124    import "linkage_tessellation_uniform_types.test"
2125end
2126