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