1 2# Varying tests 3group varying "Varying linkage" 4 5 # Linking rules 6 group rules "Varying linking rules" 7 # not declared in vertex shader, declared in fragment shader 8 case fragment_declare 9 version 300 es 10 desc "varying declared in fragment shader, no reference in vertex shader" 11 values { output float out0 = 1.0; } 12 vertex "" 13 #version 300 es 14 ${VERTEX_DECLARATIONS} 15 void main() 16 { 17 ${VERTEX_OUTPUT} 18 } 19 "" 20 fragment "" 21 #version 300 es 22 precision mediump float; 23 in mediump float var; 24 ${FRAGMENT_DECLARATIONS} 25 void main() 26 { 27 out0 = 1.0; 28 ${FRAGMENT_OUTPUT} 29 } 30 "" 31 end 32 33 # declared in vertex shader, no reference in frag shader 34 case vertex_declare 35 version 300 es 36 desc "varying declared in vertex shader, no reference in fragment shader" 37 vertex "" 38 #version 300 es 39 ${VERTEX_DECLARATIONS} 40 out mediump float var; 41 void main() 42 { 43 ${VERTEX_OUTPUT} 44 } 45 "" 46 fragment "" 47 #version 300 es 48 ${FRAGMENT_DECLARATIONS} 49 void main() 50 { 51 ${FRAG_COLOR} = vec4(1.0); 52 } 53 "" 54 end 55 56 # declared in vertex shader, declared in frag shader 57 case both_declare 58 version 300 es 59 desc "varying declared in both vertex and fragment shader, but not used" 60 vertex "" 61 #version 300 es 62 ${VERTEX_DECLARATIONS} 63 out mediump float var; 64 void main() 65 { 66 ${VERTEX_OUTPUT} 67 } 68 "" 69 fragment "" 70 #version 300 es 71 in mediump float var; 72 ${FRAGMENT_DECLARATIONS} 73 void main() 74 { 75 ${FRAG_COLOR} = vec4(1.0); 76 } 77 "" 78 end 79 80 # declared in vertex shader, static use in frag shader 81 case vertex_declare_fragment_use 82 version 300 es 83 desc "varying declared in both shaders, statically used in fragment shader" 84 values { uniform bool u_false = false; } 85 vertex "" 86 #version 300 es 87 ${VERTEX_DECLARATIONS} 88 out mediump float var; 89 void main() 90 { 91 ${VERTEX_OUTPUT} 92 } 93 "" 94 fragment "" 95 #version 300 es 96 in mediump float var; 97 ${FRAGMENT_DECLARATIONS} 98 void main() 99 { 100 if (u_false) 101 ${FRAG_COLOR} = vec4(var); 102 else 103 ${FRAG_COLOR} = vec4(1.0); 104 } 105 "" 106 end 107 108 # static use in vertex shader, no reference in fragment shader 109 case vertex_use_fragment_declare 110 version 300 es 111 desc "varying declared and statically used in vertex shader, no reference in fragment shader" 112 values { uniform bool u_false = false; } 113 vertex "" 114 #version 300 es 115 ${VERTEX_DECLARATIONS} 116 out mediump float var; 117 void main() 118 { 119 if (u_false) 120 var = 1.0; 121 ${VERTEX_OUTPUT} 122 } 123 "" 124 fragment "" 125 #version 300 es 126 ${FRAGMENT_DECLARATIONS} 127 void main() 128 { 129 ${FRAG_COLOR} = vec4(1.0); 130 } 131 "" 132 end 133 134 # static use in vertex shader, declared in fragment shader 135 case vertex_use_declare_fragment 136 version 300 es 137 desc "varying declared and statically used in vertex shader, only declared in fragment shader" 138 values { uniform bool u_false = false; } 139 vertex "" 140 #version 300 es 141 ${VERTEX_DECLARATIONS} 142 out mediump float var; 143 void main() 144 { 145 if (u_false) 146 var = 1.0; 147 ${VERTEX_OUTPUT} 148 } 149 "" 150 fragment "" 151 #version 300 es 152 in mediump float var; 153 ${FRAGMENT_DECLARATIONS} 154 void main() 155 { 156 ${FRAG_COLOR} = vec4(1.0); 157 } 158 "" 159 end 160 161 # static use in vertex shader, used in fragment shader 162 case vertex_use_fragment_use 163 version 300 es 164 desc "varying statically used in both vertex and fragment shader" 165 values { uniform bool u_false = false; } 166 vertex "" 167 #version 300 es 168 ${VERTEX_DECLARATIONS} 169 out mediump float var; 170 void main() 171 { 172 if (u_false) 173 var = 1.0; 174 ${VERTEX_OUTPUT} 175 } 176 "" 177 fragment "" 178 #version 300 es 179 ${FRAGMENT_DECLARATIONS} 180 in mediump float var; 181 void main() 182 { 183 if (u_false) 184 ${FRAG_COLOR} = vec4(var); 185 else 186 ${FRAG_COLOR} = vec4(1.0); 187 } 188 "" 189 end 190 191 # differing precision tests 192 case differing_precision_1 193 version 300 es 194 desc "varying declared as highp in vertex shader, but mediump in fragment shader" 195 values 196 { 197 input float in0 = [ -1.25 | -25.55 | 1.0 | 2.25 | 3.4 | 16.0 ]; 198 output float out0 = [ -1.25 | -25.55 | 1.0 | 2.25 | 3.4 | 16.0 ]; 199 } 200 201 vertex "" 202 #version 300 es 203 ${VERTEX_DECLARATIONS} 204 out highp float var; 205 void main() 206 { 207 var = in0; 208 ${VERTEX_OUTPUT} 209 } 210 "" 211 fragment "" 212 #version 300 es 213 precision mediump float; 214 ${FRAGMENT_DECLARATIONS} 215 in mediump float var; 216 void main() 217 { 218 out0 = var; 219 ${FRAGMENT_OUTPUT} 220 } 221 "" 222 end 223 224 # differing precision tests 225 case differing_precision_2 226 version 300 es 227 desc "varying declared as highp in vertex shader, but lowp in fragment shader" 228 values 229 { 230 input float in0 = [ -1.25 | -25.56 | 1.0 | 2.25 | 3.4 | 16.0 ]; 231 output float out0 = [ -1.25 | -25.56 | 1.0 | 2.25 | 3.4 | 16.0 ]; 232 } 233 234 vertex "" 235 #version 300 es 236 ${VERTEX_DECLARATIONS} 237 out highp vec2 var; 238 void main() 239 { 240 var = vec2(in0, 2.0*in0); 241 ${VERTEX_OUTPUT} 242 } 243 "" 244 fragment "" 245 #version 300 es 246 precision mediump float; 247 ${FRAGMENT_DECLARATIONS} 248 in lowp vec2 var; 249 void main() 250 { 251 out0 = var.y - var.x; 252 ${FRAGMENT_OUTPUT} 253 } 254 "" 255 end 256 257 # differing precision tests 258 case differing_precision_3 259 version 300 es 260 desc "varying declared as lowp in vertex shader, but mediump in fragment shader" 261 values 262 { 263 input float in0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ]; 264 output float out0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ]; 265 } 266 267 vertex "" 268 #version 300 es 269 ${VERTEX_DECLARATIONS} 270 out lowp vec4 var; 271 void main() 272 { 273 var = vec4(in0, 2.0*in0, -in0, -in0); 274 ${VERTEX_OUTPUT} 275 } 276 "" 277 fragment "" 278 #version 300 es 279 precision mediump float; 280 ${FRAGMENT_DECLARATIONS} 281 in mediump vec4 var; 282 void main() 283 { 284 out0 = var.x + var.y + var.z + var.w; 285 ${FRAGMENT_OUTPUT} 286 } 287 "" 288 end 289 290 # mismatched type, static use but no runtime use in the fragment shader 291 case type_mismatch_1 292 version 300 es 293 desc "varying type mismatch (float vs. vec2), static use but no runtime use in the fragment shader" 294 expect link_fail 295 vertex "" 296 #version 300 es 297 ${VERTEX_DECLARATIONS} 298 out mediump float var; 299 void main() 300 { 301 var = 2.0; 302 ${VERTEX_OUTPUT} 303 } 304 "" 305 fragment "" 306 #version 300 es 307 ${FRAGMENT_DECLARATIONS} 308 in mediump vec2 var; 309 void main() 310 { 311 if (false) 312 { 313 ${FRAG_COLOR} = vec4(var.y); 314 } 315 else 316 { 317 ${FRAG_COLOR} = vec4(1.0); 318 } 319 } 320 "" 321 end 322 323 # mismatched type, varyings used 324 case type_mismatch_2 325 version 300 es 326 desc "varying type mismatch (float vs. vec2)" 327 expect link_fail 328 vertex "" 329 #version 300 es 330 ${VERTEX_DECLARATIONS} 331 out mediump float var; 332 void main() 333 { 334 var = 2.0; 335 ${VERTEX_OUTPUT} 336 } 337 "" 338 fragment "" 339 #version 300 es 340 ${FRAGMENT_DECLARATIONS} 341 in mediump vec2 var; 342 void main() 343 { 344 ${FRAG_COLOR} = var.xyyx; 345 } 346 "" 347 end 348 349 # mismatched type, varyings used 350 case type_mismatch_3 351 version 300 es 352 desc "varying type mismatch (int vs. uint)" 353 expect link_fail 354 vertex "" 355 #version 300 es 356 ${VERTEX_DECLARATIONS} 357 flat out mediump int var; 358 void main() 359 { 360 var = 2; 361 ${VERTEX_OUTPUT} 362 } 363 "" 364 fragment "" 365 #version 300 es 366 ${FRAGMENT_DECLARATIONS} 367 flat in mediump uint var; 368 void main() 369 { 370 ${FRAG_COLOR} = vec4(var); 371 } 372 "" 373 end 374 375 # mismatched type, varyings used 376 case struct_type_mismatch_1 377 version 300 es 378 desc "struct member mismatch" 379 expect link_fail 380 vertex "" 381 #version 300 es 382 ${VERTEX_DECLARATIONS} 383 struct S { highp float a; highp vec2 b; }; 384 out S var; 385 void main() 386 { 387 var.a = 2.0; 388 var.b = vec2(1.0, 0.0); 389 ${VERTEX_OUTPUT} 390 } 391 "" 392 fragment "" 393 #version 300 es 394 ${FRAGMENT_DECLARATIONS} 395 struct S { highp float a; highp vec3 b; }; 396 in S var; 397 void main() 398 { 399 ${FRAG_COLOR} = vec4(var.a, var.b); 400 } 401 "" 402 end 403 404 # mismatched type, varyings unused in fragment shader (runtime) 405 case struct_type_mismatch_2 406 version 300 es 407 desc "struct member mismatch" 408 expect link_fail 409 vertex "" 410 #version 300 es 411 ${VERTEX_DECLARATIONS} 412 struct S { highp float a; highp vec2 b; }; 413 out S var; 414 void main() 415 { 416 var.a = 2.0; 417 var.b = vec2(1.0, 0.0); 418 ${VERTEX_OUTPUT} 419 } 420 "" 421 fragment "" 422 #version 300 es 423 ${FRAGMENT_DECLARATIONS} 424 struct S { highp float a; highp vec3 b; }; 425 in S var; 426 void main() 427 { 428 ${FRAG_COLOR} = vec4(var.a); 429 if (false) 430 ${FRAG_COLOR}.yzw = var.b; 431 } 432 "" 433 end 434 435 # mismatched type, varyings unused in both (runtime) 436 case struct_type_mismatch_3 437 version 300 es 438 desc "struct member mismatch" 439 expect link_fail 440 vertex "" 441 #version 300 es 442 ${VERTEX_DECLARATIONS} 443 struct S { highp float a; highp vec2 b; }; 444 out S var; 445 void main() 446 { 447 var.a = 2.0; 448 if (false) 449 var.b = vec2(1.0, 0.0); 450 ${VERTEX_OUTPUT} 451 } 452 "" 453 fragment "" 454 #version 300 es 455 ${FRAGMENT_DECLARATIONS} 456 struct S { highp float a; highp vec3 b; }; 457 in S var; 458 void main() 459 { 460 ${FRAG_COLOR} = vec4(var.a); 461 if (false) 462 ${FRAG_COLOR}.yzw = var.b; 463 } 464 "" 465 end 466 467 # interpolation_mismatch 468 case interpolation_mismatch_1 469 version 300 es 470 desc "varying interpolation different (flat vs. smooth)" 471 expect link_fail 472 473 vertex "" 474 #version 300 es 475 ${VERTEX_DECLARATIONS} 476 in highp float in0; 477 flat out mediump float var; 478 void main() 479 { 480 var = in0; 481 ${VERTEX_OUTPUT} 482 } 483 "" 484 fragment "" 485 #version 300 es 486 precision mediump float; 487 ${FRAGMENT_DECLARATIONS} 488 in mediump float var; 489 void main() 490 { 491 ${FRAG_COLOR} = vec4(var); 492 } 493 "" 494 end 495 496 # different interpolation 497 case differing_interpolation_2 498 version 300 es 499 desc "varying interpolation different (smooth vs. centroid)" 500 values 501 { 502 input float in0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ]; 503 output float out0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ]; 504 } 505 506 vertex "" 507 #version 300 es 508 ${VERTEX_DECLARATIONS} 509 smooth out mediump float var; 510 void main() 511 { 512 var = in0; 513 ${VERTEX_OUTPUT} 514 } 515 "" 516 fragment "" 517 #version 300 es 518 precision mediump float; 519 ${FRAGMENT_DECLARATIONS} 520 centroid in mediump float var; 521 void main() 522 { 523 out0 = var; 524 ${FRAGMENT_OUTPUT} 525 } 526 "" 527 end 528 529 # no declaration in vertex shader, but static use in fragment 530 case illegal_usage_1 531 version 300 es 532 desc "varying not declared in vertex shader, but statically used in fragment shader" 533 expect link_fail 534 vertex "" 535 #version 300 es 536 ${VERTEX_DECLARATIONS} 537 void main() 538 { 539 ${VERTEX_OUTPUT} 540 } 541 "" 542 fragment "" 543 #version 300 es 544 ${FRAGMENT_DECLARATIONS} 545 in mediump float var; 546 void main() 547 { 548 ${FRAG_COLOR} = vec4(var); 549 } 550 "" 551 end 552 553 # non-flat integer varyings not allowed 554 case invalid_type_int 555 version 300 es 556 desc "integer varying used" 557 expect compile_fail 558 vertex "" 559 #version 300 es 560 ${VERTEX_DECLARATIONS} 561 out mediump int var; 562 void main() 563 { 564 ${VERTEX_OUTPUT} 565 } 566 "" 567 fragment "" 568 #version 300 es 569 ${FRAGMENT_DECLARATIONS} 570 in mediump int var; 571 void main() 572 { 573 ${FRAG_COLOR} = vec4(1.0); 574 } 575 "" 576 end 577 578 # non-flat integer varyings not allowed 579 case invalid_type_uint 580 version 300 es 581 desc "integer varying used" 582 expect compile_fail 583 vertex "" 584 #version 300 es 585 ${VERTEX_DECLARATIONS} 586 out mediump uint var; 587 void main() 588 { 589 ${VERTEX_OUTPUT} 590 } 591 "" 592 fragment "" 593 #version 300 es 594 ${FRAGMENT_DECLARATIONS} 595 in mediump uint var; 596 void main() 597 { 598 ${FRAG_COLOR} = vec4(1.0); 599 } 600 "" 601 end 602 603 # bool varyings not allowed 604 case invalid_type_bool 605 version 300 es 606 desc "boolean varying used" 607 expect compile_fail 608 vertex "" 609 #version 300 es 610 ${VERTEX_DECLARATIONS} 611 out bool var; 612 void main() 613 { 614 ${VERTEX_OUTPUT} 615 } 616 "" 617 fragment "" 618 #version 300 es 619 ${FRAGMENT_DECLARATIONS} 620 in bool var; 621 void main() 622 { 623 ${FRAG_COLOR} = vec4(1.0); 624 } 625 "" 626 end 627 628 case invalid_type_struct_array 629 version 300 es 630 desc "float array inside struct" 631 expect compile_fail 632 vertex "" 633 #version 300 es 634 ${VERTEX_DECLARATIONS} 635 struct S { mediump float a[3]; }; 636 out S var; 637 void main() 638 { 639 var.a[0] = 1.0; 640 var.a[1] = 1.0; 641 var.a[2] = 1.0; 642 ${VERTEX_OUTPUT} 643 } 644 "" 645 fragment "" 646 #version 300 es 647 precision mediump float; 648 ${FRAGMENT_DECLARATIONS} 649 struct S { mediump float a[3]; }; 650 in S var; 651 void main() 652 { 653 ${FRAG_COLOR} = vec4(1.0); 654 } 655 "" 656 end 657 658 case invalid_type_struct_struct 659 version 300 es 660 desc "struct inside struct" 661 expect compile_fail 662 vertex "" 663 #version 300 es 664 ${VERTEX_DECLARATIONS} 665 struct S { mediump float a; }; 666 struct T { S s; }; 667 out T var; 668 void main() 669 { 670 var.s.a = 1.0; 671 ${VERTEX_OUTPUT} 672 } 673 "" 674 fragment "" 675 #version 300 es 676 precision mediump float; 677 ${FRAGMENT_DECLARATIONS} 678 struct S { mediump float a; }; 679 struct T { S s; }; 680 in T var; 681 void main() 682 { 683 ${FRAG_COLOR} = vec4(1.0); 684 } 685 "" 686 end 687 688 case invalid_type_array_struct 689 version 300 es 690 desc "array of structs" 691 expect compile_fail 692 vertex "" 693 #version 300 es 694 ${VERTEX_DECLARATIONS} 695 struct S { mediump int a; }; 696 flat out S var[2]; 697 void main() 698 { 699 ${VERTEX_SETUP} 700 var[0].a = 1; 701 var[1].a = 1; 702 ${VERTEX_OUTPUT} 703 } 704 "" 705 fragment "" 706 #version 300 es 707 ${FRAGMENT_DECLARATIONS} 708 struct S { mediump int a; }; 709 flat in S var[2]; 710 void main() 711 { 712 ${FRAG_COLOR} = vec4(1.0); 713 } 714 "" 715 end 716 717 case invalid_type_array_array 718 version 300 es 719 desc "array of arrays" 720 expect compile_fail 721 vertex "" 722 #version 300 es 723 ${VERTEX_DECLARATIONS} 724 out mediump float var[2][2]; 725 void main() 726 { 727 ${VERTEX_SETUP} 728 var[0][0] = 1.0; 729 ${VERTEX_OUTPUT} 730 } 731 "" 732 fragment "" 733 #version 300 es 734 ${FRAGMENT_DECLARATIONS} 735 in mediump float var[2][2]; 736 void main() 737 { 738 ${FRAG_COLOR} = vec4(1.0); 739 } 740 "" 741 end 742 end 743 744 group basic_types "Basic varying types" 745 case float 746 version 300 es 747 desc "varying of type float" 748 values 749 { 750 input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; 751 output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; 752 } 753 vertex "" 754 #version 300 es 755 ${VERTEX_DECLARATIONS} 756 out mediump float var; 757 void main() 758 { 759 var = in0; 760 ${VERTEX_OUTPUT} 761 } 762 "" 763 fragment "" 764 #version 300 es 765 precision mediump float; 766 ${FRAGMENT_DECLARATIONS} 767 in float var; 768 void main() 769 { 770 out0 = var; 771 ${FRAGMENT_OUTPUT} 772 } 773 "" 774 end 775 776 case vec2 777 version 300 es 778 desc "varying of type vec2" 779 values 780 { 781 input vec2 in0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ]; 782 output vec2 out0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ]; 783 } 784 vertex "" 785 #version 300 es 786 ${VERTEX_DECLARATIONS} 787 out mediump vec2 var; 788 void main() 789 { 790 var = in0; 791 ${VERTEX_OUTPUT} 792 } 793 "" 794 fragment "" 795 #version 300 es 796 precision mediump float; 797 ${FRAGMENT_DECLARATIONS} 798 in vec2 var; 799 void main() 800 { 801 out0 = var; 802 ${FRAGMENT_OUTPUT} 803 } 804 "" 805 end 806 807 case vec3 808 version 300 es 809 desc "varying of type vec3" 810 values 811 { 812 input vec3 in0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; 813 output vec3 out0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; 814 } 815 vertex "" 816 #version 300 es 817 ${VERTEX_DECLARATIONS} 818 out mediump vec3 var; 819 void main() 820 { 821 var = in0; 822 ${VERTEX_OUTPUT} 823 } 824 "" 825 fragment "" 826 #version 300 es 827 precision mediump float; 828 ${FRAGMENT_DECLARATIONS} 829 in vec3 var; 830 void main() 831 { 832 out0 = var; 833 ${FRAGMENT_OUTPUT} 834 } 835 "" 836 end 837 838 case vec4 839 version 300 es 840 desc "varying of type vec4" 841 values 842 { 843 input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 844 output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 845 } 846 vertex "" 847 #version 300 es 848 ${VERTEX_DECLARATIONS} 849 out mediump vec4 var; 850 void main() 851 { 852 var = in0; 853 ${VERTEX_OUTPUT} 854 } 855 "" 856 fragment "" 857 #version 300 es 858 precision mediump float; 859 ${FRAGMENT_DECLARATIONS} 860 in vec4 var; 861 void main() 862 { 863 out0 = var; 864 ${FRAGMENT_OUTPUT} 865 } 866 "" 867 end 868 869 case mat2 870 version 300 es 871 desc "varying of type mat2" 872 values 873 { 874 input mat2 in0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ]; 875 output mat2 out0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ]; 876 } 877 vertex "" 878 #version 300 es 879 ${VERTEX_DECLARATIONS} 880 out mediump mat2 var; 881 void main() 882 { 883 var = in0; 884 ${VERTEX_OUTPUT} 885 } 886 "" 887 fragment "" 888 #version 300 es 889 precision mediump float; 890 ${FRAGMENT_DECLARATIONS} 891 in mat2 var; 892 void main() 893 { 894 out0 = var; 895 ${FRAGMENT_OUTPUT} 896 } 897 "" 898 end 899 900 case mat2x3 901 version 300 es 902 desc "varying of type mat2x3" 903 values 904 { 905 input mat2x3 in0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; 906 output mat2x3 out0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; 907 } 908 vertex "" 909 #version 300 es 910 ${VERTEX_DECLARATIONS} 911 out mediump mat2x3 var; 912 void main() 913 { 914 var = in0; 915 ${VERTEX_OUTPUT} 916 } 917 "" 918 fragment "" 919 #version 300 es 920 precision mediump float; 921 ${FRAGMENT_DECLARATIONS} 922 in mat2x3 var; 923 void main() 924 { 925 out0 = var; 926 ${FRAGMENT_OUTPUT} 927 } 928 "" 929 end 930 931 case mat2x4 932 version 300 es 933 desc "varying of type mat2x4" 934 values 935 { 936 input mat2x4 in0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; 937 output mat2x4 out0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; 938 } 939 vertex "" 940 #version 300 es 941 ${VERTEX_DECLARATIONS} 942 out mediump mat2x4 var; 943 void main() 944 { 945 var = in0; 946 ${VERTEX_OUTPUT} 947 } 948 "" 949 fragment "" 950 #version 300 es 951 precision mediump float; 952 ${FRAGMENT_DECLARATIONS} 953 in mat2x4 var; 954 void main() 955 { 956 out0 = var; 957 ${FRAGMENT_OUTPUT} 958 } 959 "" 960 end 961 962 case mat3x2 963 version 300 es 964 desc "varying of type mat3x2" 965 values 966 { 967 input mat3x2 in0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; 968 output mat3x2 out0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; 969 } 970 vertex "" 971 #version 300 es 972 ${VERTEX_DECLARATIONS} 973 out mediump mat3x2 var; 974 void main() 975 { 976 var = in0; 977 ${VERTEX_OUTPUT} 978 } 979 "" 980 fragment "" 981 #version 300 es 982 precision mediump float; 983 ${FRAGMENT_DECLARATIONS} 984 in mat3x2 var; 985 void main() 986 { 987 out0 = var; 988 ${FRAGMENT_OUTPUT} 989 } 990 "" 991 end 992 993 case mat3 994 version 300 es 995 desc "varying of type mat3" 996 values 997 { 998 input mat3 in0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ]; 999 output mat3 out0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ]; 1000 } 1001 vertex "" 1002 #version 300 es 1003 ${VERTEX_DECLARATIONS} 1004 out mediump mat3 var; 1005 void main() 1006 { 1007 var = in0; 1008 ${VERTEX_OUTPUT} 1009 } 1010 "" 1011 fragment "" 1012 #version 300 es 1013 precision mediump float; 1014 ${FRAGMENT_DECLARATIONS} 1015 in mat3 var; 1016 void main() 1017 { 1018 out0 = var; 1019 ${FRAGMENT_OUTPUT} 1020 } 1021 "" 1022 end 1023 1024 case mat3x4 1025 version 300 es 1026 desc "varying of type mat3x4" 1027 values 1028 { 1029 input mat3x4 in0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; 1030 output mat3x4 out0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; 1031 } 1032 vertex "" 1033 #version 300 es 1034 ${VERTEX_DECLARATIONS} 1035 out mediump mat3x4 var; 1036 void main() 1037 { 1038 var = in0; 1039 ${VERTEX_OUTPUT} 1040 } 1041 "" 1042 fragment "" 1043 #version 300 es 1044 precision mediump float; 1045 ${FRAGMENT_DECLARATIONS} 1046 in mat3x4 var; 1047 void main() 1048 { 1049 out0 = var; 1050 ${FRAGMENT_OUTPUT} 1051 } 1052 "" 1053 end 1054 1055 case mat4x2 1056 version 300 es 1057 desc "varying of type mat4x2" 1058 values 1059 { 1060 input mat4x2 in0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; 1061 output mat4x2 out0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; 1062 } 1063 vertex "" 1064 #version 300 es 1065 ${VERTEX_DECLARATIONS} 1066 out mediump mat4x2 var; 1067 void main() 1068 { 1069 var = in0; 1070 ${VERTEX_OUTPUT} 1071 } 1072 "" 1073 fragment "" 1074 #version 300 es 1075 precision mediump float; 1076 ${FRAGMENT_DECLARATIONS} 1077 in mat4x2 var; 1078 void main() 1079 { 1080 out0 = var; 1081 ${FRAGMENT_OUTPUT} 1082 } 1083 "" 1084 end 1085 1086 case mat4x3 1087 version 300 es 1088 desc "varying of type mat4x3" 1089 values 1090 { 1091 input mat4x3 in0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; 1092 output mat4x3 out0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; 1093 } 1094 vertex "" 1095 #version 300 es 1096 ${VERTEX_DECLARATIONS} 1097 out mediump mat4x3 var; 1098 void main() 1099 { 1100 var = in0; 1101 ${VERTEX_OUTPUT} 1102 } 1103 "" 1104 fragment "" 1105 #version 300 es 1106 precision mediump float; 1107 ${FRAGMENT_DECLARATIONS} 1108 in mat4x3 var; 1109 void main() 1110 { 1111 out0 = var; 1112 ${FRAGMENT_OUTPUT} 1113 } 1114 "" 1115 end 1116 1117 case mat4 1118 version 300 es 1119 desc "varying of type mat4" 1120 values 1121 { 1122 input mat4 in0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ]; 1123 output mat4 out0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ]; 1124 } 1125 vertex "" 1126 #version 300 es 1127 ${VERTEX_DECLARATIONS} 1128 out mediump mat4 var; 1129 void main() 1130 { 1131 var = in0; 1132 ${VERTEX_OUTPUT} 1133 } 1134 "" 1135 fragment "" 1136 #version 300 es 1137 precision mediump float; 1138 ${FRAGMENT_DECLARATIONS} 1139 in mat4 var; 1140 void main() 1141 { 1142 out0 = var; 1143 ${FRAGMENT_OUTPUT} 1144 } 1145 "" 1146 end 1147 1148 case int 1149 version 300 es 1150 desc "varying of type int" 1151 values 1152 { 1153 input int in0 = [ -1 | -25 | 1 | 2 | 3 | 16 ]; 1154 output int out0 = [ -1 | -25 | 1 | 2 | 3 | 16 ]; 1155 } 1156 vertex "" 1157 #version 300 es 1158 ${VERTEX_DECLARATIONS} 1159 flat out mediump int var; 1160 void main() 1161 { 1162 ${VERTEX_SETUP} 1163 var = in0; 1164 ${VERTEX_OUTPUT} 1165 } 1166 "" 1167 fragment "" 1168 #version 300 es 1169 ${FRAGMENT_DECLARATIONS} 1170 flat in int var; 1171 void main() 1172 { 1173 out0 = var; 1174 ${FRAGMENT_OUTPUT} 1175 } 1176 "" 1177 end 1178 1179 case ivec2 1180 version 300 es 1181 desc "varying of type ivec2" 1182 values 1183 { 1184 input ivec2 in0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ]; 1185 output ivec2 out0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ]; 1186 } 1187 vertex "" 1188 #version 300 es 1189 ${VERTEX_DECLARATIONS} 1190 flat out mediump ivec2 var; 1191 void main() 1192 { 1193 ${VERTEX_SETUP} 1194 var = in0; 1195 ${VERTEX_OUTPUT} 1196 } 1197 "" 1198 fragment "" 1199 #version 300 es 1200 ${FRAGMENT_DECLARATIONS} 1201 flat in ivec2 var; 1202 void main() 1203 { 1204 out0 = var; 1205 ${FRAGMENT_OUTPUT} 1206 } 1207 "" 1208 end 1209 1210 case ivec3 1211 version 300 es 1212 desc "varying of type ivec3" 1213 values 1214 { 1215 input ivec3 in0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ]; 1216 output ivec3 out0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ]; 1217 } 1218 vertex "" 1219 #version 300 es 1220 ${VERTEX_DECLARATIONS} 1221 flat out mediump ivec3 var; 1222 void main() 1223 { 1224 ${VERTEX_SETUP} 1225 var = in0; 1226 ${VERTEX_OUTPUT} 1227 } 1228 "" 1229 fragment "" 1230 #version 300 es 1231 ${FRAGMENT_DECLARATIONS} 1232 flat in ivec3 var; 1233 void main() 1234 { 1235 out0 = var; 1236 ${FRAGMENT_OUTPUT} 1237 } 1238 "" 1239 end 1240 1241 case ivec4 1242 version 300 es 1243 desc "varying of type ivec4" 1244 values 1245 { 1246 input ivec4 in0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ]; 1247 output ivec4 out0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ]; 1248 } 1249 vertex "" 1250 #version 300 es 1251 ${VERTEX_DECLARATIONS} 1252 flat out mediump ivec4 var; 1253 void main() 1254 { 1255 ${VERTEX_SETUP} 1256 var = in0; 1257 ${VERTEX_OUTPUT} 1258 } 1259 "" 1260 fragment "" 1261 #version 300 es 1262 ${FRAGMENT_DECLARATIONS} 1263 flat in ivec4 var; 1264 void main() 1265 { 1266 out0 = var; 1267 ${FRAGMENT_OUTPUT} 1268 } 1269 "" 1270 end 1271 1272 case uint 1273 version 300 es 1274 desc "varying of type int" 1275 values 1276 { 1277 input uint in0 = [ 1 | 2 | 3 | 16 ]; 1278 output uint out0 = [ 1 | 2 | 3 | 16 ]; 1279 } 1280 vertex "" 1281 #version 300 es 1282 ${VERTEX_DECLARATIONS} 1283 flat out mediump uint var; 1284 void main() 1285 { 1286 ${VERTEX_SETUP} 1287 var = in0; 1288 ${VERTEX_OUTPUT} 1289 } 1290 "" 1291 fragment "" 1292 #version 300 es 1293 ${FRAGMENT_DECLARATIONS} 1294 flat in uint var; 1295 void main() 1296 { 1297 out0 = var; 1298 ${FRAGMENT_OUTPUT} 1299 } 1300 "" 1301 end 1302 1303 case uvec2 1304 version 300 es 1305 desc "varying of type uvec2" 1306 values 1307 { 1308 input uvec2 in0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ]; 1309 output uvec2 out0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ]; 1310 } 1311 vertex "" 1312 #version 300 es 1313 ${VERTEX_DECLARATIONS} 1314 flat out mediump uvec2 var; 1315 void main() 1316 { 1317 ${VERTEX_SETUP} 1318 var = in0; 1319 ${VERTEX_OUTPUT} 1320 } 1321 "" 1322 fragment "" 1323 #version 300 es 1324 ${FRAGMENT_DECLARATIONS} 1325 flat in uvec2 var; 1326 void main() 1327 { 1328 out0 = var; 1329 ${FRAGMENT_OUTPUT} 1330 } 1331 "" 1332 end 1333 1334 case uvec3 1335 version 300 es 1336 desc "varying of type uvec3" 1337 values 1338 { 1339 input uvec3 in0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ]; 1340 output uvec3 out0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ]; 1341 } 1342 vertex "" 1343 #version 300 es 1344 ${VERTEX_DECLARATIONS} 1345 flat out mediump uvec3 var; 1346 void main() 1347 { 1348 ${VERTEX_SETUP} 1349 var = in0; 1350 ${VERTEX_OUTPUT} 1351 } 1352 "" 1353 fragment "" 1354 #version 300 es 1355 ${FRAGMENT_DECLARATIONS} 1356 flat in uvec3 var; 1357 void main() 1358 { 1359 out0 = var; 1360 ${FRAGMENT_OUTPUT} 1361 } 1362 "" 1363 end 1364 1365 case uvec4 1366 version 300 es 1367 desc "varying of type uvec4" 1368 values 1369 { 1370 input uvec4 in0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ]; 1371 output uvec4 out0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ]; 1372 } 1373 vertex "" 1374 #version 300 es 1375 ${VERTEX_DECLARATIONS} 1376 flat out mediump uvec4 var; 1377 void main() 1378 { 1379 ${VERTEX_SETUP} 1380 var = in0; 1381 ${VERTEX_OUTPUT} 1382 } 1383 "" 1384 fragment "" 1385 #version 300 es 1386 ${FRAGMENT_DECLARATIONS} 1387 flat in uvec4 var; 1388 void main() 1389 { 1390 out0 = var; 1391 ${FRAGMENT_OUTPUT} 1392 } 1393 "" 1394 end 1395 end 1396 1397 group struct "Structure varyings" 1398 case float 1399 version 300 es 1400 desc "varying of type float inside struct" 1401 values 1402 { 1403 input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; 1404 output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; 1405 } 1406 vertex "" 1407 #version 300 es 1408 ${VERTEX_DECLARATIONS} 1409 struct S { mediump float a; }; 1410 out S var; 1411 void main() 1412 { 1413 var.a = in0; 1414 ${VERTEX_OUTPUT} 1415 } 1416 "" 1417 fragment "" 1418 #version 300 es 1419 precision mediump float; 1420 ${FRAGMENT_DECLARATIONS} 1421 struct S { mediump float a; }; 1422 in S var; 1423 void main() 1424 { 1425 out0 = var.a; 1426 ${FRAGMENT_OUTPUT} 1427 } 1428 "" 1429 end 1430 1431 case vec2 1432 version 300 es 1433 desc "varying of type vec2 inside struct" 1434 values 1435 { 1436 input vec2 in0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ]; 1437 output vec2 out0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ]; 1438 } 1439 vertex "" 1440 #version 300 es 1441 ${VERTEX_DECLARATIONS} 1442 struct S { mediump vec2 a; }; 1443 out S var; 1444 void main() 1445 { 1446 var.a = in0; 1447 ${VERTEX_OUTPUT} 1448 } 1449 "" 1450 fragment "" 1451 #version 300 es 1452 precision mediump float; 1453 ${FRAGMENT_DECLARATIONS} 1454 struct S { mediump vec2 a; }; 1455 in S var; 1456 void main() 1457 { 1458 out0 = var.a; 1459 ${FRAGMENT_OUTPUT} 1460 } 1461 "" 1462 end 1463 1464 case vec3 1465 version 300 es 1466 desc "varying of type vec3 inside struct" 1467 values 1468 { 1469 input vec3 in0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; 1470 output vec3 out0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; 1471 } 1472 vertex "" 1473 #version 300 es 1474 ${VERTEX_DECLARATIONS} 1475 struct S { mediump vec3 a; }; 1476 out S var; 1477 void main() 1478 { 1479 var.a = in0; 1480 ${VERTEX_OUTPUT} 1481 } 1482 "" 1483 fragment "" 1484 #version 300 es 1485 precision mediump float; 1486 ${FRAGMENT_DECLARATIONS} 1487 struct S { mediump vec3 a; }; 1488 in S var; 1489 void main() 1490 { 1491 out0 = var.a; 1492 ${FRAGMENT_OUTPUT} 1493 } 1494 "" 1495 end 1496 1497 case vec4 1498 version 300 es 1499 desc "varying of type vec4 inside struct" 1500 values 1501 { 1502 input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 1503 output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 1504 } 1505 vertex "" 1506 #version 300 es 1507 ${VERTEX_DECLARATIONS} 1508 struct S { mediump vec4 a; }; 1509 out S var; 1510 void main() 1511 { 1512 var.a = in0; 1513 ${VERTEX_OUTPUT} 1514 } 1515 "" 1516 fragment "" 1517 #version 300 es 1518 precision mediump float; 1519 ${FRAGMENT_DECLARATIONS} 1520 struct S { mediump vec4 a; }; 1521 in S var; 1522 void main() 1523 { 1524 out0 = var.a; 1525 ${FRAGMENT_OUTPUT} 1526 } 1527 "" 1528 end 1529 1530 case mat2 1531 version 300 es 1532 desc "varying of type mat2 inside struct" 1533 values 1534 { 1535 input mat2 in0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ]; 1536 output mat2 out0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ]; 1537 } 1538 vertex "" 1539 #version 300 es 1540 ${VERTEX_DECLARATIONS} 1541 struct S { mediump mat2 a; }; 1542 out S var; 1543 void main() 1544 { 1545 var.a = in0; 1546 ${VERTEX_OUTPUT} 1547 } 1548 "" 1549 fragment "" 1550 #version 300 es 1551 precision mediump float; 1552 ${FRAGMENT_DECLARATIONS} 1553 struct S { mediump mat2 a; }; 1554 in S var; 1555 void main() 1556 { 1557 out0 = var.a; 1558 ${FRAGMENT_OUTPUT} 1559 } 1560 "" 1561 end 1562 1563 case mat2x3 1564 version 300 es 1565 desc "varying of type mat2x3 inside struct" 1566 values 1567 { 1568 input mat2x3 in0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; 1569 output mat2x3 out0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; 1570 } 1571 vertex "" 1572 #version 300 es 1573 ${VERTEX_DECLARATIONS} 1574 struct S { mediump mat2x3 a; }; 1575 out S var; 1576 void main() 1577 { 1578 var.a = in0; 1579 ${VERTEX_OUTPUT} 1580 } 1581 "" 1582 fragment "" 1583 #version 300 es 1584 precision mediump float; 1585 ${FRAGMENT_DECLARATIONS} 1586 struct S { mediump mat2x3 a; }; 1587 in S var; 1588 void main() 1589 { 1590 out0 = var.a; 1591 ${FRAGMENT_OUTPUT} 1592 } 1593 "" 1594 end 1595 1596 case mat2x4 1597 version 300 es 1598 desc "varying of type mat2x4 inside struct" 1599 values 1600 { 1601 input mat2x4 in0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; 1602 output mat2x4 out0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; 1603 } 1604 vertex "" 1605 #version 300 es 1606 ${VERTEX_DECLARATIONS} 1607 struct S { mediump mat2x4 a; }; 1608 out S var; 1609 void main() 1610 { 1611 var.a = in0; 1612 ${VERTEX_OUTPUT} 1613 } 1614 "" 1615 fragment "" 1616 #version 300 es 1617 precision mediump float; 1618 ${FRAGMENT_DECLARATIONS} 1619 struct S { mediump mat2x4 a; }; 1620 in S var; 1621 void main() 1622 { 1623 out0 = var.a; 1624 ${FRAGMENT_OUTPUT} 1625 } 1626 "" 1627 end 1628 1629 case mat3x2 1630 version 300 es 1631 desc "varying of type mat3x2 inside struct" 1632 values 1633 { 1634 input mat3x2 in0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; 1635 output mat3x2 out0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; 1636 } 1637 vertex "" 1638 #version 300 es 1639 ${VERTEX_DECLARATIONS} 1640 struct S { mediump mat3x2 a; }; 1641 out S var; 1642 void main() 1643 { 1644 var.a = in0; 1645 ${VERTEX_OUTPUT} 1646 } 1647 "" 1648 fragment "" 1649 #version 300 es 1650 precision mediump float; 1651 ${FRAGMENT_DECLARATIONS} 1652 struct S { mediump mat3x2 a; }; 1653 in S var; 1654 void main() 1655 { 1656 out0 = var.a; 1657 ${FRAGMENT_OUTPUT} 1658 } 1659 "" 1660 end 1661 1662 case mat3 1663 version 300 es 1664 desc "varying of type mat3 inside struct" 1665 values 1666 { 1667 input mat3 in0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ]; 1668 output mat3 out0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ]; 1669 } 1670 vertex "" 1671 #version 300 es 1672 ${VERTEX_DECLARATIONS} 1673 struct S { mediump mat3 a; }; 1674 out S var; 1675 void main() 1676 { 1677 var.a = in0; 1678 ${VERTEX_OUTPUT} 1679 } 1680 "" 1681 fragment "" 1682 #version 300 es 1683 precision mediump float; 1684 ${FRAGMENT_DECLARATIONS} 1685 struct S { mediump mat3 a; }; 1686 in S var; 1687 void main() 1688 { 1689 out0 = var.a; 1690 ${FRAGMENT_OUTPUT} 1691 } 1692 "" 1693 end 1694 1695 case mat3x4 1696 version 300 es 1697 desc "varying of type mat3x4 inside struct" 1698 values 1699 { 1700 input mat3x4 in0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; 1701 output mat3x4 out0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; 1702 } 1703 vertex "" 1704 #version 300 es 1705 ${VERTEX_DECLARATIONS} 1706 struct S { mediump mat3x4 a; }; 1707 out S var; 1708 void main() 1709 { 1710 var.a = in0; 1711 ${VERTEX_OUTPUT} 1712 } 1713 "" 1714 fragment "" 1715 #version 300 es 1716 precision mediump float; 1717 ${FRAGMENT_DECLARATIONS} 1718 struct S { mediump mat3x4 a; }; 1719 in S var; 1720 void main() 1721 { 1722 out0 = var.a; 1723 ${FRAGMENT_OUTPUT} 1724 } 1725 "" 1726 end 1727 1728 case mat4x2 1729 version 300 es 1730 desc "varying of type mat4x2 inside struct" 1731 values 1732 { 1733 input mat4x2 in0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; 1734 output mat4x2 out0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; 1735 } 1736 vertex "" 1737 #version 300 es 1738 ${VERTEX_DECLARATIONS} 1739 struct S { mediump mat4x2 a; }; 1740 out S var; 1741 void main() 1742 { 1743 var.a = in0; 1744 ${VERTEX_OUTPUT} 1745 } 1746 "" 1747 fragment "" 1748 #version 300 es 1749 precision mediump float; 1750 ${FRAGMENT_DECLARATIONS} 1751 struct S { mediump mat4x2 a; }; 1752 in S var; 1753 void main() 1754 { 1755 out0 = var.a; 1756 ${FRAGMENT_OUTPUT} 1757 } 1758 "" 1759 end 1760 1761 case mat4x3 1762 version 300 es 1763 desc "varying of type mat4x3 inside struct" 1764 values 1765 { 1766 input mat4x3 in0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; 1767 output mat4x3 out0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; 1768 } 1769 vertex "" 1770 #version 300 es 1771 ${VERTEX_DECLARATIONS} 1772 struct S { mediump mat4x3 a; }; 1773 out S var; 1774 void main() 1775 { 1776 var.a = in0; 1777 ${VERTEX_OUTPUT} 1778 } 1779 "" 1780 fragment "" 1781 #version 300 es 1782 precision mediump float; 1783 ${FRAGMENT_DECLARATIONS} 1784 struct S { mediump mat4x3 a; }; 1785 in S var; 1786 void main() 1787 { 1788 out0 = var.a; 1789 ${FRAGMENT_OUTPUT} 1790 } 1791 "" 1792 end 1793 1794 case mat4 1795 version 300 es 1796 desc "varying of type mat4 inside struct" 1797 values 1798 { 1799 input mat4 in0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ]; 1800 output mat4 out0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ]; 1801 } 1802 vertex "" 1803 #version 300 es 1804 ${VERTEX_DECLARATIONS} 1805 struct S { mediump mat4 a; }; 1806 out S var; 1807 void main() 1808 { 1809 var.a = in0; 1810 ${VERTEX_OUTPUT} 1811 } 1812 "" 1813 fragment "" 1814 #version 300 es 1815 precision mediump float; 1816 ${FRAGMENT_DECLARATIONS} 1817 struct S { mediump mat4 a; }; 1818 in S var; 1819 void main() 1820 { 1821 out0 = var.a; 1822 ${FRAGMENT_OUTPUT} 1823 } 1824 "" 1825 end 1826 1827 case int 1828 version 300 es 1829 desc "varying of type int inside struct" 1830 values 1831 { 1832 input int in0 = [ -1 | -25 | 1 | 2 | 3 | 16 ]; 1833 output int out0 = [ -1 | -25 | 1 | 2 | 3 | 16 ]; 1834 } 1835 vertex "" 1836 #version 300 es 1837 ${VERTEX_DECLARATIONS} 1838 struct S { mediump int a; }; 1839 flat out S var; 1840 void main() 1841 { 1842 ${VERTEX_SETUP} 1843 var.a = in0; 1844 ${VERTEX_OUTPUT} 1845 } 1846 "" 1847 fragment "" 1848 #version 300 es 1849 ${FRAGMENT_DECLARATIONS} 1850 struct S { mediump int a; }; 1851 flat in S var; 1852 void main() 1853 { 1854 out0 = var.a; 1855 ${FRAGMENT_OUTPUT} 1856 } 1857 "" 1858 end 1859 1860 case ivec2 1861 version 300 es 1862 desc "varying of type ivec2 inside struct" 1863 values 1864 { 1865 input ivec2 in0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ]; 1866 output ivec2 out0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ]; 1867 } 1868 vertex "" 1869 #version 300 es 1870 ${VERTEX_DECLARATIONS} 1871 struct S { mediump ivec2 a; }; 1872 flat out S var; 1873 void main() 1874 { 1875 ${VERTEX_SETUP} 1876 var.a = in0; 1877 ${VERTEX_OUTPUT} 1878 } 1879 "" 1880 fragment "" 1881 #version 300 es 1882 ${FRAGMENT_DECLARATIONS} 1883 struct S { mediump ivec2 a; }; 1884 flat in S var; 1885 void main() 1886 { 1887 out0 = var.a; 1888 ${FRAGMENT_OUTPUT} 1889 } 1890 "" 1891 end 1892 1893 case ivec3 1894 version 300 es 1895 desc "varying of type ivec3 inside struct" 1896 values 1897 { 1898 input ivec3 in0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ]; 1899 output ivec3 out0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ]; 1900 } 1901 vertex "" 1902 #version 300 es 1903 ${VERTEX_DECLARATIONS} 1904 struct S { mediump ivec3 a; }; 1905 flat out S var; 1906 void main() 1907 { 1908 ${VERTEX_SETUP} 1909 var.a = in0; 1910 ${VERTEX_OUTPUT} 1911 } 1912 "" 1913 fragment "" 1914 #version 300 es 1915 ${FRAGMENT_DECLARATIONS} 1916 struct S { mediump ivec3 a; }; 1917 flat in S var; 1918 void main() 1919 { 1920 out0 = var.a; 1921 ${FRAGMENT_OUTPUT} 1922 } 1923 "" 1924 end 1925 1926 case ivec4 1927 version 300 es 1928 desc "varying of type ivec4 inside struct" 1929 values 1930 { 1931 input ivec4 in0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ]; 1932 output ivec4 out0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ]; 1933 } 1934 vertex "" 1935 #version 300 es 1936 ${VERTEX_DECLARATIONS} 1937 struct S { mediump ivec4 a; }; 1938 flat out S var; 1939 void main() 1940 { 1941 ${VERTEX_SETUP} 1942 var.a = in0; 1943 ${VERTEX_OUTPUT} 1944 } 1945 "" 1946 fragment "" 1947 #version 300 es 1948 ${FRAGMENT_DECLARATIONS} 1949 struct S { mediump ivec4 a; }; 1950 flat in S var; 1951 void main() 1952 { 1953 out0 = var.a; 1954 ${FRAGMENT_OUTPUT} 1955 } 1956 "" 1957 end 1958 1959 case uint 1960 version 300 es 1961 desc "varying of type uint in struct" 1962 values 1963 { 1964 input uint in0 = [ 1 | 2 | 3 | 16 ]; 1965 output uint out0 = [ 1 | 2 | 3 | 16 ]; 1966 } 1967 vertex "" 1968 #version 300 es 1969 ${VERTEX_DECLARATIONS} 1970 struct S { mediump uint a; }; 1971 flat out S var; 1972 void main() 1973 { 1974 ${VERTEX_SETUP} 1975 var.a = in0; 1976 ${VERTEX_OUTPUT} 1977 } 1978 "" 1979 fragment "" 1980 #version 300 es 1981 ${FRAGMENT_DECLARATIONS} 1982 struct S { mediump uint a; }; 1983 flat in S var; 1984 void main() 1985 { 1986 out0 = var.a; 1987 ${FRAGMENT_OUTPUT} 1988 } 1989 "" 1990 end 1991 1992 case uvec2 1993 version 300 es 1994 desc "varying of type uvec2 inside struct" 1995 values 1996 { 1997 input uvec2 in0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ]; 1998 output uvec2 out0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ]; 1999 } 2000 vertex "" 2001 #version 300 es 2002 ${VERTEX_DECLARATIONS} 2003 struct S { mediump uvec2 a; }; 2004 flat out S var; 2005 void main() 2006 { 2007 ${VERTEX_SETUP} 2008 var.a = in0; 2009 ${VERTEX_OUTPUT} 2010 } 2011 "" 2012 fragment "" 2013 #version 300 es 2014 ${FRAGMENT_DECLARATIONS} 2015 struct S { mediump uvec2 a; }; 2016 flat in S var; 2017 void main() 2018 { 2019 out0 = var.a; 2020 ${FRAGMENT_OUTPUT} 2021 } 2022 "" 2023 end 2024 2025 case uvec3 2026 version 300 es 2027 desc "varying of type uvec3 inside struct" 2028 values 2029 { 2030 input uvec3 in0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ]; 2031 output uvec3 out0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ]; 2032 } 2033 vertex "" 2034 #version 300 es 2035 ${VERTEX_DECLARATIONS} 2036 struct S { mediump uvec3 a; }; 2037 flat out S var; 2038 void main() 2039 { 2040 ${VERTEX_SETUP} 2041 var.a = in0; 2042 ${VERTEX_OUTPUT} 2043 } 2044 "" 2045 fragment "" 2046 #version 300 es 2047 ${FRAGMENT_DECLARATIONS} 2048 struct S { mediump uvec3 a; }; 2049 flat in S var; 2050 void main() 2051 { 2052 out0 = var.a; 2053 ${FRAGMENT_OUTPUT} 2054 } 2055 "" 2056 end 2057 2058 case uvec4 2059 version 300 es 2060 desc "varying of type uvec4 inside struct" 2061 values 2062 { 2063 input uvec4 in0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ]; 2064 output uvec4 out0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ]; 2065 } 2066 vertex "" 2067 #version 300 es 2068 ${VERTEX_DECLARATIONS} 2069 struct S { mediump uvec4 a; }; 2070 flat out S var; 2071 void main() 2072 { 2073 ${VERTEX_SETUP} 2074 var.a = in0; 2075 ${VERTEX_OUTPUT} 2076 } 2077 "" 2078 fragment "" 2079 #version 300 es 2080 ${FRAGMENT_DECLARATIONS} 2081 struct S { mediump uvec4 a; }; 2082 flat in S var; 2083 void main() 2084 { 2085 out0 = var.a; 2086 ${FRAGMENT_OUTPUT} 2087 } 2088 "" 2089 end 2090 2091 case float_vec3 2092 version 300 es 2093 desc "varyings of type float and vec3 inside struct" 2094 values 2095 { 2096 input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; 2097 output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; 2098 input vec3 in1 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; 2099 output vec3 out1 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; 2100 } 2101 vertex "" 2102 #version 300 es 2103 ${VERTEX_DECLARATIONS} 2104 struct S { mediump float a; highp vec3 b; }; 2105 out S var; 2106 void main() 2107 { 2108 var.a = in0; 2109 var.b = in1; 2110 ${VERTEX_OUTPUT} 2111 } 2112 "" 2113 fragment "" 2114 #version 300 es 2115 precision mediump float; 2116 ${FRAGMENT_DECLARATIONS} 2117 struct S { mediump float a; highp vec3 b; }; 2118 in S var; 2119 void main() 2120 { 2121 out0 = var.a; 2122 out1 = var.b; 2123 ${FRAGMENT_OUTPUT} 2124 } 2125 "" 2126 end 2127 2128 case float_uvec2_vec3 2129 version 300 es 2130 desc "varyings of type float and vec3 inside struct" 2131 values 2132 { 2133 input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; 2134 output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; 2135 input uvec2 in1 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) | uvec2(8, 7) ]; 2136 output uvec2 out1 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) | uvec2(8, 7) ]; 2137 input vec3 in2 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; 2138 output vec3 out2 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; 2139 } 2140 vertex "" 2141 #version 300 es 2142 ${VERTEX_DECLARATIONS} 2143 struct S { mediump float a; highp uvec2 b; highp vec3 c; }; 2144 flat out S var; 2145 void main() 2146 { 2147 ${VERTEX_SETUP} 2148 var.a = in0; 2149 var.b = in1; 2150 var.c = in2; 2151 ${VERTEX_OUTPUT} 2152 } 2153 "" 2154 fragment "" 2155 #version 300 es 2156 precision mediump float; 2157 ${FRAGMENT_DECLARATIONS} 2158 struct S { mediump float a; highp uvec2 b; highp vec3 c; }; 2159 flat in S var; 2160 void main() 2161 { 2162 out0 = var.a; 2163 out1 = var.b; 2164 out2 = var.c; 2165 ${FRAGMENT_OUTPUT} 2166 } 2167 "" 2168 end 2169 end 2170 2171 group interpolation "Varying interpolation modes" 2172 case smooth 2173 version 300 es 2174 desc "varying of type vec4" 2175 values 2176 { 2177 input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 2178 output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 2179 } 2180 vertex "" 2181 #version 300 es 2182 ${VERTEX_DECLARATIONS} 2183 smooth out mediump vec4 var; 2184 void main() 2185 { 2186 var = in0; 2187 ${VERTEX_OUTPUT} 2188 } 2189 "" 2190 fragment "" 2191 #version 300 es 2192 precision mediump float; 2193 ${FRAGMENT_DECLARATIONS} 2194 smooth in vec4 var; 2195 void main() 2196 { 2197 out0 = var; 2198 ${FRAGMENT_OUTPUT} 2199 } 2200 "" 2201 end 2202 2203 case centroid 2204 version 300 es 2205 desc "varying of type vec4" 2206 values 2207 { 2208 input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 2209 output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 2210 } 2211 vertex "" 2212 #version 300 es 2213 ${VERTEX_DECLARATIONS} 2214 centroid out mediump vec4 var; 2215 void main() 2216 { 2217 var = in0; 2218 ${VERTEX_OUTPUT} 2219 } 2220 "" 2221 fragment "" 2222 #version 300 es 2223 precision mediump float; 2224 ${FRAGMENT_DECLARATIONS} 2225 centroid in vec4 var; 2226 void main() 2227 { 2228 out0 = var; 2229 ${FRAGMENT_OUTPUT} 2230 } 2231 "" 2232 end 2233 2234 case flat 2235 version 300 es 2236 desc "varying of type vec4" 2237 values 2238 { 2239 input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 2240 output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; 2241 } 2242 vertex "" 2243 #version 300 es 2244 ${VERTEX_DECLARATIONS} 2245 flat out mediump vec4 var; 2246 void main() 2247 { 2248 var = in0; 2249 ${VERTEX_OUTPUT} 2250 } 2251 "" 2252 fragment "" 2253 #version 300 es 2254 precision mediump float; 2255 ${FRAGMENT_DECLARATIONS} 2256 flat in vec4 var; 2257 void main() 2258 { 2259 out0 = var; 2260 ${FRAGMENT_OUTPUT} 2261 } 2262 "" 2263 end 2264 end 2265 2266 group usage "Varying usage in shaders" 2267 case readback_1 2268 version 300 es 2269 desc "read back (an already written) varying in the vertex shader" 2270 values 2271 { 2272 input float in0 = [ 1.0 | 0.0 | -2.0 | 10.0 ]; 2273 output float out0 = [ 3.0 | 0.0 | -6.0 | 30.0 ]; 2274 } 2275 vertex "" 2276 #version 300 es 2277 precision mediump float; 2278 ${VERTEX_DECLARATIONS} 2279 out float var1; 2280 out float var2; 2281 2282 void main() 2283 { 2284 var1 = in0; 2285 var2 = var1 + in0; 2286 ${VERTEX_OUTPUT} 2287 } 2288 "" 2289 fragment "" 2290 #version 300 es 2291 precision mediump float; 2292 ${FRAGMENT_DECLARATIONS} 2293 in float var1; 2294 in float var2; 2295 2296 void main() 2297 { 2298 out0 = var1 + var2; 2299 ${FRAGMENT_OUTPUT} 2300 } 2301 "" 2302 end 2303 2304 case writeback_1 2305 version 300 es 2306 desc "write back a varying in the fragment shader" 2307 values 2308 { 2309 input float in0 = [ 1.0 | 0.0 | -2.0 | 10.0 ]; 2310 } 2311 expect compile_fail 2312 vertex "" 2313 #version 300 es 2314 precision mediump float; 2315 ${VERTEX_DECLARATIONS} 2316 out float var1; 2317 out float var2; 2318 2319 void main() 2320 { 2321 var1 = in0; 2322 var2 = var1 + in0; 2323 ${VERTEX_OUTPUT} 2324 } 2325 "" 2326 fragment "" 2327 #version 300 es 2328 precision mediump float; 2329 ${FRAGMENT_DECLARATIONS} 2330 in float var1; 2331 in float var2; 2332 2333 void main() 2334 { 2335 var2 = var1; 2336 out0 = var1; 2337 ${FRAGMENT_OUTPUT} 2338 } 2339 "" 2340 end 2341 end 2342end 2343 2344group uniform "Uniform linkage" 2345 group basic "Default block uniforms of scalar and vector types" 2346 case precision_conflict_1 2347 version 300 es 2348 desc "Vertex side uniform has highp, fragment side uniform mediump." 2349 expect link_fail 2350 values {output float out0 = 3.0;} 2351 vertex "" 2352 #version 300 es 2353 ${VERTEX_DECLARATIONS} 2354 uniform highp float u_val; 2355 out mediump float res; 2356 void main() 2357 { 2358 res = u_val; 2359 ${VERTEX_OUTPUT} 2360 } 2361 "" 2362 fragment "" 2363 #version 300 es 2364 precision mediump float; 2365 uniform float u_val; 2366 ${FRAGMENT_DECLARATIONS} 2367 in mediump float res; 2368 void main() 2369 { 2370 out0 = u_val + res; 2371 ${FRAGMENT_OUTPUT} 2372 } 2373 "" 2374 end 2375 case precision_conflict_2 2376 version 300 es 2377 desc "Vertex side uniform has highp, fragment side uniform mediump." 2378 expect link_fail 2379 values {output float out0 = 3.0;} 2380 vertex "" 2381 #version 300 es 2382 ${VERTEX_DECLARATIONS} 2383 uniform highp float u_val; 2384 out mediump float res; 2385 void main() 2386 { 2387 res = u_val; 2388 ${VERTEX_OUTPUT} 2389 } 2390 "" 2391 fragment "" 2392 #version 300 es 2393 precision highp float; 2394 uniform mediump float u_val; 2395 ${FRAGMENT_DECLARATIONS} 2396 in mediump float res; 2397 void main() 2398 { 2399 out0 = u_val + res; 2400 ${FRAGMENT_OUTPUT} 2401 } 2402 "" 2403 end 2404 case precision_conflict_3 2405 version 300 es 2406 desc "Vertex side uniform has lowp, fragment side uniform highp." 2407 expect link_fail 2408 values {output float out0 = 3.0;} 2409 vertex "" 2410 #version 300 es 2411 ${VERTEX_DECLARATIONS} 2412 uniform lowp int u_val; 2413 out mediump float res; 2414 void main() 2415 { 2416 res = float(u_val); 2417 ${VERTEX_OUTPUT} 2418 } 2419 "" 2420 fragment "" 2421 #version 300 es 2422 precision highp float; 2423 uniform highp int u_val; 2424 ${FRAGMENT_DECLARATIONS} 2425 in mediump float res; 2426 void main() 2427 { 2428 out0 = float(u_val) + res; 2429 ${FRAGMENT_OUTPUT} 2430 } 2431 "" 2432 end 2433 case precision_conflict_4 2434 version 300 es 2435 desc "Vertex side uniform has lowp, fragment side uniform mediump." 2436 expect link_fail 2437 values {output float out0 = 3.0;} 2438 vertex "" 2439 #version 300 es 2440 ${VERTEX_DECLARATIONS} 2441 uniform lowp vec3 u_val; 2442 out mediump float res; 2443 void main() 2444 { 2445 res = u_val.y; 2446 ${VERTEX_OUTPUT} 2447 } 2448 "" 2449 fragment "" 2450 #version 300 es 2451 precision highp float; 2452 uniform mediump vec3 u_val; 2453 ${FRAGMENT_DECLARATIONS} 2454 in mediump float res; 2455 void main() 2456 { 2457 out0 = u_val.z + res; 2458 ${FRAGMENT_OUTPUT} 2459 } 2460 "" 2461 end 2462 end 2463 2464 group struct "Uniform structs" 2465 # Struct linkage handling 2466 case basic 2467 version 300 es 2468 desc "Same uniform struct in both shaders" 2469 values { 2470 uniform float val.a = 1.0; 2471 uniform float val.b = 2.0; 2472 output float out0 = 3.0; 2473 } 2474 vertex "" 2475 #version 300 es 2476 ${VERTEX_DECLARATIONS} 2477 struct Struct {mediump float a; mediump float b;}; 2478 uniform Struct val; 2479 out mediump float dummy; 2480 void main() 2481 { 2482 dummy = val.a + val.b; 2483 ${VERTEX_OUTPUT} 2484 } 2485 "" 2486 fragment "" 2487 #version 300 es 2488 precision mediump float; 2489 struct Struct {mediump float a; mediump float b;}; 2490 uniform Struct val; 2491 in mediump float dummy; 2492 ${FRAGMENT_DECLARATIONS} 2493 void main() 2494 { 2495 out0 = val.b + val.a; 2496 out0 = out0 + dummy; 2497 out0 = out0 - dummy; 2498 ${FRAGMENT_OUTPUT} 2499 } 2500 "" 2501 end 2502 2503 case vertex_only 2504 version 300 es 2505 desc "Uniform struct declared in both, used only in vertex." 2506 values { 2507 uniform float val.a = 1.0; 2508 uniform float val.b = 2.0; 2509 output float out0 = 3.0; 2510 } 2511 vertex "" 2512 #version 300 es 2513 ${VERTEX_DECLARATIONS} 2514 struct Struct {mediump float a; mediump float b;}; 2515 uniform Struct val; 2516 out mediump float res; 2517 void main() 2518 { 2519 res = val.a + val.b; 2520 ${VERTEX_OUTPUT} 2521 } 2522 "" 2523 fragment "" 2524 #version 300 es 2525 precision mediump float; 2526 struct Struct {mediump float a; mediump float b;}; 2527 uniform Struct val; 2528 in mediump float res; 2529 ${FRAGMENT_DECLARATIONS} 2530 void main() 2531 { 2532 out0 = res; 2533 ${FRAGMENT_OUTPUT} 2534 } 2535 "" 2536 end 2537 2538 case fragment_only 2539 version 300 es 2540 desc "Uniform struct declared in both, used only in fragment." 2541 values { 2542 uniform float val.a = 1.0; 2543 uniform float val.b = 2.0; 2544 output float out0 = 3.0; 2545 } 2546 vertex "" 2547 #version 300 es 2548 ${VERTEX_DECLARATIONS} 2549 struct Struct {mediump float a; mediump float b;}; 2550 uniform Struct val; 2551 void main() 2552 { 2553 ${VERTEX_OUTPUT} 2554 } 2555 "" 2556 fragment "" 2557 #version 300 es 2558 precision mediump float; 2559 struct Struct {mediump float a; mediump float b;}; 2560 uniform Struct val; 2561 ${FRAGMENT_DECLARATIONS} 2562 void main() 2563 { 2564 out0 = val.a + val.b; 2565 ${FRAGMENT_OUTPUT} 2566 } 2567 "" 2568 end 2569 2570 case partial 2571 version 300 es 2572 desc "Uniform struct declared in both, used partially in both." 2573 values { 2574 uniform float val.a = 1.0; 2575 uniform float val.b = 2.0; 2576 output float out0 = 3.0; 2577 } 2578 vertex "" 2579 #version 300 es 2580 ${VERTEX_DECLARATIONS} 2581 struct Struct {mediump float a; mediump float b;}; 2582 uniform Struct val; 2583 out mediump float res; 2584 void main() 2585 { 2586 res = val.a; 2587 ${VERTEX_OUTPUT} 2588 } 2589 "" 2590 fragment "" 2591 #version 300 es 2592 precision mediump float; 2593 struct Struct {mediump float a; mediump float b;}; 2594 uniform Struct val; 2595 ${FRAGMENT_DECLARATIONS} 2596 in mediump float res; 2597 void main() 2598 { 2599 out0 = res + val.b; 2600 ${FRAGMENT_OUTPUT} 2601 } 2602 "" 2603 end 2604 2605 case vec4 2606 version 300 es 2607 desc "Same uniform struct in both shaders. Datatype vec4" 2608 values { 2609 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2610 uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0); 2611 output float out0 = 3.0; 2612 } 2613 vertex "" 2614 #version 300 es 2615 ${VERTEX_DECLARATIONS} 2616 struct Struct {mediump vec4 a; mediump vec4 b;}; 2617 uniform Struct val; 2618 out mediump float dummy; 2619 void main() 2620 { 2621 dummy = val.a.x + val.b.y; 2622 ${VERTEX_OUTPUT} 2623 } 2624 "" 2625 fragment "" 2626 #version 300 es 2627 precision mediump float; 2628 struct Struct {mediump vec4 a; mediump vec4 b;}; 2629 uniform Struct val; 2630 in mediump float dummy; 2631 ${FRAGMENT_DECLARATIONS} 2632 void main() 2633 { 2634 out0 = val.b.y + val.a.x; 2635 out0 = out0 + dummy; 2636 out0 = out0 - dummy; 2637 ${FRAGMENT_OUTPUT} 2638 } 2639 "" 2640 end 2641 2642 case vertex_only_vec4 2643 version 300 es 2644 desc "Uniform struct declared in both, used only in vertex. Datatype vec4 " 2645 values { 2646 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2647 uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0); 2648 output float out0 = 3.0; 2649 } 2650 vertex "" 2651 #version 300 es 2652 ${VERTEX_DECLARATIONS} 2653 struct Struct {mediump vec4 a; mediump vec4 b;}; 2654 uniform Struct val; 2655 out mediump float res; 2656 void main() 2657 { 2658 res = val.a.x + val.b.y; 2659 ${VERTEX_OUTPUT} 2660 } 2661 "" 2662 fragment "" 2663 #version 300 es 2664 precision mediump float; 2665 struct Struct {mediump vec4 a; mediump vec4 b;}; 2666 uniform Struct val; 2667 in mediump float res; 2668 ${FRAGMENT_DECLARATIONS} 2669 void main() 2670 { out0 = res; 2671 ${FRAGMENT_OUTPUT} 2672 } 2673 "" 2674 end 2675 2676 case fragment_only_vec4 2677 version 300 es 2678 desc "Uniform struct declared in both, used only in fragment. Datatype vec4" 2679 values { 2680 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2681 uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0); 2682 output float out0 = 3.0; 2683 } 2684 vertex "" 2685 #version 300 es 2686 ${VERTEX_DECLARATIONS} 2687 struct Struct {mediump vec4 a; mediump vec4 b;}; 2688 uniform Struct val; 2689 void main() 2690 { 2691 ${VERTEX_OUTPUT} 2692 } 2693 "" 2694 fragment "" 2695 #version 300 es 2696 precision mediump float; 2697 struct Struct {mediump vec4 a; mediump vec4 b;}; 2698 uniform Struct val; 2699 ${FRAGMENT_DECLARATIONS} 2700 void main() 2701 { out0 = val.a.x + val.b.y; 2702 ${FRAGMENT_OUTPUT} 2703 } 2704 "" 2705 end 2706 2707 case partial_vec4 2708 version 300 es 2709 desc "Uniform struct declared in both, used partially in both. Datatype vec4" 2710 values { 2711 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2712 uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0); 2713 output float out0 = 3.0; 2714 } 2715 vertex "" 2716 #version 300 es 2717 ${VERTEX_DECLARATIONS} 2718 struct Struct {mediump vec4 a; mediump vec4 b;}; 2719 uniform Struct val; 2720 out mediump float res; 2721 void main() 2722 { 2723 res = val.a.x; 2724 ${VERTEX_OUTPUT} 2725 } 2726 "" 2727 fragment "" 2728 #version 300 es 2729 precision mediump float; 2730 struct Struct {mediump vec4 a; mediump vec4 b;}; 2731 uniform Struct val; 2732 ${FRAGMENT_DECLARATIONS} 2733 in mediump float res; 2734 void main() 2735 { out0 = res + val.b.y; 2736 ${FRAGMENT_OUTPUT} 2737 } 2738 "" 2739 end 2740 2741 case vec4_vec3 2742 version 300 es 2743 desc "Same uniform struct in both shaders. Datatype vec4 and vec3" 2744 values { 2745 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2746 uniform vec3 val.b = vec3(1.0, 2.0, 3.0); 2747 output float out0 = 3.0; 2748 } 2749 vertex "" 2750 #version 300 es 2751 ${VERTEX_DECLARATIONS} 2752 struct Struct {mediump vec4 a; mediump vec3 b;}; 2753 uniform Struct val; 2754 out mediump float dummy; 2755 void main() 2756 { 2757 dummy = val.a.x + val.b.y; 2758 ${VERTEX_OUTPUT} 2759 } 2760 "" 2761 fragment "" 2762 #version 300 es 2763 precision mediump float; 2764 struct Struct {mediump vec4 a; mediump vec3 b;}; 2765 uniform Struct val; 2766 in mediump float dummy; 2767 ${FRAGMENT_DECLARATIONS} 2768 void main() 2769 { out0 = val.b.y + val.a.x; 2770 out0 = out0 + dummy; 2771 out0 = out0 - dummy; 2772 ${FRAGMENT_OUTPUT} 2773 } 2774 "" 2775 end 2776 2777 case vertex_only_vec4_vec3 2778 version 300 es 2779 desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and vec3" 2780 values { 2781 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2782 uniform vec3 val.b = vec3(1.0, 2.0, 3.0); 2783 output float out0 = 3.0; 2784 } 2785 vertex "" 2786 #version 300 es 2787 ${VERTEX_DECLARATIONS} 2788 struct Struct {mediump vec4 a; mediump vec3 b;}; 2789 uniform Struct val; 2790 out mediump float res; 2791 void main() 2792 { 2793 res = val.a.x + val.b.y; 2794 ${VERTEX_OUTPUT} 2795 } 2796 "" 2797 fragment "" 2798 #version 300 es 2799 precision mediump float; 2800 struct Struct {mediump vec4 a; mediump vec3 b;}; 2801 uniform Struct val; 2802 in mediump float res; 2803 ${FRAGMENT_DECLARATIONS} 2804 void main() 2805 { out0 = res; 2806 ${FRAGMENT_OUTPUT} 2807 } 2808 "" 2809 end 2810 2811 case fragment_only_vec4_vec3 2812 version 300 es 2813 desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and vec3" 2814 values { 2815 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2816 uniform vec3 val.b = vec3(1.0, 2.0, 3.0); 2817 output float out0 = 3.0; 2818 } 2819 vertex "" 2820 #version 300 es 2821 ${VERTEX_DECLARATIONS} 2822 struct Struct {mediump vec4 a; mediump vec3 b;}; 2823 uniform Struct val; 2824 void main() 2825 { 2826 ${VERTEX_OUTPUT} 2827 } 2828 "" 2829 fragment "" 2830 #version 300 es 2831 precision mediump float; 2832 struct Struct {mediump vec4 a; mediump vec3 b;}; 2833 uniform Struct val; 2834 ${FRAGMENT_DECLARATIONS} 2835 void main() 2836 { out0 = val.a.x + val.b.y; 2837 ${FRAGMENT_OUTPUT} 2838 } 2839 "" 2840 end 2841 2842 case partial_vec4_vec3 2843 version 300 es 2844 desc "Uniform struct declared in both, used partially in both. Datatype vec4 and vec3" 2845 values { 2846 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2847 uniform vec3 val.b = vec3(1.0, 2.0, 3.0); 2848 output float out0 = 3.0; 2849 } 2850 vertex "" 2851 #version 300 es 2852 ${VERTEX_DECLARATIONS} 2853 struct Struct {mediump vec4 a; mediump vec3 b;}; 2854 uniform Struct val; 2855 out mediump float res; 2856 void main() 2857 { 2858 res = val.a.x; 2859 ${VERTEX_OUTPUT} 2860 } 2861 "" 2862 fragment "" 2863 #version 300 es 2864 precision mediump float; 2865 struct Struct {mediump vec4 a; mediump vec3 b;}; 2866 uniform Struct val; 2867 ${FRAGMENT_DECLARATIONS} 2868 in mediump float res; 2869 void main() 2870 { out0 = res + val.b.y; 2871 ${FRAGMENT_OUTPUT} 2872 } 2873 "" 2874 end 2875 2876 case vec4_float 2877 version 300 es 2878 desc "Same uniform struct in both shaders. Datatype vec4 and float" 2879 values { 2880 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2881 uniform float val.b = 2.0; 2882 output float out0 = 3.0; 2883 } 2884 vertex "" 2885 #version 300 es 2886 ${VERTEX_DECLARATIONS} 2887 struct Struct {mediump vec4 a; mediump float b;}; 2888 uniform Struct val; 2889 out mediump float dummy; 2890 void main() 2891 { 2892 dummy = val.a.x + val.b; 2893 ${VERTEX_OUTPUT} 2894 } 2895 "" 2896 fragment "" 2897 #version 300 es 2898 precision mediump float; 2899 struct Struct {mediump vec4 a; mediump float b;}; 2900 uniform Struct val; 2901 in mediump float dummy; 2902 ${FRAGMENT_DECLARATIONS} 2903 void main() 2904 { out0 = val.b + val.a.x; 2905 out0 = out0 + dummy; 2906 out0 = out0 - dummy; 2907 ${FRAGMENT_OUTPUT} 2908 } 2909 "" 2910 end 2911 2912 case vertex_only_vec4_float 2913 version 300 es 2914 desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and float" 2915 values { 2916 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2917 uniform float val.b = 2.0; 2918 output float out0 = 3.0; 2919 } 2920 vertex "" 2921 #version 300 es 2922 ${VERTEX_DECLARATIONS} 2923 struct Struct {mediump vec4 a; mediump float b;}; 2924 uniform Struct val; 2925 out mediump float res; 2926 void main() 2927 { 2928 res = val.a.x + val.b; 2929 ${VERTEX_OUTPUT} 2930 } 2931 "" 2932 fragment "" 2933 #version 300 es 2934 precision mediump float; 2935 struct Struct {mediump vec4 a; mediump float b;}; 2936 uniform Struct val; 2937 in mediump float res; 2938 ${FRAGMENT_DECLARATIONS} 2939 void main() 2940 { out0 = res; 2941 ${FRAGMENT_OUTPUT} 2942 } 2943 "" 2944 end 2945 2946 case fragment_only_vec4_float 2947 version 300 es 2948 desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and float" 2949 values { 2950 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2951 uniform float val.b = 2.0; 2952 output float out0 = 3.0; 2953 } 2954 vertex "" 2955 #version 300 es 2956 ${VERTEX_DECLARATIONS} 2957 struct Struct {mediump vec4 a; mediump float b;}; 2958 uniform Struct val; 2959 void main() 2960 { 2961 ${VERTEX_OUTPUT} 2962 } 2963 "" 2964 fragment "" 2965 #version 300 es 2966 precision mediump float; 2967 struct Struct {mediump vec4 a; mediump float b;}; 2968 uniform Struct val; 2969 ${FRAGMENT_DECLARATIONS} 2970 void main() 2971 { out0 = val.a.x + val.b; 2972 ${FRAGMENT_OUTPUT} 2973 } 2974 "" 2975 end 2976 2977 case partial_vec4_float 2978 version 300 es 2979 desc "Uniform struct declared in both, used partially in both. Datatype vec4 and float" 2980 values { 2981 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 2982 uniform float val.b = 2.0; 2983 output float out0 = 3.0; 2984 } 2985 vertex "" 2986 #version 300 es 2987 ${VERTEX_DECLARATIONS} 2988 struct Struct {mediump vec4 a; mediump float b;}; 2989 uniform Struct val; 2990 out mediump float res; 2991 void main() 2992 { 2993 res = val.a.x; 2994 ${VERTEX_OUTPUT} 2995 } 2996 "" 2997 fragment "" 2998 #version 300 es 2999 precision mediump float; 3000 struct Struct {mediump vec4 a; mediump float b;}; 3001 uniform Struct val; 3002 ${FRAGMENT_DECLARATIONS} 3003 in mediump float res; 3004 void main() 3005 { out0 = res + val.b; 3006 ${FRAGMENT_OUTPUT} 3007 } 3008 "" 3009 end 3010 3011 case partial_vec4_struct 3012 version 300 es 3013 desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec4" 3014 values { 3015 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 3016 uniform vec4 val.b.c = vec4(1.0, 2.0, 3.0, 4.0); 3017 output float out0 = 3.0; 3018 } 3019 vertex "" 3020 #version 300 es 3021 ${VERTEX_DECLARATIONS} 3022 struct Inner {mediump vec4 c;}; 3023 struct Struct {mediump vec4 a; Inner b;}; 3024 uniform Struct val; 3025 out mediump float res; 3026 void main() 3027 { 3028 res = val.a.x; 3029 ${VERTEX_OUTPUT} 3030 } 3031 "" 3032 fragment "" 3033 #version 300 es 3034 precision mediump float; 3035 struct Inner {mediump vec4 c;}; 3036 struct Struct {mediump vec4 a; Inner b;}; 3037 uniform Struct val; 3038 ${FRAGMENT_DECLARATIONS} 3039 in mediump float res; 3040 void main() 3041 { out0 = res + val.b.c.y; 3042 ${FRAGMENT_OUTPUT} 3043 } 3044 "" 3045 end 3046 3047 case partial_vec4_vec3_struct 3048 version 300 es 3049 desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec3" 3050 values { 3051 uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0); 3052 uniform vec3 val.b.c = vec3(1.0, 2.0, 3.0); 3053 output float out0 = 3.0; 3054 } 3055 vertex "" 3056 #version 300 es 3057 ${VERTEX_DECLARATIONS} 3058 struct Inner {mediump vec3 c;}; 3059 struct Struct {mediump vec4 a; Inner b;}; 3060 uniform Struct val; 3061 out mediump float res; 3062 void main() 3063 { 3064 res = val.a.x; 3065 ${VERTEX_OUTPUT} 3066 } 3067 "" 3068 fragment "" 3069 #version 300 es 3070 precision mediump float; 3071 struct Inner {mediump vec3 c;}; 3072 struct Struct {mediump vec4 a; Inner b;}; 3073 uniform Struct val; 3074 ${FRAGMENT_DECLARATIONS} 3075 in mediump float res; 3076 void main() 3077 { out0 = res + val.b.c.y; 3078 ${FRAGMENT_OUTPUT} 3079 } 3080 "" 3081 end 3082 3083 case partial_vec2_vec3 3084 version 300 es 3085 desc "Uniform struct declared in both, used partially in both. Datatype vec2 and vec3" 3086 values { 3087 uniform vec2 val.a = vec2(1.0, 2.0); 3088 uniform vec3 val.b = vec3(1.0, 2.0, 3.0); 3089 output float out0 = 3.0; 3090 } 3091 vertex "" 3092 #version 300 es 3093 ${VERTEX_DECLARATIONS} 3094 struct Struct {mediump vec2 a; mediump vec3 b;}; 3095 uniform Struct val; 3096 out mediump float res; 3097 void main() 3098 { 3099 res = val.a.x; 3100 ${VERTEX_OUTPUT} 3101 } 3102 "" 3103 fragment "" 3104 #version 300 es 3105 precision mediump float; 3106 struct Struct {mediump vec2 a; mediump vec3 b;}; 3107 uniform Struct val; 3108 ${FRAGMENT_DECLARATIONS} 3109 in mediump float res; 3110 void main() 3111 { out0 = res + val.b.y; 3112 ${FRAGMENT_OUTPUT} 3113 } 3114 "" 3115 end 3116 3117 case partial_vec2_int 3118 version 300 es 3119 desc "Uniform struct declared in both, used partially in both. Datatype vec2 and int" 3120 values { 3121 uniform vec2 val.a = vec2(1.0, 2.0); 3122 uniform int val.b = 2; 3123 output float out0 = 3.0; 3124 } 3125 vertex "" 3126 #version 300 es 3127 ${VERTEX_DECLARATIONS} 3128 struct Struct {mediump vec2 a; mediump int b;}; 3129 uniform Struct val; 3130 out mediump float res; 3131 void main() 3132 { 3133 res = val.a.x; 3134 ${VERTEX_OUTPUT} 3135 } 3136 "" 3137 fragment "" 3138 #version 300 es 3139 precision mediump float; 3140 struct Struct {mediump vec2 a; mediump int b;}; 3141 uniform Struct val; 3142 ${FRAGMENT_DECLARATIONS} 3143 in mediump float res; 3144 void main() 3145 { out0 = res + float(val.b); 3146 ${FRAGMENT_OUTPUT} 3147 } 3148 "" 3149 end 3150 3151 case partial_int_float 3152 version 300 es 3153 desc "Uniform struct declared in both, used partially in both. Datatype int and float" 3154 values { 3155 uniform float val.a = 1.0; 3156 uniform int val.b = 2; 3157 output float out0 = 3.0; 3158 } 3159 vertex "" 3160 #version 300 es 3161 ${VERTEX_DECLARATIONS} 3162 struct Struct {mediump float a; mediump int b;}; 3163 uniform Struct val; 3164 out mediump float res; 3165 void main() 3166 { 3167 res = val.a; 3168 ${VERTEX_OUTPUT} 3169 } 3170 "" 3171 fragment "" 3172 #version 300 es 3173 precision mediump float; 3174 struct Struct {mediump float a; mediump int b;}; 3175 uniform Struct val; 3176 ${FRAGMENT_DECLARATIONS} 3177 in mediump float res; 3178 void main() 3179 { out0 = res + float(val.b); 3180 ${FRAGMENT_OUTPUT} 3181 } 3182 "" 3183 end 3184 3185 case partial_bvec2_vec2 3186 version 300 es 3187 desc "Uniform struct declared in both, used partially in both. Datatype bvec2 and vec2" 3188 values { 3189 uniform bvec2 val.a = bvec2(true, true); 3190 uniform vec2 val.b = vec2(1.0, 2.0); 3191 output float out0 = 3.0; 3192 } 3193 vertex "" 3194 #version 300 es 3195 ${VERTEX_DECLARATIONS} 3196 struct Struct {bvec2 a; mediump vec2 b;}; 3197 uniform Struct val; 3198 out mediump float res; 3199 void main() 3200 { 3201 res = float(val.a.x); 3202 ${VERTEX_OUTPUT} 3203 } 3204 "" 3205 fragment "" 3206 #version 300 es 3207 precision mediump float; 3208 struct Struct {bvec2 a; mediump vec2 b;}; 3209 uniform Struct val; 3210 ${FRAGMENT_DECLARATIONS} 3211 in mediump float res; 3212 void main() 3213 { out0 = res + val.b.y; 3214 ${FRAGMENT_OUTPUT} 3215 } 3216 "" 3217 end 3218 3219 case partial_ivec2_vec2 3220 version 300 es 3221 desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and vec2" 3222 values { 3223 uniform ivec2 val.a = ivec2(1, 2); 3224 uniform vec2 val.b = vec2(1.0, 2.0); 3225 output float out0 = 3.0; 3226 } 3227 vertex "" 3228 #version 300 es 3229 ${VERTEX_DECLARATIONS} 3230 struct Struct {mediump ivec2 a; mediump vec2 b;}; 3231 uniform Struct val; 3232 out mediump float res; 3233 void main() 3234 { 3235 res = vec2(val.a).x; 3236 ${VERTEX_OUTPUT} 3237 } 3238 "" 3239 fragment "" 3240 #version 300 es 3241 precision mediump float; 3242 struct Struct {mediump ivec2 a; mediump vec2 b;}; 3243 uniform Struct val; 3244 ${FRAGMENT_DECLARATIONS} 3245 in mediump float res; 3246 void main() 3247 { out0 = res + val.b.y; 3248 ${FRAGMENT_OUTPUT} 3249 } 3250 "" 3251 end 3252 3253 case partial_ivec2_ivec2 3254 version 300 es 3255 desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and ivec2" 3256 values { 3257 uniform ivec2 val.a = ivec2(1, 2); 3258 uniform ivec2 val.b = ivec2(1, 2); 3259 output float out0 = 3.0; 3260 } 3261 vertex "" 3262 #version 300 es 3263 ${VERTEX_DECLARATIONS} 3264 struct Struct {mediump ivec2 a; mediump ivec2 b;}; 3265 uniform Struct val; 3266 out mediump float res; 3267 void main() 3268 { 3269 res = vec2(val.a).x; 3270 ${VERTEX_OUTPUT} 3271 } 3272 "" 3273 fragment "" 3274 #version 300 es 3275 precision mediump float; 3276 struct Struct {mediump ivec2 a; mediump ivec2 b;}; 3277 uniform Struct val; 3278 ${FRAGMENT_DECLARATIONS} 3279 in mediump float res; 3280 void main() 3281 { out0 = res + vec2(val.b).y; 3282 ${FRAGMENT_OUTPUT} 3283 } 3284 "" 3285 end 3286 3287 case type_conflict_1 3288 version 300 es 3289 desc "Fragment struct has one less member than fragment version" 3290 expect link_fail 3291 values {output float out0 = 3.0;} 3292 vertex "" 3293 #version 300 es 3294 ${VERTEX_DECLARATIONS} 3295 struct Struct {mediump float a; mediump float b;}; 3296 uniform Struct val; 3297 out mediump float res; 3298 void main() 3299 { 3300 res = val.a; 3301 ${VERTEX_OUTPUT} 3302 } 3303 "" 3304 fragment "" 3305 #version 300 es 3306 precision mediump float; 3307 struct Struct {mediump float a;}; 3308 uniform Struct val; 3309 ${FRAGMENT_DECLARATIONS} 3310 in mediump float res; 3311 void main() 3312 { out0 = res + val.a; 3313 ${FRAGMENT_OUTPUT} 3314 } 3315 "" 3316 end 3317 3318 case type_conflict_2 3319 version 300 es 3320 desc "Vertex struct has int, fragment struct has float." 3321 expect link_fail 3322 values {output float out0 = 3.0;} 3323 vertex "" 3324 #version 300 es 3325 ${VERTEX_DECLARATIONS} 3326 struct Struct {mediump int a;}; 3327 uniform Struct val; 3328 out mediump float res; 3329 void main() 3330 { 3331 res = float(val.a); 3332 ${VERTEX_OUTPUT} 3333 } 3334 "" 3335 fragment "" 3336 #version 300 es 3337 precision mediump float; 3338 struct Struct {mediump float a;}; 3339 uniform Struct val; 3340 ${FRAGMENT_DECLARATIONS} 3341 in mediump float res; 3342 void main() 3343 { out0 = val.a; 3344 ${FRAGMENT_OUTPUT} 3345 } 3346 "" 3347 end 3348 3349 case type_conflict_3 3350 version 300 es 3351 desc "Vertex struct has vec3, fragment struct has vec4." 3352 expect link_fail 3353 values {output float out0 = 3.0;} 3354 vertex "" 3355 #version 300 es 3356 ${VERTEX_DECLARATIONS} 3357 struct Struct {mediump vec3 a;}; 3358 uniform Struct val; 3359 out mediump float res; 3360 void main() 3361 { 3362 res = float(val.a.x); 3363 ${VERTEX_OUTPUT} 3364 } 3365 "" 3366 fragment "" 3367 #version 300 es 3368 precision mediump float; 3369 struct Struct {mediump vec4 a;}; 3370 uniform Struct val; 3371 ${FRAGMENT_DECLARATIONS} 3372 in mediump float res; 3373 void main() 3374 { out0 = val.a.x; 3375 ${FRAGMENT_OUTPUT} 3376 } 3377 "" 3378 end 3379 3380 case precision_conflict_1 3381 version 300 es 3382 desc "Vertex side struct has highp, fragment side struct mediump." 3383 expect link_fail 3384 values {output float out0 = 3.0;} 3385 vertex "" 3386 #version 300 es 3387 ${VERTEX_DECLARATIONS} 3388 struct Struct {highp float a;}; 3389 uniform Struct val; 3390 out mediump float res; 3391 void main() 3392 { 3393 res = val.a; 3394 ${VERTEX_OUTPUT} 3395 } 3396 "" 3397 fragment "" 3398 #version 300 es 3399 precision mediump float; 3400 struct Struct {mediump float a;}; 3401 uniform Struct val; 3402 ${FRAGMENT_DECLARATIONS} 3403 in mediump float res; 3404 void main() 3405 { out0 = val.a; 3406 ${FRAGMENT_OUTPUT} 3407 } 3408 "" 3409 end 3410 3411 case precision_conflict_2 3412 version 300 es 3413 desc "Vertex side struct has mediump, fragment side struct lowp." 3414 expect link_fail 3415 values {output float out0 = 3.0;} 3416 vertex "" 3417 #version 300 es 3418 ${VERTEX_DECLARATIONS} 3419 struct Struct {mediump float a;}; 3420 uniform Struct val; 3421 out mediump float res; 3422 void main() 3423 { 3424 res = val.a; 3425 ${VERTEX_OUTPUT} 3426 } 3427 "" 3428 fragment "" 3429 #version 300 es 3430 precision mediump float; 3431 struct Struct {lowp float a;}; 3432 uniform Struct val; 3433 ${FRAGMENT_DECLARATIONS} 3434 in mediump float res; 3435 void main() 3436 { out0 = val.a; 3437 ${FRAGMENT_OUTPUT} 3438 } 3439 "" 3440 end 3441 3442 case precision_conflict_3 3443 version 300 es 3444 desc "Vertex side struct has lowp, fragment side struct mediump." 3445 expect link_fail 3446 values {output float out0 = 3.0;} 3447 vertex "" 3448 #version 300 es 3449 ${VERTEX_DECLARATIONS} 3450 struct Struct {lowp float a;}; 3451 uniform Struct val; 3452 out mediump float res; 3453 void main() 3454 { 3455 res = val.a; 3456 ${VERTEX_OUTPUT} 3457 } 3458 "" 3459 fragment "" 3460 #version 300 es 3461 precision mediump float; 3462 struct Struct {mediump float a;}; 3463 uniform Struct val; 3464 ${FRAGMENT_DECLARATIONS} 3465 in mediump float res; 3466 void main() 3467 { out0 = val.a; 3468 ${FRAGMENT_OUTPUT} 3469 } 3470 "" 3471 end 3472 3473 case precision_conflict_4 3474 version 300 es 3475 desc "Vertex side struct has lowp, fragment side struct implicit mediump." 3476 expect link_fail 3477 values {output float out0 = 3.0;} 3478 vertex "" 3479 #version 300 es 3480 ${VERTEX_DECLARATIONS} 3481 struct Struct {lowp float a;}; 3482 uniform Struct val; 3483 out mediump float res; 3484 void main() 3485 { 3486 res = val.a; 3487 ${VERTEX_OUTPUT} 3488 } 3489 "" 3490 fragment "" 3491 #version 300 es 3492 precision mediump float; 3493 struct Struct {float a;}; 3494 uniform Struct val; 3495 ${FRAGMENT_DECLARATIONS} 3496 in mediump float res; 3497 void main() 3498 { out0 = val.a; 3499 ${FRAGMENT_OUTPUT} 3500 } 3501 "" 3502 end 3503 3504 case light_struct_highp 3505 version 300 es 3506 desc "Complex Light struct from use case tests." 3507 values { 3508 uniform float val.constantAttenuation = 1.0; 3509 uniform float val.quadraticAttenuation = 1.0; 3510 output float out0 = 2.0; 3511 } 3512 vertex "" 3513 #version 300 es 3514 struct Light 3515 { 3516 mediump vec3 color; 3517 highp vec4 position; 3518 highp vec3 direction; 3519 mediump float constantAttenuation; 3520 mediump float linearAttenuation; 3521 mediump float quadraticAttenuation; 3522 }; 3523 ${VERTEX_DECLARATIONS} 3524 uniform Light val; 3525 out mediump float res; 3526 void main() 3527 { 3528 res = val.constantAttenuation; 3529 ${VERTEX_OUTPUT} 3530 } 3531 "" 3532 fragment "" 3533 #version 300 es 3534 precision mediump float; 3535 struct Light 3536 { 3537 mediump vec3 color; 3538 highp vec4 position; 3539 highp vec3 direction; 3540 mediump float constantAttenuation; 3541 mediump float linearAttenuation; 3542 mediump float quadraticAttenuation; 3543 }; 3544 struct Struct {float a;}; 3545 uniform Light val; 3546 ${FRAGMENT_DECLARATIONS} 3547 in mediump float res; 3548 void main() 3549 { 3550 out0 = res + val.quadraticAttenuation; 3551 ${FRAGMENT_OUTPUT} 3552 } 3553 "" 3554 end 3555 3556 case light_struct_mediump 3557 version 300 es 3558 desc "Complex Light struct from use case tests, without highp usage" 3559 values { 3560 uniform float val.constantAttenuation = 1.0; 3561 uniform float val.quadraticAttenuation = 1.0; 3562 output float out0 = 2.0; 3563 } 3564 vertex "" 3565 #version 300 es 3566 struct Light 3567 { 3568 mediump vec3 color; 3569 mediump vec4 position; 3570 mediump vec3 direction; 3571 mediump float constantAttenuation; 3572 mediump float linearAttenuation; 3573 mediump float quadraticAttenuation; 3574 }; 3575 ${VERTEX_DECLARATIONS} 3576 uniform Light val; 3577 out mediump float res; 3578 void main() 3579 { 3580 res = val.constantAttenuation; 3581 ${VERTEX_OUTPUT} 3582 } 3583 "" 3584 fragment "" 3585 #version 300 es 3586 precision mediump float; 3587 struct Light 3588 { 3589 mediump vec3 color; 3590 mediump vec4 position; 3591 mediump vec3 direction; 3592 mediump float constantAttenuation; 3593 mediump float linearAttenuation; 3594 mediump float quadraticAttenuation; 3595 }; 3596 struct Struct {float a;}; 3597 uniform Light val; 3598 ${FRAGMENT_DECLARATIONS} 3599 in mediump float res; 3600 void main() 3601 { 3602 out0 = res + val.quadraticAttenuation; 3603 ${FRAGMENT_OUTPUT} 3604 } 3605 "" 3606 end 3607 end 3608 3609 group block "Uniform blocks" 3610 case type_mismatch 3611 version 300 es 3612 expect link_fail 3613 vertex "" 3614 #version 300 es 3615 3616 uniform Block 3617 { 3618 highp vec4 val; 3619 }; 3620 3621 ${VERTEX_DECLARATIONS} 3622 out mediump float res; 3623 void main() 3624 { 3625 res = val.x; 3626 ${VERTEX_OUTPUT} 3627 } 3628 "" 3629 fragment "" 3630 #version 300 es 3631 3632 uniform Block 3633 { 3634 highp vec3 val; 3635 }; 3636 3637 precision mediump float; 3638 ${FRAGMENT_DECLARATIONS} 3639 in mediump float res; 3640 void main() 3641 { 3642 dEQP_FragColor = vec4(val, 1.0); 3643 } 3644 "" 3645 end 3646 3647 case members_mismatch 3648 version 300 es 3649 expect link_fail 3650 vertex "" 3651 #version 300 es 3652 3653 uniform Block 3654 { 3655 highp vec4 val; 3656 }; 3657 3658 ${VERTEX_DECLARATIONS} 3659 out mediump float res; 3660 void main() 3661 { 3662 res = val.x; 3663 ${VERTEX_OUTPUT} 3664 } 3665 "" 3666 fragment "" 3667 #version 300 es 3668 3669 uniform Block 3670 { 3671 highp vec4 val; 3672 lowp uint u; 3673 }; 3674 3675 precision mediump float; 3676 ${FRAGMENT_DECLARATIONS} 3677 in mediump float res; 3678 void main() 3679 { 3680 dEQP_FragColor = vec4(val); 3681 } 3682 "" 3683 end 3684 3685 case layout_qualifier_mismatch_1 3686 version 300 es 3687 expect link_fail 3688 vertex "" 3689 #version 300 es 3690 3691 layout(std140) uniform Block 3692 { 3693 highp vec4 val; 3694 }; 3695 3696 ${VERTEX_DECLARATIONS} 3697 out mediump float res; 3698 void main() 3699 { 3700 res = val.x; 3701 ${VERTEX_OUTPUT} 3702 } 3703 "" 3704 fragment "" 3705 #version 300 es 3706 3707 uniform Block 3708 { 3709 highp vec4 val; 3710 }; 3711 3712 precision mediump float; 3713 ${FRAGMENT_DECLARATIONS} 3714 in mediump float res; 3715 void main() 3716 { 3717 dEQP_FragColor = vec4(val); 3718 } 3719 "" 3720 end 3721 3722 case layout_qualifier_mismatch_2 3723 version 300 es 3724 expect link_fail 3725 vertex "" 3726 #version 300 es 3727 3728 layout(shared) uniform Block 3729 { 3730 highp vec4 val; 3731 }; 3732 3733 ${VERTEX_DECLARATIONS} 3734 out mediump float res; 3735 void main() 3736 { 3737 res = val.x; 3738 ${VERTEX_OUTPUT} 3739 } 3740 "" 3741 fragment "" 3742 #version 300 es 3743 3744 layout(packed) uniform Block 3745 { 3746 highp vec4 val; 3747 }; 3748 3749 precision mediump float; 3750 ${FRAGMENT_DECLARATIONS} 3751 in mediump float res; 3752 void main() 3753 { 3754 dEQP_FragColor = vec4(val); 3755 } 3756 "" 3757 end 3758 3759 case layout_qualifier_mismatch_3 3760 version 300 es 3761 expect link_fail 3762 vertex "" 3763 #version 300 es 3764 3765 layout(row_major) uniform Block 3766 { 3767 highp vec4 val; 3768 }; 3769 3770 ${VERTEX_DECLARATIONS} 3771 out mediump float res; 3772 void main() 3773 { 3774 res = val.x; 3775 ${VERTEX_OUTPUT} 3776 } 3777 "" 3778 fragment "" 3779 #version 300 es 3780 3781 layout(column_major) uniform Block 3782 { 3783 highp vec4 val; 3784 }; 3785 3786 precision mediump float; 3787 ${FRAGMENT_DECLARATIONS} 3788 in mediump float res; 3789 void main() 3790 { 3791 dEQP_FragColor = vec4(val); 3792 } 3793 "" 3794 end 3795 3796 case layout_qualifier_mismatch_4 3797 version 300 es 3798 expect link_fail 3799 vertex "" 3800 #version 300 es 3801 3802 layout(row_major) uniform Block 3803 { 3804 highp mat3 val; 3805 }; 3806 3807 ${VERTEX_DECLARATIONS} 3808 out mediump float res; 3809 void main() 3810 { 3811 res = val[0][1]; 3812 ${VERTEX_OUTPUT} 3813 } 3814 "" 3815 fragment "" 3816 #version 300 es 3817 3818 layout(column_major) uniform Block 3819 { 3820 highp mat3 val; 3821 }; 3822 3823 precision mediump float; 3824 ${FRAGMENT_DECLARATIONS} 3825 in mediump float res; 3826 void main() 3827 { 3828 dEQP_FragColor = vec4(val[2], 1.0); 3829 } 3830 "" 3831 end 3832 3833 case layout_qualifier_mismatch_5 3834 version 300 es 3835 expect link_fail 3836 vertex "" 3837 #version 300 es 3838 3839 uniform Block 3840 { 3841 layout(row_major) uniform highp mat3 val; 3842 }; 3843 3844 ${VERTEX_DECLARATIONS} 3845 out mediump float res; 3846 void main() 3847 { 3848 res = val[0][1]; 3849 ${VERTEX_OUTPUT} 3850 } 3851 "" 3852 fragment "" 3853 #version 300 es 3854 3855 uniform Block 3856 { 3857 layout(column_major) uniform highp mat3 val; 3858 }; 3859 3860 precision mediump float; 3861 ${FRAGMENT_DECLARATIONS} 3862 in mediump float res; 3863 void main() 3864 { 3865 dEQP_FragColor = vec4(val[2], 1.0); 3866 } 3867 "" 3868 end 3869 end 3870end 3871