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