1 2group 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 output_non_array 858 version 310 es 859 desc "Tessellation control output out not an array" 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[]; 881 out mediump float tc_out; // not an array 882 void main() 883 { 884 tc_out = 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 input_array_size_mismatch 913 version 310 es 914 desc "Tessellation control input array size is not gl_MaxPatchVertices" 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[2]; // not gl_MaxPatchVertices 936 out mediump float tc_out[]; 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[]; 947 out mediump float te_out; 948 void main() 949 { 950 te_out = tc_out[2]; 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 internal_array_size_mismatch 968 version 310 es 969 desc "Tessellation control output array size is not consistent with layout qualifier" 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 out mediump float tc_out[2]; // does not match output layout qualifier 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[2]; 1002 out mediump float te_out; 1003 void main() 1004 { 1005 te_out = tc_out[1]; 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 invalid_patch_in_usage 1023 version 310 es 1024 desc "Invalid use of the patch_in qualifier in a non-tessellation shader" 1025 expect compile_or_link_fail 1026 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 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 frag_in; 1036 out mediump float var; 1037 void main() 1038 { 1039 frag_in = in0; 1040 var = 2.0; 1041 ${VERTEX_OUTPUT} 1042 } 1043 "" 1044 fragment "" 1045 #version 310 es 1046 precision mediump float; 1047 ${FRAGMENT_DECLARATIONS} 1048 patch in mediump float var; // invalid use of patch_in 1049 in mediump float frag_in; 1050 void main() 1051 { 1052 out0 = frag_in * var; 1053 ${FRAGMENT_OUTPUT} 1054 } 1055 "" 1056 end 1057 1058 case invalid_patch_out_usage 1059 version 310 es 1060 desc "Invalid use of the patch_out qualifier in a non-tessellation shader" 1061 expect compile_or_link_fail 1062 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1063 values 1064 { 1065 input float in0 = 1.0; 1066 output float out0 = 1.0; 1067 } 1068 vertex "" 1069 #version 310 es 1070 ${VERTEX_DECLARATIONS} 1071 out mediump float frag_in; 1072 patch out mediump float var; 1073 void main() 1074 { 1075 frag_in = in0; 1076 var = 2.0; 1077 ${VERTEX_OUTPUT} 1078 } 1079 "" 1080 fragment "" 1081 #version 310 es 1082 precision mediump float; 1083 ${FRAGMENT_DECLARATIONS} 1084 in mediump float var; // invalid use of patch_out 1085 in mediump float frag_in; 1086 void main() 1087 { 1088 out0 = frag_in * var; 1089 ${FRAGMENT_OUTPUT} 1090 } 1091 "" 1092 end 1093 1094 case invalid_per_patch_qualifier_usage 1095 version 310 es 1096 desc "Invalid use of per-patch qualifier on input variable in tessellation control shader" 1097 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1098 expect compile_or_link_fail 1099 values 1100 { 1101 input float in0 = 1.0; 1102 output float out0 = 1.0; 1103 } 1104 vertex "" 1105 #version 310 es 1106 ${VERTEX_DECLARATIONS} 1107 out mediump float tc_in; 1108 void main() 1109 { 1110 tc_in = in0; 1111 ${VERTEX_OUTPUT} 1112 } 1113 "" 1114 tessellation_control "" 1115 #version 310 es 1116 ${TESSELLATION_CONTROL_DECLARATIONS} 1117 patch in mediump float tc_in; // patch in not allowed in TCS 1118 patch out mediump float tc_out; 1119 void main() 1120 { 1121 tc_out = tc_in; 1122 ${TESSELLATION_CONTROL_OUTPUT} 1123 } 1124 "" 1125 tessellation_evaluation "" 1126 #version 310 es 1127 ${TESSELLATION_EVALUATION_DECLARATIONS} 1128 patch in mediump float tc_out; 1129 out mediump float te_out; 1130 void main() 1131 { 1132 te_out = tc_out; 1133 ${TESSELLATION_EVALUATION_OUTPUT} 1134 } 1135 "" 1136 fragment "" 1137 #version 310 es 1138 precision mediump float; 1139 ${FRAGMENT_DECLARATIONS} 1140 in mediump float te_out; 1141 void main() 1142 { 1143 out0 = te_out; 1144 ${FRAGMENT_OUTPUT} 1145 } 1146 "" 1147 end 1148 1149 case per_patch_qualifier_mismatch_1 1150 version 310 es 1151 desc "Tessellation control output is per-patch qualified, evaluation input is not" 1152 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1153 expect compile_or_link_fail 1154 values 1155 { 1156 input float in0 = 1.0; 1157 output float out0 = 1.0; 1158 } 1159 vertex "" 1160 #version 310 es 1161 ${VERTEX_DECLARATIONS} 1162 out mediump float tc_in; 1163 void main() 1164 { 1165 tc_in = in0; 1166 ${VERTEX_OUTPUT} 1167 } 1168 "" 1169 tessellation_control "" 1170 #version 310 es 1171 ${TESSELLATION_CONTROL_DECLARATIONS} 1172 in mediump float tc_in[]; 1173 patch out mediump float tc_out[gl_MaxPatchVertices]; 1174 void main() 1175 { 1176 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 1177 ${TESSELLATION_CONTROL_OUTPUT} 1178 } 1179 "" 1180 tessellation_evaluation "" 1181 #version 310 es 1182 ${TESSELLATION_EVALUATION_DECLARATIONS} 1183 in mediump float tc_out[gl_MaxPatchVertices]; 1184 out mediump float te_out; 1185 void main() 1186 { 1187 te_out = tc_out[2]; 1188 ${TESSELLATION_EVALUATION_OUTPUT} 1189 } 1190 "" 1191 fragment "" 1192 #version 310 es 1193 precision mediump float; 1194 ${FRAGMENT_DECLARATIONS} 1195 in mediump float te_out; 1196 void main() 1197 { 1198 out0 = te_out; 1199 ${FRAGMENT_OUTPUT} 1200 } 1201 "" 1202 end 1203 1204 case per_patch_qualifier_mismatch_2 1205 version 310 es 1206 desc "Tessellation control output is not per-patch qualified, evaluation input is" 1207 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1208 expect compile_or_link_fail 1209 values 1210 { 1211 input float in0 = 1.0; 1212 output float out0 = 1.0; 1213 } 1214 vertex "" 1215 #version 310 es 1216 ${VERTEX_DECLARATIONS} 1217 out mediump float tc_in; 1218 void main() 1219 { 1220 tc_in = in0; 1221 ${VERTEX_OUTPUT} 1222 } 1223 "" 1224 tessellation_control "" 1225 #version 310 es 1226 ${TESSELLATION_CONTROL_DECLARATIONS} 1227 in mediump float tc_in[]; 1228 out mediump float tc_out[gl_MaxPatchVertices]; 1229 void main() 1230 { 1231 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 1232 ${TESSELLATION_CONTROL_OUTPUT} 1233 } 1234 "" 1235 tessellation_evaluation "" 1236 #version 310 es 1237 ${TESSELLATION_EVALUATION_DECLARATIONS} 1238 patch in mediump float tc_out[gl_MaxPatchVertices]; 1239 out mediump float te_out; 1240 void main() 1241 { 1242 te_out = tc_out[2]; 1243 ${TESSELLATION_EVALUATION_OUTPUT} 1244 } 1245 "" 1246 fragment "" 1247 #version 310 es 1248 precision mediump float; 1249 ${FRAGMENT_DECLARATIONS} 1250 in mediump float te_out; 1251 void main() 1252 { 1253 out0 = te_out; 1254 ${FRAGMENT_OUTPUT} 1255 } 1256 "" 1257 end 1258 1259 case input_block 1260 version 310 es 1261 desc "Tessellation control shader input block" 1262 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1263 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } 1264 values { output float out0 = 1.0; } 1265 vertex "" 1266 #version 310 es 1267 ${VERTEX_DECLARATIONS} 1268 out IOBlockName 1269 { 1270 mediump float var; 1271 } outputInstanceName; 1272 void main() 1273 { 1274 outputInstanceName.var = 1.0; 1275 ${VERTEX_OUTPUT} 1276 } 1277 "" 1278 tessellation_control "" 1279 #version 310 es 1280 ${TESSELLATION_CONTROL_DECLARATIONS} 1281 in IOBlockName 1282 { 1283 mediump float var; 1284 } inputInstanceName[]; 1285 out mediump float tc_out[]; 1286 void main() 1287 { 1288 tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID].var; 1289 ${TESSELLATION_CONTROL_OUTPUT} 1290 } 1291 "" 1292 tessellation_evaluation "" 1293 #version 310 es 1294 ${TESSELLATION_EVALUATION_DECLARATIONS} 1295 in mediump float tc_out[]; 1296 out mediump float te_out; 1297 void main() 1298 { 1299 te_out = tc_out[2]; 1300 ${TESSELLATION_EVALUATION_OUTPUT} 1301 } 1302 "" 1303 fragment "" 1304 #version 310 es 1305 precision mediump float; 1306 ${FRAGMENT_DECLARATIONS} 1307 in mediump float te_out; 1308 void main() 1309 { 1310 out0 = te_out; 1311 ${FRAGMENT_OUTPUT} 1312 } 1313 "" 1314 end 1315 1316 case input_block_non_array 1317 version 310 es 1318 desc "Tessellation control shader input block without explicit array" 1319 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1320 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } 1321 expect compile_or_link_fail 1322 values { output float out0 = 1.0; } 1323 vertex "" 1324 #version 310 es 1325 ${VERTEX_DECLARATIONS} 1326 out IOBlockName 1327 { 1328 mediump float var; 1329 } outputInstanceName; 1330 void main() 1331 { 1332 outputInstanceName.var = 1.0; 1333 ${VERTEX_OUTPUT} 1334 } 1335 "" 1336 tessellation_control "" 1337 #version 310 es 1338 ${TESSELLATION_CONTROL_DECLARATIONS} 1339 in IOBlockName 1340 { 1341 mediump float var; 1342 } inputInstanceName; 1343 out mediump float tc_out[]; 1344 void main() 1345 { 1346 tc_out[gl_InvocationID] = inputInstanceName.var; 1347 ${TESSELLATION_CONTROL_OUTPUT} 1348 } 1349 "" 1350 tessellation_evaluation "" 1351 #version 310 es 1352 ${TESSELLATION_EVALUATION_DECLARATIONS} 1353 in mediump float tc_out[]; 1354 out mediump float te_out; 1355 void main() 1356 { 1357 te_out = tc_out[2]; 1358 ${TESSELLATION_EVALUATION_OUTPUT} 1359 } 1360 "" 1361 fragment "" 1362 #version 310 es 1363 precision mediump float; 1364 ${FRAGMENT_DECLARATIONS} 1365 in mediump float geo_out; 1366 void main() 1367 { 1368 out0 = geo_out; 1369 ${FRAGMENT_OUTPUT} 1370 } 1371 "" 1372 end 1373 1374 case output_block_non_array 1375 version 310 es 1376 desc "Tessellation control shader output block without explicit array" 1377 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1378 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } 1379 expect compile_or_link_fail 1380 values { output float out0 = 1.0; } 1381 vertex "" 1382 #version 310 es 1383 ${VERTEX_DECLARATIONS} 1384 out mediump float tc_in; 1385 void main() 1386 { 1387 tc_in = 1.0; 1388 ${VERTEX_OUTPUT} 1389 } 1390 "" 1391 tessellation_control "" 1392 #version 310 es 1393 ${TESSELLATION_CONTROL_DECLARATIONS} 1394 in mediump float tc_in[]; 1395 out IOBlockName 1396 { 1397 mediump float var; 1398 } outputInstanceName; // not an array 1399 void main() 1400 { 1401 outputInstanceName.var = tc_in[gl_InvocationID]; 1402 ${TESSELLATION_CONTROL_OUTPUT} 1403 } 1404 "" 1405 tessellation_evaluation "" 1406 #version 310 es 1407 ${TESSELLATION_EVALUATION_DECLARATIONS} 1408 in IOBlockName 1409 { 1410 mediump float var; 1411 } outputInstanceName[]; 1412 out mediump float te_out; 1413 void main() 1414 { 1415 te_out = outputInstanceName[2].var; 1416 ${TESSELLATION_EVALUATION_OUTPUT} 1417 } 1418 "" 1419 fragment "" 1420 #version 310 es 1421 precision mediump float; 1422 ${FRAGMENT_DECLARATIONS} 1423 in mediump float te_out; 1424 void main() 1425 { 1426 out0 = te_out; 1427 ${FRAGMENT_OUTPUT} 1428 } 1429 "" 1430 end 1431 1432 case input_block_array_size_mismatch 1433 version 310 es 1434 desc "Tessellation control shader input block array, size not gl_MaxPatchVertices" 1435 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1436 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } 1437 expect compile_or_link_fail 1438 values { output float out0 = 1.0; } 1439 vertex "" 1440 #version 310 es 1441 ${VERTEX_DECLARATIONS} 1442 out IOBlockName 1443 { 1444 mediump float var; 1445 } outputInstanceName; 1446 void main() 1447 { 1448 outputInstanceName.var = 1.0; 1449 ${VERTEX_OUTPUT} 1450 } 1451 "" 1452 tessellation_control "" 1453 #version 310 es 1454 ${TESSELLATION_CONTROL_DECLARATIONS} 1455 in IOBlockName 1456 { 1457 mediump float var; 1458 } inputInstanceName[4]; // not gl_MaxPatchVertices 1459 out mediump float tc_out[]; 1460 void main() 1461 { 1462 tc_out[gl_InvocationID] = inputInstanceName[gl_InvocationID + 1].var; 1463 ${TESSELLATION_CONTROL_OUTPUT} 1464 } 1465 "" 1466 tessellation_evaluation "" 1467 #version 310 es 1468 ${TESSELLATION_EVALUATION_DECLARATIONS} 1469 in mediump float tc_out[]; 1470 out mediump float te_out; 1471 void main() 1472 { 1473 te_out = tc_out[2]; 1474 ${TESSELLATION_EVALUATION_OUTPUT} 1475 } 1476 "" 1477 fragment "" 1478 #version 310 es 1479 precision mediump float; 1480 ${FRAGMENT_DECLARATIONS} 1481 in mediump float geo_out; 1482 void main() 1483 { 1484 out0 = geo_out; 1485 ${FRAGMENT_OUTPUT} 1486 } 1487 "" 1488 end 1489 1490 case output_block 1491 version 310 es 1492 desc "Tessellation shader output block" 1493 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1494 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } 1495 values { output float out0 = 1.0; } 1496 vertex "" 1497 #version 310 es 1498 ${VERTEX_DECLARATIONS} 1499 void main() 1500 { 1501 ${VERTEX_OUTPUT} 1502 } 1503 "" 1504 tessellation_control "" 1505 #version 310 es 1506 ${TESSELLATION_CONTROL_DECLARATIONS} 1507 void main() 1508 { 1509 ${TESSELLATION_CONTROL_OUTPUT} 1510 } 1511 "" 1512 tessellation_evaluation "" 1513 #version 310 es 1514 ${TESSELLATION_EVALUATION_DECLARATIONS} 1515 out IOBlockName 1516 { 1517 mediump float var; 1518 } outputInstanceName; 1519 void main() 1520 { 1521 outputInstanceName.var = 1.0; 1522 ${TESSELLATION_EVALUATION_OUTPUT} 1523 } 1524 "" 1525 fragment "" 1526 #version 310 es 1527 precision mediump float; 1528 ${FRAGMENT_DECLARATIONS} 1529 in IOBlockName 1530 { 1531 mediump float var; 1532 } inputInstanceName; 1533 void main() 1534 { 1535 out0 = inputInstanceName.var; 1536 ${FRAGMENT_OUTPUT} 1537 } 1538 "" 1539 end 1540 1541 case output_block_array 1542 version 310 es 1543 desc "Tessellation shader output block array" 1544 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1545 require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } 1546 values { output float out0 = 1.0; } 1547 vertex "" 1548 #version 310 es 1549 ${VERTEX_DECLARATIONS} 1550 void main() 1551 { 1552 ${VERTEX_OUTPUT} 1553 } 1554 "" 1555 tessellation_control "" 1556 #version 310 es 1557 ${TESSELLATION_CONTROL_DECLARATIONS} 1558 void main() 1559 { 1560 ${TESSELLATION_CONTROL_OUTPUT} 1561 } 1562 "" 1563 tessellation_evaluation "" 1564 #version 310 es 1565 ${TESSELLATION_EVALUATION_DECLARATIONS} 1566 out IOBlockName 1567 { 1568 mediump float var; 1569 } outputInstanceName[2]; 1570 void main() 1571 { 1572 outputInstanceName[0].var = 2.0; 1573 outputInstanceName[1].var = 1.0; 1574 ${TESSELLATION_EVALUATION_OUTPUT} 1575 } 1576 "" 1577 fragment "" 1578 #version 310 es 1579 precision mediump float; 1580 ${FRAGMENT_DECLARATIONS} 1581 in IOBlockName 1582 { 1583 mediump float var; 1584 } inputInstanceName[2]; 1585 void main() 1586 { 1587 out0 = inputInstanceName[0].var - inputInstanceName[1].var; 1588 ${FRAGMENT_OUTPUT} 1589 } 1590 "" 1591 end 1592 1593 case unspecified_vertex_count 1594 version 310 es 1595 desc "Tessellation shader unspecified vertex count" 1596 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1597 expect compile_or_link_fail 1598 vertex "" 1599 #version 310 es 1600 ${VERTEX_DECLARATIONS} 1601 void main() 1602 { 1603 ${VERTEX_OUTPUT} 1604 } 1605 "" 1606 tessellation_control "" 1607 #version 310 es 1608 void main() 1609 { 1610 ${TESSELLATION_CONTROL_OUTPUT} 1611 } 1612 "" 1613 tessellation_evaluation "" 1614 #version 310 es 1615 ${TESSELLATION_EVALUATION_DECLARATIONS} 1616 void main() 1617 { 1618 ${TESSELLATION_EVALUATION_OUTPUT} 1619 } 1620 "" 1621 fragment "" 1622 #version 310 es 1623 precision mediump float; 1624 ${FRAGMENT_DECLARATIONS} 1625 void main() 1626 { 1627 ${FRAGMENT_OUTPUT} 1628 } 1629 "" 1630 end 1631 1632 case unspecified_primitive_mode 1633 version 310 es 1634 desc "Tessellation shader unspecified vertex count" 1635 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1636 expect compile_or_link_fail 1637 vertex "" 1638 #version 310 es 1639 ${VERTEX_DECLARATIONS} 1640 void main() 1641 { 1642 ${VERTEX_OUTPUT} 1643 } 1644 "" 1645 tessellation_control "" 1646 #version 310 es 1647 ${TESSELLATION_CONTROL_DECLARATIONS} 1648 void main() 1649 { 1650 ${TESSELLATION_CONTROL_OUTPUT} 1651 } 1652 "" 1653 tessellation_evaluation "" 1654 #version 310 es 1655 void main() 1656 { 1657 ${TESSELLATION_EVALUATION_OUTPUT} 1658 } 1659 "" 1660 fragment "" 1661 #version 310 es 1662 precision mediump float; 1663 ${FRAGMENT_DECLARATIONS} 1664 void main() 1665 { 1666 ${FRAGMENT_OUTPUT} 1667 } 1668 "" 1669 end 1670 end 1671 1672 group qualifiers "Varying qualifiers" 1673 case smooth 1674 version 310 es 1675 desc "Smooth varying" 1676 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1677 values 1678 { 1679 input float in0 = 1.0; 1680 output float out0 = 1.0; 1681 } 1682 vertex "" 1683 #version 310 es 1684 ${VERTEX_DECLARATIONS} 1685 smooth out mediump float tc_in; 1686 void main() 1687 { 1688 tc_in = in0; 1689 ${VERTEX_OUTPUT} 1690 } 1691 "" 1692 tessellation_control "" 1693 #version 310 es 1694 ${TESSELLATION_CONTROL_DECLARATIONS} 1695 smooth in mediump float tc_in[]; 1696 smooth out mediump float tc_out[]; 1697 void main() 1698 { 1699 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 1700 ${TESSELLATION_CONTROL_OUTPUT} 1701 } 1702 "" 1703 tessellation_evaluation "" 1704 #version 310 es 1705 ${TESSELLATION_EVALUATION_DECLARATIONS} 1706 smooth in mediump float tc_out[]; 1707 smooth out mediump float te_out; 1708 void main() 1709 { 1710 te_out = tc_out[2]; 1711 ${TESSELLATION_EVALUATION_OUTPUT} 1712 } 1713 "" 1714 fragment "" 1715 #version 310 es 1716 precision mediump float; 1717 ${FRAGMENT_DECLARATIONS} 1718 smooth in mediump float te_out; 1719 void main() 1720 { 1721 out0 = te_out; 1722 ${FRAGMENT_OUTPUT} 1723 } 1724 "" 1725 end 1726 1727 case flat 1728 version 310 es 1729 desc "Flat varying" 1730 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1731 values 1732 { 1733 input float in0 = 1.0; 1734 output float out0 = 1.0; 1735 } 1736 vertex "" 1737 #version 310 es 1738 ${VERTEX_DECLARATIONS} 1739 flat out mediump float tc_in; 1740 void main() 1741 { 1742 tc_in = in0; 1743 ${VERTEX_OUTPUT} 1744 } 1745 "" 1746 tessellation_control "" 1747 #version 310 es 1748 ${TESSELLATION_CONTROL_DECLARATIONS} 1749 flat in mediump float tc_in[]; 1750 flat out mediump float tc_out[]; 1751 void main() 1752 { 1753 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 1754 ${TESSELLATION_CONTROL_OUTPUT} 1755 } 1756 "" 1757 tessellation_evaluation "" 1758 #version 310 es 1759 ${TESSELLATION_EVALUATION_DECLARATIONS} 1760 flat in mediump float tc_out[]; 1761 flat out mediump float te_out; 1762 void main() 1763 { 1764 te_out = tc_out[2]; 1765 ${TESSELLATION_EVALUATION_OUTPUT} 1766 } 1767 "" 1768 fragment "" 1769 #version 310 es 1770 precision mediump float; 1771 ${FRAGMENT_DECLARATIONS} 1772 flat in mediump float te_out; 1773 void main() 1774 { 1775 out0 = te_out; 1776 ${FRAGMENT_OUTPUT} 1777 } 1778 "" 1779 end 1780 1781 case centroid 1782 version 310 es 1783 desc "Centroid varying" 1784 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1785 values 1786 { 1787 input float in0 = 1.0; 1788 output float out0 = 1.0; 1789 } 1790 vertex "" 1791 #version 310 es 1792 ${VERTEX_DECLARATIONS} 1793 centroid out mediump float tc_in; 1794 void main() 1795 { 1796 tc_in = in0; 1797 ${VERTEX_OUTPUT} 1798 } 1799 "" 1800 tessellation_control "" 1801 #version 310 es 1802 ${TESSELLATION_CONTROL_DECLARATIONS} 1803 centroid in mediump float tc_in[]; 1804 centroid out mediump float tc_out[]; 1805 void main() 1806 { 1807 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 1808 ${TESSELLATION_CONTROL_OUTPUT} 1809 } 1810 "" 1811 tessellation_evaluation "" 1812 #version 310 es 1813 ${TESSELLATION_EVALUATION_DECLARATIONS} 1814 centroid in mediump float tc_out[]; 1815 centroid out mediump float te_out; 1816 void main() 1817 { 1818 te_out = tc_out[2]; 1819 ${TESSELLATION_EVALUATION_OUTPUT} 1820 } 1821 "" 1822 fragment "" 1823 #version 310 es 1824 precision mediump float; 1825 ${FRAGMENT_DECLARATIONS} 1826 centroid in mediump float te_out; 1827 void main() 1828 { 1829 out0 = te_out; 1830 ${FRAGMENT_OUTPUT} 1831 } 1832 "" 1833 end 1834 1835 case sample 1836 version 310 es 1837 desc "Sample varying" 1838 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1839 require extension { "GL_OES_shader_multisample_interpolation" } 1840 values 1841 { 1842 input float in0 = 1.0; 1843 output float out0 = 1.0; 1844 } 1845 vertex "" 1846 #version 310 es 1847 ${VERTEX_DECLARATIONS} 1848 sample out mediump float tc_in; 1849 void main() 1850 { 1851 tc_in = in0; 1852 ${VERTEX_OUTPUT} 1853 } 1854 "" 1855 tessellation_control "" 1856 #version 310 es 1857 ${TESSELLATION_CONTROL_DECLARATIONS} 1858 sample in mediump float tc_in[]; 1859 sample out mediump float tc_out[]; 1860 void main() 1861 { 1862 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 1863 ${TESSELLATION_CONTROL_OUTPUT} 1864 } 1865 "" 1866 tessellation_evaluation "" 1867 #version 310 es 1868 ${TESSELLATION_EVALUATION_DECLARATIONS} 1869 sample in mediump float tc_out[]; 1870 sample out mediump float te_out; 1871 void main() 1872 { 1873 te_out = tc_out[2]; 1874 ${TESSELLATION_EVALUATION_OUTPUT} 1875 } 1876 "" 1877 fragment "" 1878 #version 310 es 1879 precision mediump float; 1880 ${FRAGMENT_DECLARATIONS} 1881 sample in mediump float te_out; 1882 void main() 1883 { 1884 out0 = te_out; 1885 ${FRAGMENT_OUTPUT} 1886 } 1887 "" 1888 end 1889 1890 case patch 1891 version 310 es 1892 desc "Pre-patch varying" 1893 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1894 values 1895 { 1896 input float in0 = 1.0; 1897 output float out0 = 1.0; 1898 } 1899 vertex "" 1900 #version 310 es 1901 ${VERTEX_DECLARATIONS} 1902 out mediump float tc_in; 1903 void main() 1904 { 1905 tc_in = in0; 1906 ${VERTEX_OUTPUT} 1907 } 1908 "" 1909 tessellation_control "" 1910 #version 310 es 1911 ${TESSELLATION_CONTROL_DECLARATIONS} 1912 in mediump float tc_in[]; 1913 patch out mediump float tc_out; 1914 void main() 1915 { 1916 tc_out = tc_in[gl_InvocationID]; 1917 ${TESSELLATION_CONTROL_OUTPUT} 1918 } 1919 "" 1920 tessellation_evaluation "" 1921 #version 310 es 1922 ${TESSELLATION_EVALUATION_DECLARATIONS} 1923 patch in mediump float tc_out; 1924 out mediump float te_out; 1925 void main() 1926 { 1927 te_out = tc_out; 1928 ${TESSELLATION_EVALUATION_OUTPUT} 1929 } 1930 "" 1931 fragment "" 1932 #version 310 es 1933 precision mediump float; 1934 ${FRAGMENT_DECLARATIONS} 1935 in mediump float te_out; 1936 void main() 1937 { 1938 out0 = te_out; 1939 ${FRAGMENT_OUTPUT} 1940 } 1941 "" 1942 end 1943 end 1944 1945 import "linkage_tessellation_varying_types.test" 1946end 1947 1948group uniform "Uniform" 1949 group rules "Rules" 1950 case type_mismatch_1 1951 version 310 es 1952 desc "uniform type mismatch between vertex and tessellation control shaders" 1953 expect link_fail 1954 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 1955 vertex "" 1956 #version 310 es 1957 ${VERTEX_DECLARATIONS} 1958 uniform mediump float val; 1959 out mediump float vtx_out; 1960 void main() 1961 { 1962 vtx_out = val; 1963 ${VERTEX_OUTPUT} 1964 } 1965 "" 1966 tessellation_control "" 1967 #version 310 es 1968 ${TESSELLATION_CONTROL_DECLARATIONS} 1969 uniform mediump vec2 val; 1970 in mediump float vtx_out[]; 1971 out mediump float tc_out[]; 1972 void main() 1973 { 1974 tc_out[gl_InvocationID] = vtx_out[0] + val.x + val.y; 1975 ${TESSELLATION_CONTROL_OUTPUT} 1976 } 1977 "" 1978 tessellation_evaluation "" 1979 #version 310 es 1980 ${TESSELLATION_EVALUATION_DECLARATIONS} 1981 in mediump float tc_out[]; 1982 out mediump float te_out; 1983 void main() 1984 { 1985 te_out = tc_out[2]; 1986 ${TESSELLATION_EVALUATION_OUTPUT} 1987 } 1988 "" 1989 fragment "" 1990 #version 310 es 1991 precision mediump float; 1992 ${FRAGMENT_DECLARATIONS} 1993 in mediump float te_out; 1994 void main() 1995 { 1996 ${FRAG_COLOR} = vec4(te_out); 1997 } 1998 "" 1999 end 2000 2001 case type_mismatch_2 2002 version 310 es 2003 desc "uniform type mismatch between fragment and tessellation eval shaders" 2004 expect link_fail 2005 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2006 vertex "" 2007 #version 310 es 2008 ${VERTEX_DECLARATIONS} 2009 out mediump float vtx_out; 2010 void main() 2011 { 2012 ${VERTEX_OUTPUT} 2013 } 2014 "" 2015 tessellation_control "" 2016 #version 310 es 2017 ${TESSELLATION_CONTROL_DECLARATIONS} 2018 void main() 2019 { 2020 ${TESSELLATION_CONTROL_OUTPUT} 2021 } 2022 "" 2023 tessellation_evaluation "" 2024 #version 310 es 2025 ${TESSELLATION_EVALUATION_DECLARATIONS} 2026 uniform mediump vec3 val; 2027 out mediump float te_out; 2028 void main() 2029 { 2030 te_out = val.x + val.y + val.z; 2031 ${TESSELLATION_EVALUATION_OUTPUT} 2032 } 2033 "" 2034 fragment "" 2035 #version 310 es 2036 precision mediump float; 2037 ${FRAGMENT_DECLARATIONS} 2038 uniform mediump vec4 val; 2039 in mediump float te_out; 2040 void main() 2041 { 2042 ${FRAG_COLOR} = vec4(te_out) + val; 2043 } 2044 "" 2045 end 2046 2047 case type_mismatch_3 2048 version 310 es 2049 desc "uniform type mismatch between tessellation control and eval shaders" 2050 expect link_fail 2051 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2052 vertex "" 2053 #version 310 es 2054 ${VERTEX_DECLARATIONS} 2055 out mediump float vtx_out; 2056 void main() 2057 { 2058 ${VERTEX_OUTPUT} 2059 } 2060 "" 2061 tessellation_control "" 2062 #version 310 es 2063 ${TESSELLATION_CONTROL_DECLARATIONS} 2064 uniform mediump vec4 val; 2065 out mediump vec4 tc_out[]; 2066 void main() 2067 { 2068 tc_out[gl_InvocationID] = val; 2069 ${TESSELLATION_CONTROL_OUTPUT} 2070 } 2071 "" 2072 tessellation_evaluation "" 2073 #version 310 es 2074 ${TESSELLATION_EVALUATION_DECLARATIONS} 2075 uniform mediump vec3 val; 2076 in mediump vec4 tc_out[]; 2077 out mediump float te_out; 2078 void main() 2079 { 2080 te_out = tc_out[0].w * val.z; 2081 ${TESSELLATION_EVALUATION_OUTPUT} 2082 } 2083 "" 2084 fragment "" 2085 #version 310 es 2086 precision mediump float; 2087 ${FRAGMENT_DECLARATIONS} 2088 in mediump float te_out; 2089 void main() 2090 { 2091 ${FRAG_COLOR} = vec4(te_out); 2092 } 2093 "" 2094 end 2095 2096 case type_mismatch_4 2097 version 310 es 2098 desc "uniform type mismatch between vertex and tessellation control shaders" 2099 expect link_fail 2100 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2101 require limit "GL_MAX_VERTEX_ATOMIC_COUNTERS" > 0 2102 vertex "" 2103 #version 310 es 2104 ${VERTEX_DECLARATIONS} 2105 layout(binding=0) uniform atomic_uint u_var; 2106 out mediump float vtx_out; 2107 void main() 2108 { 2109 uint result = atomicCounterIncrement(u_var); 2110 vtx_out = float(result); 2111 ${VERTEX_OUTPUT} 2112 } 2113 "" 2114 tessellation_control "" 2115 #version 310 es 2116 ${TESSELLATION_CONTROL_DECLARATIONS} 2117 uniform mediump float u_var; 2118 in mediump float vtx_out[]; 2119 out mediump float tc_out[]; 2120 void main() 2121 { 2122 tc_out[gl_InvocationID] = vtx_out[0] + u_var; 2123 ${TESSELLATION_CONTROL_OUTPUT} 2124 } 2125 "" 2126 tessellation_evaluation "" 2127 #version 310 es 2128 ${TESSELLATION_EVALUATION_DECLARATIONS} 2129 in mediump float tc_out[]; 2130 out mediump float te_out; 2131 void main() 2132 { 2133 te_out = tc_out[2]; 2134 ${TESSELLATION_EVALUATION_OUTPUT} 2135 } 2136 "" 2137 fragment "" 2138 #version 310 es 2139 precision mediump float; 2140 ${FRAGMENT_DECLARATIONS} 2141 in mediump float te_out; 2142 void main() 2143 { 2144 ${FRAG_COLOR} = vec4(te_out); 2145 } 2146 "" 2147 end 2148 2149 case type_mismatch_5 2150 version 310 es 2151 desc "uniform type mismatch between vertex and tessellation control shaders" 2152 expect link_fail 2153 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2154 require limit "GL_MAX_VERTEX_IMAGE_UNIFORMS" > 0 2155 vertex "" 2156 #version 310 es 2157 ${VERTEX_DECLARATIONS} 2158 layout(binding=0) layout(rgba8i) uniform readonly highp iimage2D u_var; 2159 out mediump float vtx_out; 2160 void main() 2161 { 2162 int result = imageSize(u_var).x; 2163 vtx_out = float(result); 2164 ${VERTEX_OUTPUT} 2165 } 2166 "" 2167 tessellation_control "" 2168 #version 310 es 2169 ${TESSELLATION_CONTROL_DECLARATIONS} 2170 uniform mediump float u_var; 2171 in mediump float vtx_out[]; 2172 out mediump float tc_out[]; 2173 void main() 2174 { 2175 tc_out[gl_InvocationID] = vtx_out[0] + u_var; 2176 ${TESSELLATION_CONTROL_OUTPUT} 2177 } 2178 "" 2179 tessellation_evaluation "" 2180 #version 310 es 2181 ${TESSELLATION_EVALUATION_DECLARATIONS} 2182 in mediump float tc_out[]; 2183 out mediump float te_out; 2184 void main() 2185 { 2186 te_out = tc_out[2]; 2187 ${TESSELLATION_EVALUATION_OUTPUT} 2188 } 2189 "" 2190 fragment "" 2191 #version 310 es 2192 precision mediump float; 2193 ${FRAGMENT_DECLARATIONS} 2194 in mediump float te_out; 2195 void main() 2196 { 2197 ${FRAG_COLOR} = vec4(te_out); 2198 } 2199 "" 2200 end 2201 2202 case precision_mismatch_1 2203 version 310 es 2204 desc "uniform precision mismatch between tessellation control and eval shaders" 2205 expect link_fail 2206 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2207 vertex "" 2208 #version 310 es 2209 ${VERTEX_DECLARATIONS} 2210 out mediump float vtx_out; 2211 void main() 2212 { 2213 ${VERTEX_OUTPUT} 2214 } 2215 "" 2216 tessellation_control "" 2217 #version 310 es 2218 ${TESSELLATION_CONTROL_DECLARATIONS} 2219 uniform mediump vec4 val; 2220 out mediump vec4 tc_out[]; 2221 void main() 2222 { 2223 tc_out[gl_InvocationID] = val; 2224 ${TESSELLATION_CONTROL_OUTPUT} 2225 } 2226 "" 2227 tessellation_evaluation "" 2228 #version 310 es 2229 ${TESSELLATION_EVALUATION_DECLARATIONS} 2230 uniform highp vec4 val; 2231 in mediump vec4 tc_out[]; 2232 out mediump float te_out; 2233 void main() 2234 { 2235 te_out = tc_out[0].w * val.z; 2236 ${TESSELLATION_EVALUATION_OUTPUT} 2237 } 2238 "" 2239 fragment "" 2240 #version 310 es 2241 precision mediump float; 2242 ${FRAGMENT_DECLARATIONS} 2243 in mediump float te_out; 2244 void main() 2245 { 2246 ${FRAG_COLOR} = vec4(te_out); 2247 } 2248 "" 2249 end 2250 2251 case precision_mismatch_2 2252 version 310 es 2253 desc "uniform precision mismatch between vertex and tessellation control shaders" 2254 expect link_fail 2255 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2256 vertex "" 2257 #version 310 es 2258 ${VERTEX_DECLARATIONS} 2259 uniform highp float val; 2260 out mediump float vtx_out; 2261 void main() 2262 { 2263 vtx_out = val; 2264 ${VERTEX_OUTPUT} 2265 } 2266 "" 2267 tessellation_control "" 2268 #version 310 es 2269 ${TESSELLATION_CONTROL_DECLARATIONS} 2270 uniform mediump float val; 2271 in mediump float vtx_out[]; 2272 out mediump float tc_out[]; 2273 void main() 2274 { 2275 tc_out[gl_InvocationID] = vtx_out[0] + val; 2276 ${TESSELLATION_CONTROL_OUTPUT} 2277 } 2278 "" 2279 tessellation_evaluation "" 2280 #version 310 es 2281 ${TESSELLATION_EVALUATION_DECLARATIONS} 2282 in mediump float tc_out[]; 2283 out mediump float te_out; 2284 void main() 2285 { 2286 te_out = tc_out[2]; 2287 ${TESSELLATION_EVALUATION_OUTPUT} 2288 } 2289 "" 2290 fragment "" 2291 #version 310 es 2292 precision mediump float; 2293 ${FRAGMENT_DECLARATIONS} 2294 in mediump float te_out; 2295 void main() 2296 { 2297 ${FRAG_COLOR} = vec4(te_out); 2298 } 2299 "" 2300 end 2301 2302 case struct_partial_usage 2303 version 310 es 2304 desc "uniform is partially used in different shader stages" 2305 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2306 values 2307 { 2308 uniform float val.vtxVal = 1.5; 2309 uniform float val.tcVal = 2.5; 2310 uniform float val.teVal = 6.0; 2311 uniform float val.fragVal = 11.0; 2312 output float out0 = 68.5; 2313 } 2314 vertex "" 2315 #version 310 es 2316 ${VERTEX_DECLARATIONS} 2317 struct S 2318 { 2319 mediump float vtxVal; 2320 mediump float tcVal; 2321 mediump float teVal; 2322 mediump float fragVal; 2323 }; 2324 uniform S val; 2325 out mediump float vtx_out; 2326 void main() 2327 { 2328 vtx_out = val.vtxVal; 2329 ${VERTEX_OUTPUT} 2330 } 2331 "" 2332 tessellation_control "" 2333 #version 310 es 2334 ${TESSELLATION_CONTROL_DECLARATIONS} 2335 struct S 2336 { 2337 mediump float vtxVal; 2338 mediump float tcVal; 2339 mediump float teVal; 2340 mediump float fragVal; 2341 }; 2342 uniform S val; 2343 in mediump float vtx_out[]; 2344 out mediump float tc_out[]; 2345 void main() 2346 { 2347 tc_out[gl_InvocationID] = vtx_out[0] + 2.0 * val.tcVal; 2348 ${TESSELLATION_CONTROL_OUTPUT} 2349 } 2350 "" 2351 tessellation_evaluation "" 2352 #version 310 es 2353 ${TESSELLATION_EVALUATION_DECLARATIONS} 2354 struct S 2355 { 2356 mediump float vtxVal; 2357 mediump float tcVal; 2358 mediump float teVal; 2359 mediump float fragVal; 2360 }; 2361 uniform S val; 2362 in mediump float tc_out[]; 2363 out mediump float te_out; 2364 void main() 2365 { 2366 te_out = tc_out[2] + 3.0 * val.teVal; 2367 ${TESSELLATION_EVALUATION_OUTPUT} 2368 } 2369 "" 2370 fragment "" 2371 #version 310 es 2372 precision mediump float; 2373 ${FRAGMENT_DECLARATIONS} 2374 struct S 2375 { 2376 mediump float vtxVal; 2377 mediump float tcVal; 2378 mediump float teVal; 2379 mediump float fragVal; 2380 }; 2381 uniform S val; 2382 in mediump float te_out; 2383 void main() 2384 { 2385 out0 = te_out + 4.0 * val.fragVal; 2386 ${FRAGMENT_OUTPUT}; 2387 } 2388 "" 2389 end 2390 end 2391 2392 import "linkage_tessellation_uniform_types.test" 2393end 2394 2395group layout_declarations "Layout linkage" 2396 group rules "Rules" 2397 2398 case primitive_mode_mismatch 2399 version 310 es 2400 desc "Tessellation evaluation shader primitive mode mismatch" 2401 expect compile_or_link_fail 2402 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2403 values 2404 { 2405 input float in0 = 1.0; 2406 output float out0 = 1.0; 2407 } 2408 vertex "" 2409 #version 310 es 2410 ${VERTEX_DECLARATIONS} 2411 out mediump float tc_in; 2412 void main() 2413 { 2414 tc_in = in0; 2415 ${VERTEX_OUTPUT} 2416 } 2417 "" 2418 tessellation_control "" 2419 #version 310 es 2420 ${TESSELLATION_CONTROL_DECLARATIONS} 2421 in mediump float tc_in[]; 2422 out mediump float tc_out[]; 2423 void main() 2424 { 2425 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 2426 ${TESSELLATION_CONTROL_OUTPUT} 2427 } 2428 "" 2429 tessellation_evaluation "" 2430 #version 310 es 2431 layout (triangles) in; 2432 layout (isolines) in; 2433 in mediump float tc_out[]; 2434 out mediump float te_out; 2435 void main() 2436 { 2437 te_out = tc_out[2]; 2438 ${TESSELLATION_EVALUATION_OUTPUT} 2439 } 2440 "" 2441 fragment "" 2442 #version 310 es 2443 precision mediump float; 2444 ${FRAGMENT_DECLARATIONS} 2445 in mediump float te_out; 2446 void main() 2447 { 2448 out0 = te_out; 2449 ${FRAGMENT_OUTPUT} 2450 } 2451 "" 2452 end 2453 2454 case spacing_mode_mismatch 2455 version 310 es 2456 desc "Tessellation evaluation shader spacing mode mismatch" 2457 expect compile_or_link_fail 2458 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2459 values 2460 { 2461 input float in0 = 1.0; 2462 output float out0 = 1.0; 2463 } 2464 vertex "" 2465 #version 310 es 2466 ${VERTEX_DECLARATIONS} 2467 out mediump float tc_in; 2468 void main() 2469 { 2470 tc_in = in0; 2471 ${VERTEX_OUTPUT} 2472 } 2473 "" 2474 tessellation_control "" 2475 #version 310 es 2476 ${TESSELLATION_CONTROL_DECLARATIONS} 2477 in mediump float tc_in[]; 2478 out mediump float tc_out[]; 2479 void main() 2480 { 2481 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 2482 ${TESSELLATION_CONTROL_OUTPUT} 2483 } 2484 "" 2485 tessellation_evaluation "" 2486 #version 310 es 2487 layout (triangles, equal_spacing) in; 2488 layout (triangles, fractional_odd_spacing) in; 2489 in mediump float tc_out[]; 2490 out mediump float te_out; 2491 void main() 2492 { 2493 te_out = tc_out[2]; 2494 ${TESSELLATION_EVALUATION_OUTPUT} 2495 } 2496 "" 2497 fragment "" 2498 #version 310 es 2499 precision mediump float; 2500 ${FRAGMENT_DECLARATIONS} 2501 in mediump float te_out; 2502 void main() 2503 { 2504 out0 = te_out; 2505 ${FRAGMENT_OUTPUT} 2506 } 2507 "" 2508 end 2509 2510 case vertex_order_mismatch 2511 version 310 es 2512 desc "Tessellation evaluation shader vertex order mismatch" 2513 expect compile_or_link_fail 2514 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2515 values 2516 { 2517 input float in0 = 1.0; 2518 output float out0 = 1.0; 2519 } 2520 vertex "" 2521 #version 310 es 2522 ${VERTEX_DECLARATIONS} 2523 out mediump float tc_in; 2524 void main() 2525 { 2526 tc_in = in0; 2527 ${VERTEX_OUTPUT} 2528 } 2529 "" 2530 tessellation_control "" 2531 #version 310 es 2532 ${TESSELLATION_CONTROL_DECLARATIONS} 2533 in mediump float tc_in[]; 2534 out mediump float tc_out[]; 2535 void main() 2536 { 2537 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 2538 ${TESSELLATION_CONTROL_OUTPUT} 2539 } 2540 "" 2541 tessellation_evaluation "" 2542 #version 310 es 2543 layout (triangles, cw) in; 2544 layout (triangles, ccw) in; 2545 in mediump float tc_out[]; 2546 out mediump float te_out; 2547 void main() 2548 { 2549 te_out = tc_out[2]; 2550 ${TESSELLATION_EVALUATION_OUTPUT} 2551 } 2552 "" 2553 fragment "" 2554 #version 310 es 2555 precision mediump float; 2556 ${FRAGMENT_DECLARATIONS} 2557 in mediump float te_out; 2558 void main() 2559 { 2560 out0 = te_out; 2561 ${FRAGMENT_OUTPUT} 2562 } 2563 "" 2564 end 2565 2566 case vertex_count_mismatch 2567 version 310 es 2568 desc "Tessellation control shader vertex count mismatch" 2569 expect compile_or_link_fail 2570 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2571 values 2572 { 2573 input float in0 = 1.0; 2574 output float out0 = 1.0; 2575 } 2576 vertex "" 2577 #version 310 es 2578 ${VERTEX_DECLARATIONS} 2579 out mediump float tc_in; 2580 void main() 2581 { 2582 tc_in = in0; 2583 ${VERTEX_OUTPUT} 2584 } 2585 "" 2586 tessellation_control "" 2587 #version 310 es 2588 layout (vertices=3) out; 2589 layout (vertices=4) out; 2590 in mediump float tc_in[]; 2591 out mediump float tc_out[]; 2592 void main() 2593 { 2594 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 2595 ${TESSELLATION_CONTROL_OUTPUT} 2596 } 2597 "" 2598 tessellation_evaluation "" 2599 #version 310 es 2600 ${TESSELLATION_EVALUATION_DECLARATIONS} 2601 in mediump float tc_out[]; 2602 out mediump float te_out; 2603 void main() 2604 { 2605 te_out = tc_out[2]; 2606 ${TESSELLATION_EVALUATION_OUTPUT} 2607 } 2608 "" 2609 fragment "" 2610 #version 310 es 2611 precision mediump float; 2612 ${FRAGMENT_DECLARATIONS} 2613 in mediump float te_out; 2614 void main() 2615 { 2616 out0 = te_out; 2617 ${FRAGMENT_OUTPUT} 2618 } 2619 "" 2620 end 2621 end 2622end 2623 2624group barriers "Barriers" 2625 group rules "Rules" 2626 2627 case invalid_barrier_usage_within_control_flow 2628 version 310 es 2629 desc "Tessellation control shader invalid barrier usage within control flow statement" 2630 expect compile_or_link_fail 2631 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2632 values 2633 { 2634 input float in0 = 1.0; 2635 output float out0 = 1.0; 2636 } 2637 vertex "" 2638 #version 310 es 2639 ${VERTEX_DECLARATIONS} 2640 out mediump float tc_in; 2641 void main() 2642 { 2643 tc_in = in0; 2644 ${VERTEX_OUTPUT} 2645 } 2646 "" 2647 tessellation_control "" 2648 #version 310 es 2649 ${TESSELLATION_CONTROL_DECLARATIONS} 2650 in mediump float tc_in[]; 2651 out mediump float tc_out[]; 2652 2653 void main() 2654 { 2655 if (gl_InvocationID == 0) 2656 barrier(); // error: within control flow 2657 2658 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 2659 ${TESSELLATION_CONTROL_OUTPUT} 2660 } 2661 "" 2662 tessellation_evaluation "" 2663 #version 310 es 2664 ${TESSELLATION_EVALUATION_DECLARATIONS} 2665 in mediump float tc_out[]; 2666 out mediump float te_out; 2667 void main() 2668 { 2669 te_out = tc_out[2]; 2670 ${TESSELLATION_EVALUATION_OUTPUT} 2671 } 2672 "" 2673 fragment "" 2674 #version 310 es 2675 precision mediump float; 2676 ${FRAGMENT_DECLARATIONS} 2677 in mediump float te_out; 2678 void main() 2679 { 2680 out0 = te_out; 2681 ${FRAGMENT_OUTPUT} 2682 } 2683 "" 2684 end 2685 2686 case invalid_barrier_usage_after_return 2687 version 310 es 2688 desc "Tessellation control shader invalid barrier usage after main() returns" 2689 expect compile_or_link_fail 2690 require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } 2691 values 2692 { 2693 input float in0 = 1.0; 2694 output float out0 = 1.0; 2695 } 2696 vertex "" 2697 #version 310 es 2698 ${VERTEX_DECLARATIONS} 2699 out mediump float tc_in; 2700 void main() 2701 { 2702 tc_in = in0; 2703 ${VERTEX_OUTPUT} 2704 } 2705 "" 2706 tessellation_control "" 2707 #version 310 es 2708 ${TESSELLATION_CONTROL_DECLARATIONS} 2709 in mediump float tc_in[]; 2710 out mediump float tc_out[]; 2711 2712 void main() 2713 { 2714 tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; 2715 ${TESSELLATION_CONTROL_OUTPUT} 2716 2717 return; 2718 barrier(); // error: barrier() after return 2719 } 2720 "" 2721 tessellation_evaluation "" 2722 #version 310 es 2723 ${TESSELLATION_EVALUATION_DECLARATIONS} 2724 in mediump float tc_out[]; 2725 out mediump float te_out; 2726 void main() 2727 { 2728 te_out = tc_out[2]; 2729 ${TESSELLATION_EVALUATION_OUTPUT} 2730 } 2731 "" 2732 fragment "" 2733 #version 310 es 2734 precision mediump float; 2735 ${FRAGMENT_DECLARATIONS} 2736 in mediump float te_out; 2737 void main() 2738 { 2739 out0 = te_out; 2740 ${FRAGMENT_OUTPUT} 2741 } 2742 "" 2743 end 2744 end 2745end 2746