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