1#X1. Type: float[5] // An array type with 5 elements 2#X2. Return value: float[5] func() { ... } // Function with a 5-element array return value 3#X3. Array constructor: float[3] (1.0, 2.0, 5.5) // 3-element array with given elements 4# // Fails with array of matrices! 5#X4. As unnamed parameter: void func(float[5]); 6#X5. Variable declaration: float[5] a; // Equivalent to float a[5]; (?) 7#X6. Empty brackets: float x[] = float[] (1.0, 2.0, 3.0); // Size of x is 3 8# float y[] = float[3] (1.0, 2.0, 3.0); // Size of y is 3 (equivalent) 9# float z[] = y; // Size of z is 3 10#X7. Testing that 2-dimensional arrays don't work: float a[5][3]; // Illegal 11# float[5] a[3]; // Illegal 12#X8. Testing that array declaration with dynamic variables as array size won't work. 13#X9. Testing length() operator: z.length(); // Returns 3 for z defined before 14#X10. Test C/C++ style {}-constructor 15#X11. Test struct arrays 16#X12. Test array element access at initialization with const/dynamic values 17 18group constructor "Array constructors" 19 20 case float3 21 version 330 22 values 23 { 24 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ]; 25 output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ]; 26 } 27 28 both "" 29 #version 330 30 precision mediump float; 31 ${DECLARATIONS} 32 33 void main() 34 { 35 ${SETUP} 36 float[3] x; 37 x = float[3] (in0.z, in0.x, in0.y); 38 out0 = vec3(x[0], x[1], x[2]); 39 ${OUTPUT} 40 } 41 "" 42 end 43 44 case float4 45 version 330 46 values 47 { 48 input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 0.2) | vec4(7.4, -1.0, 2.0, -1.3) | vec4(3.0, 1.6, -2.0, 0.5) ]; 49 output vec4 out0 = [ vec4(2.0, 0.5, 0.2, 1.0) | vec4(2.0, 7.4, -1.3, -1.0) | vec4(-2.0, 3.0, 0.5, 1.6) ]; 50 } 51 52 both "" 53 #version 330 54 precision mediump float; 55 ${DECLARATIONS} 56 57 void main() 58 { 59 ${SETUP} 60 float[4] x; 61 x = float[4] (in0.z, in0.x, in0.w, in0.y); 62 out0 = vec4(x[0], x[1], x[2], x[3]); 63 ${OUTPUT} 64 } 65 "" 66 end 67 68 case int3 69 version 330 70 values 71 { 72 input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ]; 73 output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ]; 74 } 75 76 both "" 77 #version 330 78 precision mediump int; 79 precision mediump float; 80 ${DECLARATIONS} 81 82 void main() 83 { 84 ${SETUP} 85 int[3] x; 86 x = int[3] (in0.z, in0.x, in0.y); 87 out0 = ivec3(x[0], x[1], x[2]); 88 ${OUTPUT} 89 } 90 "" 91 end 92 93 case int4 94 version 330 95 values 96 { 97 input ivec4 in0 = [ ivec4(0, 1, 2, 0) | ivec4(7, -1, 2, -1) | ivec4(3, 1, -2, 0) ]; 98 output ivec4 out0 = [ ivec4(2, 0, 0, 1) | ivec4(2, 7, -1, -1) | ivec4(-2, 3, 0, 1) ]; 99 } 100 101 both "" 102 #version 330 103 precision mediump int; 104 precision mediump float; 105 ${DECLARATIONS} 106 107 void main() 108 { 109 ${SETUP} 110 int[4] x; 111 x = int[4] (in0.z, in0.x, in0.w, in0.y); 112 out0 = ivec4(x[0], x[1], x[2], x[3]); 113 ${OUTPUT} 114 } 115 "" 116 end 117 118 case bool3 119 version 330 120 values 121 { 122 input bvec3 in0 = [ bvec3(true, true, false) ]; 123 output bvec3 out0 = [ bvec3(false, true, true) ]; 124 } 125 126 both "" 127 #version 330 128 precision mediump float; 129 ${DECLARATIONS} 130 131 void main() 132 { 133 ${SETUP} 134 bool[3] x; 135 x = bool[3] (in0.z, in0.x, in0.y); 136 out0 = bvec3(x[0], x[1], x[2]); 137 ${OUTPUT} 138 } 139 "" 140 end 141 142 case bool4 143 version 330 144 values 145 { 146 input bvec4 in0 = [ bvec4(true, true, false, false) ]; 147 output bvec4 out0 = [ bvec4(false, true, true, false) ]; 148 } 149 150 both "" 151 #version 330 152 precision mediump float; 153 ${DECLARATIONS} 154 155 void main() 156 { 157 ${SETUP} 158 bool[4] x; 159 x = bool[4] (in0.z, in0.x, in0.y, in0.w); 160 out0 = bvec4(x[0], x[1], x[2], x[3]); 161 ${OUTPUT} 162 } 163 "" 164 end 165 166 case struct3 167 version 330 168 values 169 { 170 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 171 output vec3 out0 = [ vec3(2.0, -0.5, -1.0) ]; 172 } 173 174 both "" 175 #version 330 176 precision mediump float; 177 ${DECLARATIONS} 178 179 180 181 void main() 182 { 183 ${SETUP} 184 185 struct test 186 { 187 float f; 188 vec3 v; 189 }; 190 191 test a = test(in0.z, vec3(in0.x, in0.y, in0.z)); 192 test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y)); 193 test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x)); 194 195 test[3] x = test[3] (a, b, c); 196 197 out0 = vec3(x[0].f, x[1].v.y, x[2].v.x); 198 ${OUTPUT} 199 } 200 "" 201 end 202 203 case struct4 204 version 330 205 values 206 { 207 input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 1.5) ]; 208 output vec4 out0 = [ vec4(2.0, -0.5, -1.0, -1.5) ]; 209 } 210 211 both "" 212 #version 330 213 precision mediump float; 214 ${DECLARATIONS} 215 216 217 void main() 218 { 219 ${SETUP} 220 221 222 struct test 223 { 224 float f; 225 vec3 v; 226 }; 227 228 test a = test(in0.z, vec3(in0.x, in0.y, in0.z)); 229 test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y)); 230 test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x)); 231 test d = test(-in0.w, vec3(-in0.w, -in0.x, -in0.z)); 232 233 test[4] x = test[4] (a, b, c, d); 234 235 out0 = vec4(x[0].f, x[1].v.y, x[2].v.x, x[3].v.x); 236 ${OUTPUT} 237 } 238 "" 239 end 240 241 242 case float_vec3 243 version 330 244 values 245 { 246 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ]; 247 output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(7.4, -2.0, -1.0) | vec3(3.0, 2.0, 1.6) ]; 248 } 249 250 both "" 251 #version 330 252 precision mediump float; 253 ${DECLARATIONS} 254 255 void main() 256 { 257 ${SETUP} 258 259 vec3[3] x; 260 x = vec3[3] ( vec3(in0.x, in0.y, in0.z) , 261 vec3(-in0.y, -in0.z, -in0.x), 262 vec3(in0.z, in0.x, in0.y) ); 263 out0 = vec3(x[0].x, x[1].y, x[2].z); 264 ${OUTPUT} 265 } 266 "" 267 end 268 269 case int_vec3 270 version 330 271 values 272 { 273 input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ]; 274 output ivec3 out0 = [ ivec3(5, -2, 1) | ivec3(7, -2, -1) | ivec3(3, 2, 1) ]; 275 } 276 277 both "" 278 #version 330 279 precision mediump int; 280 precision mediump float; 281 ${DECLARATIONS} 282 283 void main() 284 { 285 ${SETUP} 286 287 ivec3[3] x; 288 x = ivec3[3] ( ivec3(in0.x, in0.y, in0.z) , 289 ivec3(-in0.y, -in0.z, -in0.x), 290 ivec3(in0.z, in0.x, in0.y) ); 291 out0 = ivec3(x[0].x, x[1].y, x[2].z); 292 ${OUTPUT} 293 } 294 "" 295 end 296 297 case bool_vec3 298 version 330 299 values 300 { 301 input bvec3 in0 = [ bvec3(true, false, true) ]; 302 output bvec3 out0 = [ bvec3(true, true, false) ]; 303 } 304 305 both "" 306 #version 330 307 precision mediump float; 308 ${DECLARATIONS} 309 310 void main() 311 { 312 ${SETUP} 313 314 bvec3[3] x; 315 x = bvec3[3] ( bvec3(in0.x, in0.y, in0.z) , 316 bvec3(in0.y, in0.z, in0.x), 317 bvec3(in0.z, in0.x, in0.y) ); 318 out0 = bvec3(x[0].x, x[1].y, x[2].z); 319 ${OUTPUT} 320 } 321 "" 322 end 323 324 case float_mat3 325 version 330 326 values 327 { 328 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ]; 329 output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ]; 330 } 331 332 both "" 333 #version 330 334 precision mediump float; 335 ${DECLARATIONS} 336 337 void main() 338 { 339 ${SETUP} 340 mat3[3] a = mat3[3] ( mat3( in0.x, in0.y, in0.z, 341 in0.x, in0.y, in0.z, 342 in0.x, in0.y, in0.z) , 343 mat3( in0.z, in0.x, -in0.y, 344 in0.z, in0.x, -in0.y, 345 in0.z, in0.x, -in0.y) , 346 mat3( -in0.z, -in0.z, in0.z, 347 -in0.y, -in0.y, in0.y, 348 -in0.x, -in0.x, in0.x) ); 349 350 mat3 a0 = a[0]; 351 mat3 a1 = a[1]; 352 mat3 a2 = a[2]; 353 354 float ret0 = a0[2][0]; 355 float ret1 = a1[0][2]; 356 float ret2 = a2[1][2]; 357 358 out0 = vec3(ret0, ret1, ret2); 359 ${OUTPUT} 360 } 361 "" 362 end 363 364 case int_mat3 365 version 330 366 values 367 { 368 input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ]; 369 output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ]; 370 } 371 372 both "" 373 #version 330 374 precision mediump int; 375 precision mediump float; 376 ${DECLARATIONS} 377 378 void main() 379 { 380 ${SETUP} 381 mat3[3] a = mat3[3] ( mat3( in0.x, in0.y, in0.z, 382 in0.x, in0.y, in0.z, 383 in0.x, in0.y, in0.z) , 384 mat3( in0.z, in0.x, -in0.y, 385 in0.z, in0.x, -in0.y, 386 in0.z, in0.x, -in0.y) , 387 mat3( -in0.z, -in0.z, in0.z, 388 -in0.y, -in0.y, in0.y, 389 -in0.x, -in0.x, in0.x) ); 390 391 mat3 a0 = a[0]; 392 mat3 a1 = a[1]; 393 mat3 a2 = a[2]; 394 395 float ret0 = a0[2][0]; 396 float ret1 = a1[0][2]; 397 float ret2 = a2[1][2]; 398 399 out0 = ivec3(ret0, ret1, ret2); 400 ${OUTPUT} 401 } 402 "" 403 end 404 405 case bool_mat3 406 version 330 407 values 408 { 409 input bvec3 in0 = [ bvec3(true, false, true) ]; 410 output bvec3 out0 = [ bvec3(true, false, false) ]; 411 } 412 413 both "" 414 #version 330 415 precision mediump float; 416 ${DECLARATIONS} 417 418 void main() 419 { 420 ${SETUP} 421 mat3[3] a = mat3[3] ( mat3( in0.x, in0.y, in0.z, 422 in0.x, in0.y, in0.z, 423 in0.x, in0.y, in0.z) , 424 mat3( in0.z, in0.x, in0.y, 425 in0.z, in0.x, in0.y, 426 in0.z, in0.x, in0.y) , 427 mat3( in0.z, in0.z, in0.z, 428 in0.y, in0.y, in0.y, 429 in0.x, in0.x, in0.x) ); 430 431 mat3 a0 = a[0]; 432 mat3 a1 = a[1]; 433 mat3 a2 = a[2]; 434 435 float ret0 = a0[2][0]; 436 float ret1 = a1[0][2]; 437 float ret2 = a2[1][2]; 438 439 out0 = bvec3(ret0, ret1, ret2); 440 ${OUTPUT} 441 } 442 "" 443 end 444 445end # type 446 447group return "Arrays as return value" 448 449 case float 450 version 330 451 values 452 { 453 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ]; 454 output vec3 out0 = [ vec3(2.0, -0.5, 1.0) | vec3(2.0, -7.4, -1.0) | vec3(-2.0, -3.0, 1.6) ]; 455 } 456 457 both "" 458 #version 330 459 precision mediump float; 460 ${DECLARATIONS} 461 462 float[3] func(vec3 a) 463 { 464 return float[3] (a.z, -a.x, a.y); 465 } 466 467 void main() 468 { 469 ${SETUP} 470 float[3] x = func(in0); 471 out0 = vec3(x[0], x[1], x[2]); 472 ${OUTPUT} 473 } 474 "" 475 end 476 477 case int 478 version 330 479 values 480 { 481 input ivec3 in0 = [ ivec3(4, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ]; 482 output ivec3 out0 = [ ivec3(2, -4, 1) | ivec3(2, -7, -1) | ivec3(-2, -3, 1) ]; 483 } 484 485 both "" 486 #version 330 487 precision mediump int; 488 precision mediump float; 489 ${DECLARATIONS} 490 491 int[3] func(ivec3 a) 492 { 493 return int[3] (a.z, -a.x, a.y); 494 } 495 496 void main() 497 { 498 ${SETUP} 499 int[3] x = func(in0); 500 out0 = ivec3(x[0], x[1], x[2]); 501 ${OUTPUT} 502 } 503 "" 504 end 505 506 case bool 507 version 330 508 values 509 { 510 input bvec3 in0 = [ bvec3(false, true, true) ]; 511 output bvec3 out0 = [ bvec3(true, false, true) ]; 512 } 513 514 both "" 515 #version 330 516 precision mediump float; 517 ${DECLARATIONS} 518 519 bool[3] func(bvec3 a) 520 { 521 return bool[3] (a.z, a.x, a.y); 522 } 523 524 void main() 525 { 526 ${SETUP} 527 bool[3] x = func(in0); 528 out0 = bvec3(x[0], x[1], x[2]); 529 ${OUTPUT} 530 } 531 "" 532 end 533 534 535 536 case float_vec3 537 version 330 538 values 539 { 540 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ]; 541 output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ]; 542 } 543 544 both "" 545 #version 330 546 precision mediump float; 547 ${DECLARATIONS} 548 549 vec3[3] func(vec3[3] a) 550 { 551 return vec3[3] (a[1], a[2], a[0]); 552 } 553 554 void main() 555 { 556 ${SETUP} 557 vec3[3] x = vec3[3](vec3(in0.x, in0.y, -in0.z) , 558 vec3(in0.y, -in0.z, in0.x) , 559 vec3(-in0.z, in0.x, in0.y) ); 560 x = func(x); 561 out0 = vec3(x[0].x, x[1].y, x[2].z); 562 ${OUTPUT} 563 } 564 "" 565 end 566 567 case struct 568 version 330 569 values 570 { 571 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 572 output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ]; 573 } 574 575 both "" 576 #version 330 577 precision mediump float; 578 ${DECLARATIONS} 579 580 struct test 581 { 582 float f; 583 vec3 v; 584 }; 585 586 test[3] func(test[3] a) 587 { 588 return test[3] (a[1], a[2], a[0]); 589 } 590 591 void main() 592 { 593 ${SETUP} 594 595 test a = test(in0.z, vec3(in0.x, in0.y, in0.z)); 596 test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y)); 597 test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x)); 598 599 test[3] t = test[3] (a, b, c); 600 test[3] x = func(t); 601 602 out0 = vec3(x[0].v.z, x[1].v.y, x[2].v.x); 603 ${OUTPUT} 604 } 605 "" 606 end 607 608 case int_vec3 609 version 330 610 values 611 { 612 input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ]; 613 output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ]; 614 } 615 616 both "" 617 #version 330 618 precision mediump int; 619 precision mediump float; 620 ${DECLARATIONS} 621 622 ivec3[3] func(ivec3[3] a) 623 { 624 return ivec3[3] (a[1], a[2], a[0]); 625 } 626 627 void main() 628 { 629 ${SETUP} 630 ivec3[3] x = ivec3[3]( ivec3(in0.x, in0.y, -in0.z) , 631 ivec3(in0.y, -in0.z, in0.x) , 632 ivec3(-in0.z, in0.x, in0.y) ); 633 x = func(x); 634 out0 = ivec3(x[0].x, x[1].y, x[2].z); 635 ${OUTPUT} 636 } 637 "" 638 end 639 640 case bool_vec3 641 version 330 642 values 643 { 644 input bvec3 in0 = [ bvec3(true, false, false) ]; 645 output bvec3 out0 = [ bvec3(false, true, false) ]; 646 } 647 648 both "" 649 #version 330 650 precision mediump int; 651 precision mediump float; 652 ${DECLARATIONS} 653 654 bvec3[3] func(bvec3[3] a) 655 { 656 return bvec3[3] (a[1], a[2], a[0]); 657 } 658 659 void main() 660 { 661 ${SETUP} 662 bvec3[3] x = bvec3[3]( bvec3(in0.x, in0.y, in0.z) , 663 bvec3(in0.y, in0.z, in0.x) , 664 bvec3(in0.z, in0.x, in0.y) ); 665 x = func(x); 666 out0 = bvec3(x[0].x, x[1].y, x[2].z); 667 ${OUTPUT} 668 } 669 "" 670 end 671 672 case float_mat3 673 version 330 674 values 675 { 676 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ]; 677 output vec3 out0 = [ vec3(2.0, -1.0, 2.0) | vec3(-2.3, 0.0, -2.3) ]; 678 } 679 680 both "" 681 #version 330 682 precision mediump float; 683 ${DECLARATIONS} 684 685 mat3[3] func(mat3[3] x) 686 { 687 mat3[3] r; 688 r[0] = x[1]; 689 r[1] = x[2]; 690 r[2] = x[0]; 691 return r; 692 } 693 694 void main() 695 { 696 ${SETUP} 697 mat3[3] a, b; 698 a[0] = mat3(in0.x, in0.y, in0.z, 699 in0.x, in0.y, in0.z, 700 in0.x, in0.y, in0.z); 701 a[1] = mat3(in0.z, in0.x, -in0.y, 702 in0.z, in0.x, -in0.y, 703 in0.z, in0.x, -in0.y); 704 a[2] = mat3(-in0.z, -in0.z, in0.z, 705 -in0.y, -in0.y, in0.y, 706 -in0.x, -in0.x, in0.x); 707 708 b = func(a); 709 710 mat3 b0 = b[0]; 711 mat3 b1 = b[1]; 712 mat3 b2 = b[2]; 713 714 float ret0 = b0[0][0]; 715 float ret1 = b1[1][1]; 716 float ret2 = b2[2][2]; 717 718 out0 = vec3(ret0, ret1, ret2); 719 ${OUTPUT} 720 } 721 "" 722 end 723 724 case int_mat3 725 version 330 726 values 727 { 728 input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-1, 0, -2) ]; 729 output ivec3 out0 = [ ivec3(2, -1, 2) | ivec3(-2, 0, -2) ]; 730 } 731 732 both "" 733 #version 330 734 precision mediump int; 735 precision mediump float; 736 ${DECLARATIONS} 737 738 mat3[3] func(mat3[3] x) 739 { 740 mat3[3] r; 741 r[0] = x[1]; 742 r[1] = x[2]; 743 r[2] = x[0]; 744 return r; 745 } 746 747 void main() 748 { 749 ${SETUP} 750 mat3[3] a, b; 751 a[0] = mat3(in0.x, in0.y, in0.z, 752 in0.x, in0.y, in0.z, 753 in0.x, in0.y, in0.z); 754 a[1] = mat3(in0.z, in0.x, -in0.y, 755 in0.z, in0.x, -in0.y, 756 in0.z, in0.x, -in0.y); 757 a[2] = mat3(-in0.z, -in0.z, in0.z, 758 -in0.y, -in0.y, in0.y, 759 -in0.x, -in0.x, in0.x); 760 761 b = func(a); 762 763 mat3 b0 = b[0]; 764 mat3 b1 = b[1]; 765 mat3 b2 = b[2]; 766 767 float ret0 = b0[0][0]; 768 float ret1 = b1[1][1]; 769 float ret2 = b2[2][2]; 770 771 out0 = ivec3(ret0, ret1, ret2); 772 ${OUTPUT} 773 } 774 "" 775 end 776 777 case bool_mat3 778 version 330 779 values 780 { 781 input bvec3 in0 = [ bvec3(true, false, true) | bvec3(true, true, false) ]; 782 output bvec3 out0 = [ bvec3(true, false, true) | bvec3(false, true, false) ]; 783 } 784 785 both "" 786 #version 330 787 precision mediump float; 788 ${DECLARATIONS} 789 790 mat3[3] func(mat3[3] x) 791 { 792 mat3[3] r; 793 r[0] = x[1]; 794 r[1] = x[2]; 795 r[2] = x[0]; 796 return r; 797 } 798 799 void main() 800 { 801 ${SETUP} 802 mat3[3] a, b; 803 a[0] = mat3(in0.x, in0.y, in0.z, 804 in0.x, in0.y, in0.z, 805 in0.x, in0.y, in0.z); 806 a[1] = mat3(in0.z, in0.x, in0.y, 807 in0.z, in0.x, in0.y, 808 in0.z, in0.x, in0.y); 809 a[2] = mat3(in0.z, in0.z, in0.z, 810 in0.y, in0.y, in0.y, 811 in0.x, in0.x, in0.x); 812 813 b = func(a); 814 815 mat3 b0 = b[0]; 816 mat3 b1 = b[1]; 817 mat3 b2 = b[2]; 818 819 float ret0 = b0[0][0]; 820 float ret1 = b1[1][1]; 821 float ret2 = b2[2][2]; 822 823 out0 = bvec3(ret0, ret1, ret2); 824 ${OUTPUT} 825 } 826 "" 827 end 828 829end # return 830 831group unnamed_parameter "Array type as unnamed parameter of a function prototype" 832 833 case float 834 version 330 835 values 836 { 837 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ]; 838 output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ]; 839 } 840 841 both "" 842 #version 330 843 precision mediump float; 844 ${DECLARATIONS} 845 846 float[3] func(float[3]); 847 848 void main() 849 { 850 ${SETUP} 851 float[3] a = float[3] (in0.x, in0.y, in0.z); 852 float[3] b = func(a); 853 out0 = vec3(b[0], b[1], b[2]); 854 ${OUTPUT} 855 } 856 857 float[3] func(float[3] a) 858 { 859 return float[3] (a[2], a[0], a[1]); 860 } 861 862 "" 863 end 864 865 case int 866 version 330 867 values 868 { 869 input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ]; 870 output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ]; 871 } 872 873 both "" 874 #version 330 875 precision mediump int; 876 precision mediump float; 877 ${DECLARATIONS} 878 879 int[3] func(int[3]); 880 881 void main() 882 { 883 ${SETUP} 884 int[3] a = int[3] (in0.x, in0.y, in0.z); 885 int[3] b = func(a); 886 out0 = ivec3(b[0], b[1], b[2]); 887 ${OUTPUT} 888 } 889 890 int[3] func(int[3] a) 891 { 892 return int[3] (a[2], a[0], a[1]); 893 } 894 895 "" 896 end 897 898 case bool 899 version 330 900 values 901 { 902 input bvec3 in0 = [ bvec3(false, true, true) ]; 903 output bvec3 out0 = [ bvec3(true, false, true) ]; 904 } 905 906 both "" 907 #version 330 908 precision mediump float; 909 ${DECLARATIONS} 910 911 bool[3] func(bool[3]); 912 913 void main() 914 { 915 ${SETUP} 916 bool[3] a = bool[3] (in0.x, in0.y, in0.z); 917 bool[3] b = func(a); 918 out0 = bvec3(b[0], b[1], b[2]); 919 ${OUTPUT} 920 } 921 922 bool[3] func(bool[3] a) 923 { 924 return bool[3] (a[2], a[0], a[1]); 925 } 926 927 "" 928 end 929 930 case struct 931 version 330 932 values 933 { 934 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 935 output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ]; 936 } 937 938 both "" 939 #version 330 940 precision mediump float; 941 ${DECLARATIONS} 942 943 struct test 944 { 945 float f; 946 vec3 v; 947 }; 948 949 test[3] func(test[3]); 950 951 void main() 952 { 953 ${SETUP} 954 955 test a = test(in0.z, vec3(in0.x, in0.y, in0.z)); 956 test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y)); 957 test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x)); 958 959 test[3] t = test[3] (a, b, c); 960 test[3] x = func(t); 961 out0 = vec3(x[0].v.z, x[1].v.y, x[2].v.x); 962 ${OUTPUT} 963 } 964 965 test[3] func(test[3] a) 966 { 967 return test[3] (a[1], a[2], a[0]); 968 } 969 970 "" 971 end 972 973 case float_vec3 974 version 330 975 values 976 { 977 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ]; 978 output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ]; 979 } 980 981 both "" 982 #version 330 983 precision mediump float; 984 ${DECLARATIONS} 985 986 vec3[3] func(vec3[3]); 987 988 void main() 989 { 990 ${SETUP} 991 vec3[3] x = vec3[3](vec3(in0.x, in0.y, -in0.z) , 992 vec3(in0.y, -in0.z, in0.x) , 993 vec3(-in0.z, in0.x, in0.y) ); 994 x = func(x); 995 out0 = vec3(x[0].x, x[1].y, x[2].z); 996 ${OUTPUT} 997 } 998 999 vec3[3] func(vec3[3] a) 1000 { 1001 return vec3[3] (a[1], a[2], a[0]); 1002 } 1003 "" 1004 end 1005 1006 case int_vec3 1007 version 330 1008 values 1009 { 1010 input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ]; 1011 output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ]; 1012 } 1013 1014 both "" 1015 #version 330 1016 precision mediump int; 1017 precision mediump float; 1018 ${DECLARATIONS} 1019 1020 ivec3[3] func(ivec3[3]); 1021 1022 void main() 1023 { 1024 ${SETUP} 1025 ivec3[3] x = ivec3[3]( ivec3(in0.x, in0.y, -in0.z) , 1026 ivec3(in0.y, -in0.z, in0.x) , 1027 ivec3(-in0.z, in0.x, in0.y) ); 1028 x = func(x); 1029 out0 = ivec3(x[0].x, x[1].y, x[2].z); 1030 ${OUTPUT} 1031 } 1032 1033 ivec3[3] func(ivec3[3] a) 1034 { 1035 return ivec3[3] (a[1], a[2], a[0]); 1036 } 1037 "" 1038 end 1039 1040 case bool_vec3 1041 version 330 1042 values 1043 { 1044 input bvec3 in0 = [ bvec3(true, false, false) ]; 1045 output bvec3 out0 = [ bvec3(false, true, false) ]; 1046 } 1047 1048 both "" 1049 #version 330 1050 precision mediump int; 1051 precision mediump float; 1052 ${DECLARATIONS} 1053 1054 bvec3[3] func(bvec3[3]); 1055 1056 void main() 1057 { 1058 ${SETUP} 1059 bvec3[3] x = bvec3[3]( bvec3(in0.x, in0.y, in0.z) , 1060 bvec3(in0.y, in0.z, in0.x) , 1061 bvec3(in0.z, in0.x, in0.y) ); 1062 x = func(x); 1063 out0 = bvec3(x[0].x, x[1].y, x[2].z); 1064 ${OUTPUT} 1065 } 1066 1067 bvec3[3] func(bvec3[3] a) 1068 { 1069 return bvec3[3] (a[1], a[2], a[0]); 1070 } 1071 1072 "" 1073 end 1074 1075 case float_mat3 1076 version 330 1077 values 1078 { 1079 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ]; 1080 output vec3 out0 = [ vec3(2.0, -1.0, 2.0) | vec3(-2.3, 0.0, -2.3) ]; 1081 } 1082 1083 both "" 1084 #version 330 1085 precision mediump float; 1086 ${DECLARATIONS} 1087 1088 mat3[3] func(mat3[3]); 1089 1090 void main() 1091 { 1092 ${SETUP} 1093 mat3[3] a, b; 1094 a[0] = mat3(in0.x, in0.y, in0.z, 1095 in0.x, in0.y, in0.z, 1096 in0.x, in0.y, in0.z); 1097 a[1] = mat3(in0.z, in0.x, -in0.y, 1098 in0.z, in0.x, -in0.y, 1099 in0.z, in0.x, -in0.y); 1100 a[2] = mat3(-in0.z, -in0.z, in0.z, 1101 -in0.y, -in0.y, in0.y, 1102 -in0.x, -in0.x, in0.x); 1103 1104 b = func(a); 1105 1106 mat3 b0 = b[0]; 1107 mat3 b1 = b[1]; 1108 mat3 b2 = b[2]; 1109 1110 float ret0 = b0[0][0]; 1111 float ret1 = b1[1][1]; 1112 float ret2 = b2[2][2]; 1113 1114 out0 = vec3(ret0, ret1, ret2); 1115 ${OUTPUT} 1116 } 1117 1118 mat3[3] func(mat3[3] x) 1119 { 1120 mat3[3] r; 1121 r[0] = x[1]; 1122 r[1] = x[2]; 1123 r[2] = x[0]; 1124 return r; 1125 } 1126 "" 1127 end 1128 1129 case int_mat3 1130 version 330 1131 values 1132 { 1133 input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-1, 0, -2) ]; 1134 output ivec3 out0 = [ ivec3(2, -1, 2) | ivec3(-2, 0, -2) ]; 1135 } 1136 1137 both "" 1138 #version 330 1139 precision mediump int; 1140 precision mediump float; 1141 ${DECLARATIONS} 1142 1143 mat3[3] func(mat3[3]); 1144 1145 void main() 1146 { 1147 ${SETUP} 1148 mat3[3] a, b; 1149 a[0] = mat3(in0.x, in0.y, in0.z, 1150 in0.x, in0.y, in0.z, 1151 in0.x, in0.y, in0.z); 1152 a[1] = mat3(in0.z, in0.x, -in0.y, 1153 in0.z, in0.x, -in0.y, 1154 in0.z, in0.x, -in0.y); 1155 a[2] = mat3(-in0.z, -in0.z, in0.z, 1156 -in0.y, -in0.y, in0.y, 1157 -in0.x, -in0.x, in0.x); 1158 1159 b = func(a); 1160 1161 mat3 b0 = b[0]; 1162 mat3 b1 = b[1]; 1163 mat3 b2 = b[2]; 1164 1165 float ret0 = b0[0][0]; 1166 float ret1 = b1[1][1]; 1167 float ret2 = b2[2][2]; 1168 1169 out0 = ivec3(ret0, ret1, ret2); 1170 ${OUTPUT} 1171 } 1172 1173 mat3[3] func(mat3[3] x) 1174 { 1175 mat3[3] r; 1176 r[0] = x[1]; 1177 r[1] = x[2]; 1178 r[2] = x[0]; 1179 return r; 1180 } 1181 "" 1182 end 1183 1184 case bool_mat3 1185 version 330 1186 values 1187 { 1188 input bvec3 in0 = [ bvec3(true, false, true) | bvec3(true, true, false) ]; 1189 output bvec3 out0 = [ bvec3(true, false, true) | bvec3(false, true, false) ]; 1190 } 1191 1192 both "" 1193 #version 330 1194 precision mediump float; 1195 ${DECLARATIONS} 1196 1197 mat3[3] func(mat3[3]); 1198 void main() 1199 { 1200 ${SETUP} 1201 mat3[3] a, b; 1202 a[0] = mat3(in0.x, in0.y, in0.z, 1203 in0.x, in0.y, in0.z, 1204 in0.x, in0.y, in0.z); 1205 a[1] = mat3(in0.z, in0.x, in0.y, 1206 in0.z, in0.x, in0.y, 1207 in0.z, in0.x, in0.y); 1208 a[2] = mat3(in0.z, in0.z, in0.z, 1209 in0.y, in0.y, in0.y, 1210 in0.x, in0.x, in0.x); 1211 1212 b = func(a); 1213 1214 mat3 b0 = b[0]; 1215 mat3 b1 = b[1]; 1216 mat3 b2 = b[2]; 1217 1218 float ret0 = b0[0][0]; 1219 float ret1 = b1[1][1]; 1220 float ret2 = b2[2][2]; 1221 1222 out0 = bvec3(ret0, ret1, ret2); 1223 ${OUTPUT} 1224 } 1225 1226 mat3[3] func(mat3[3] x) 1227 { 1228 mat3[3] r; 1229 r[0] = x[1]; 1230 r[1] = x[2]; 1231 r[2] = x[0]; 1232 return r; 1233 } 1234 "" 1235 end 1236 1237end # unnamed_parameter 1238 1239group declaration "Declaring arrays" 1240 1241 case implicit_size_float 1242 version 330 1243 values 1244 { 1245 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ]; 1246 output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ]; 1247 } 1248 1249 both "" 1250 #version 330 1251 precision mediump float; 1252 ${DECLARATIONS} 1253 1254 void main() 1255 { 1256 ${SETUP} 1257 float[] x = float[] (in0.z, in0.x, in0.y); 1258 float[] y = x; 1259 1260 out0 = vec3(y[0], y[1], y[2]); 1261 ${OUTPUT} 1262 } 1263 "" 1264 end 1265 1266 case implicit_size_int 1267 version 330 1268 values 1269 { 1270 input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ]; 1271 output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ]; 1272 } 1273 1274 both "" 1275 #version 330 1276 precision mediump int; 1277 precision mediump float; 1278 ${DECLARATIONS} 1279 1280 void main() 1281 { 1282 ${SETUP} 1283 int[] x = int[] (in0.z, in0.x, in0.y); 1284 int[] y = x; 1285 1286 out0 = ivec3(y[0], y[1], y[2]); 1287 ${OUTPUT} 1288 } 1289 "" 1290 end 1291 1292 case implicit_size_bool 1293 version 330 1294 values 1295 { 1296 input bvec3 in0 = [ bvec3(false, true, true) ]; 1297 output bvec3 out0 = [ bvec3(true, false, true) ]; 1298 } 1299 1300 both "" 1301 #version 330 1302 precision mediump float; 1303 ${DECLARATIONS} 1304 1305 void main() 1306 { 1307 ${SETUP} 1308 bool[] x = bool[] (in0.z, in0.x, in0.y); 1309 bool[] y = x; 1310 1311 out0 = bvec3(y[0], y[1], y[2]); 1312 ${OUTPUT} 1313 } 1314 "" 1315 end 1316 1317 case implicit_size_struct 1318 version 330 1319 values 1320 { 1321 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1322 output vec3 out0 = [ vec3(-1.0, -0.5, 2.0) ]; 1323 } 1324 1325 both "" 1326 #version 330 1327 precision mediump float; 1328 ${DECLARATIONS} 1329 1330 struct test 1331 { 1332 float f; 1333 vec3 v; 1334 }; 1335 1336 void main() 1337 { 1338 ${SETUP} 1339 1340 test a = test(in0.z, vec3(in0.x, in0.y, in0.z)); 1341 test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y)); 1342 test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x)); 1343 1344 test[] x = test[] (c, b, a); 1345 test[] y = x; 1346 1347 out0 = vec3(y[0].v.x, y[1].v.y, y[2].v.z); 1348 ${OUTPUT} 1349 } 1350 "" 1351 end 1352 1353 case implicit_size_float_vec3 1354 version 330 1355 values 1356 { 1357 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ]; 1358 output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(-0.5, 1.0, 11.2) ]; 1359 } 1360 1361 both "" 1362 #version 330 1363 precision mediump float; 1364 ${DECLARATIONS} 1365 1366 void main() 1367 { 1368 ${SETUP} 1369 vec3[] x = vec3[] ( vec3(in0.x, in0.y, -in0.z) , 1370 vec3(in0.y, -in0.z, in0.x) , 1371 vec3(-in0.z, in0.x, in0.y) ); 1372 vec3[] y = x; 1373 out0 = vec3(y[0].x, y[1].y, y[2].z); 1374 ${OUTPUT} 1375 } 1376 "" 1377 end 1378 1379 case implicit_size_int_ivec3 1380 version 330 1381 values 1382 { 1383 input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(5, 11, -1) ]; 1384 output ivec3 out0 = [ ivec3(0, -2, 1) | ivec3(5, 1, 11) ]; 1385 } 1386 1387 both "" 1388 #version 330 1389 precision mediump int; 1390 precision mediump float; 1391 ${DECLARATIONS} 1392 1393 void main() 1394 { 1395 ${SETUP} 1396 ivec3[] x = ivec3[] ( ivec3(in0.x, in0.y, -in0.z) , 1397 ivec3(in0.y, -in0.z, in0.x) , 1398 ivec3(-in0.z, in0.x, in0.y) ); 1399 ivec3[] y = x; 1400 out0 = ivec3(y[0].x, y[1].y, y[2].z); 1401 ${OUTPUT} 1402 } 1403 "" 1404 end 1405 1406 case implicit_size_bool_bvec3 1407 version 330 1408 values 1409 { 1410 input bvec3 in0 = [ bvec3(true, false, true) ]; 1411 output bvec3 out0 = [ bvec3(true, true, false) ]; 1412 } 1413 1414 both "" 1415 #version 330 1416 precision mediump float; 1417 ${DECLARATIONS} 1418 1419 void main() 1420 { 1421 ${SETUP} 1422 bvec3[] x = bvec3[] ( bvec3(in0.x, in0.y, in0.z) , 1423 bvec3(in0.y, in0.z, in0.x) , 1424 bvec3(in0.z, in0.x, in0.y) ); 1425 bvec3[] y = x; 1426 out0 = bvec3(y[0].x, y[1].y, y[2].z); 1427 ${OUTPUT} 1428 } 1429 "" 1430 end 1431 1432 case implicit_size_float_mat3 1433 version 330 1434 values 1435 { 1436 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ]; 1437 output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ]; 1438 } 1439 1440 both "" 1441 #version 330 1442 precision mediump float; 1443 ${DECLARATIONS} 1444 1445 void main() 1446 { 1447 ${SETUP} 1448 mat3[] a = mat3[] ( mat3( in0.x, in0.y, in0.z, 1449 in0.x, in0.y, in0.z, 1450 in0.x, in0.y, in0.z) , 1451 mat3( in0.z, in0.x, -in0.y, 1452 in0.z, in0.x, -in0.y, 1453 in0.z, in0.x, -in0.y) , 1454 mat3( -in0.z, -in0.z, in0.z, 1455 -in0.y, -in0.y, in0.y, 1456 -in0.x, -in0.x, in0.x) ); 1457 1458 mat3 a0 = a[0]; 1459 mat3 a1 = a[1]; 1460 mat3 a2 = a[2]; 1461 1462 float ret0 = a0[2][0]; 1463 float ret1 = a1[0][2]; 1464 float ret2 = a2[1][2]; 1465 1466 out0 = vec3(ret0, ret1, ret2); 1467 ${OUTPUT} 1468 } 1469 "" 1470 end 1471 1472 case implicit_size_int_mat3 1473 version 330 1474 values 1475 { 1476 input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ]; 1477 output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ]; 1478 } 1479 1480 both "" 1481 #version 330 1482 precision mediump int; 1483 precision mediump float; 1484 ${DECLARATIONS} 1485 1486 void main() 1487 { 1488 ${SETUP} 1489 mat3[] a = mat3[] ( mat3( in0.x, in0.y, in0.z, 1490 in0.x, in0.y, in0.z, 1491 in0.x, in0.y, in0.z) , 1492 mat3( in0.z, in0.x, -in0.y, 1493 in0.z, in0.x, -in0.y, 1494 in0.z, in0.x, -in0.y) , 1495 mat3( -in0.z, -in0.z, in0.z, 1496 -in0.y, -in0.y, in0.y, 1497 -in0.x, -in0.x, in0.x) ); 1498 1499 mat3 a0 = a[0]; 1500 mat3 a1 = a[1]; 1501 mat3 a2 = a[2]; 1502 1503 float ret0 = a0[2][0]; 1504 float ret1 = a1[0][2]; 1505 float ret2 = a2[1][2]; 1506 1507 out0 = ivec3(ret0, ret1, ret2); 1508 ${OUTPUT} 1509 } 1510 "" 1511 end 1512 1513 case implicit_size_bool_mat3 1514 version 330 1515 values 1516 { 1517 input bvec3 in0 = [ bvec3(true, false, true) ]; 1518 output bvec3 out0 = [ bvec3(true, false, false) ]; 1519 } 1520 1521 both "" 1522 #version 330 1523 precision mediump float; 1524 ${DECLARATIONS} 1525 1526 void main() 1527 { 1528 ${SETUP} 1529 mat3[] a = mat3[] ( mat3( in0.x, in0.y, in0.z, 1530 in0.x, in0.y, in0.z, 1531 in0.x, in0.y, in0.z) , 1532 mat3( in0.z, in0.x, in0.y, 1533 in0.z, in0.x, in0.y, 1534 in0.z, in0.x, in0.y) , 1535 mat3( in0.z, in0.z, in0.z, 1536 in0.y, in0.y, in0.y, 1537 in0.x, in0.x, in0.x) ); 1538 1539 mat3 a0 = a[0]; 1540 mat3 a1 = a[1]; 1541 mat3 a2 = a[2]; 1542 1543 float ret0 = a0[2][0]; 1544 float ret1 = a1[0][2]; 1545 float ret2 = a2[1][2]; 1546 1547 out0 = bvec3(ret0, ret1, ret2); 1548 ${OUTPUT} 1549 } 1550 "" 1551 end 1552 1553 1554 case constant_expression_array_size 1555 version 330 1556 1557 both "" 1558 #version 330 1559 precision mediump float; 1560 ${DECLARATIONS} 1561 1562 const int a = 4; 1563 1564 void main () 1565 { 1566 const int b = 5; 1567 float[a] array1; 1568 float[b] array2; 1569 float[array1.length()] array3; 1570 float[a+b] array4; 1571 ${OUTPUT} 1572 } 1573 "" 1574 end 1575 1576 case constant_expression_array_access 1577 version 330 1578 values 1579 { 1580 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1581 output vec3 out0 = [ vec3(-2.0, -1.0, -0.5) ]; 1582 } 1583 1584 both "" 1585 #version 330 1586 precision mediump float; 1587 ${DECLARATIONS} 1588 1589 const int a = 3; 1590 1591 void main () 1592 { 1593 ${SETUP} 1594 const int b = 2; 1595 float x = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [a]; 1596 float y = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [b+2]; 1597 float z = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [5]; 1598 out0 = vec3(x, y, z); 1599 ${OUTPUT} 1600 } 1601 "" 1602 end 1603 1604 1605 1606 case dynamic_expression_array_access 1607 version 330 1608 values 1609 { 1610 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1611 input ivec2 in1 = ivec2(3, 2); 1612 output vec3 out0 = [ vec3(-2.0, -1.0, -0.5) ]; 1613 } 1614 1615 both "" 1616 #version 330 1617 precision mediump float; 1618 ${DECLARATIONS} 1619 1620 void main () 1621 { 1622 ${SETUP} 1623 float x = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.x]; 1624 float y = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.y+2]; 1625 float z = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.x+in1.y]; 1626 out0 = vec3(x, y, z); 1627 ${OUTPUT} 1628 } 1629 "" 1630 end 1631 1632end # declaration 1633 1634group length "Array length method" 1635 1636 case float 1637 version 330 1638 values 1639 { 1640 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1641 output ivec3 out0 = [ ivec3(3, 5, 13) ]; 1642 } 1643 1644 both "" 1645 #version 330 1646 precision mediump float; 1647 ${DECLARATIONS} 1648 1649 void main() 1650 { 1651 ${SETUP} 1652 float[] x = float[3] (in0.z, in0.x, in0.y); 1653 float[] y = float[] (in0.z, in0.x, in0.y, in0.x, in0.y); 1654 float[13] z; 1655 1656 out0 = ivec3(x.length(), y.length(), z.length()); 1657 ${OUTPUT} 1658 } 1659 "" 1660 end 1661 1662 case int 1663 version 330 1664 values 1665 { 1666 input ivec3 in0 = [ ivec3(0, 1, 2) ]; 1667 output ivec3 out0 = [ ivec3(3, 5, 13) ]; 1668 } 1669 1670 both "" 1671 #version 330 1672 precision mediump int; 1673 precision mediump float; 1674 ${DECLARATIONS} 1675 1676 void main() 1677 { 1678 ${SETUP} 1679 int[] x = int[3] (in0.z, in0.x, in0.y); 1680 int[] y = int[] (in0.z, in0.x, in0.y, in0.x, in0.y); 1681 int[13] z; 1682 1683 out0 = ivec3(x.length(), y.length(), z.length()); 1684 ${OUTPUT} 1685 } 1686 "" 1687 end 1688 1689 case bool 1690 version 330 1691 values 1692 { 1693 input bvec3 in0 = [ bvec3(true, false, true) ]; 1694 output ivec3 out0 = [ ivec3(3, 5, 13) ]; 1695 } 1696 1697 both "" 1698 #version 330 1699 precision mediump float; 1700 ${DECLARATIONS} 1701 1702 void main() 1703 { 1704 ${SETUP} 1705 bool[] x = bool[3] (in0.z, in0.x, in0.y); 1706 bool[] y = bool[] (in0.z, in0.x, in0.y, in0.x, in0.y); 1707 bool[13] z; 1708 1709 out0 = ivec3(x.length(), y.length(), z.length()); 1710 ${OUTPUT} 1711 } 1712 "" 1713 end 1714 1715 case struct 1716 version 330 1717 values 1718 { 1719 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1720 output ivec3 out0 = [ ivec3(3, 5, 13) ]; 1721 } 1722 1723 both "" 1724 #version 330 1725 precision mediump float; 1726 ${DECLARATIONS} 1727 1728 struct test 1729 { 1730 float f; 1731 vec3 v; 1732 }; 1733 1734 void main() 1735 { 1736 ${SETUP} 1737 1738 test a = test(in0.z, vec3(in0.x, in0.y, in0.z)); 1739 test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y)); 1740 test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x)); 1741 1742 test[] x = test[3] (a, b, c); 1743 test[] y = test[] (c, a, b, b, a); 1744 test[13] z; 1745 1746 out0 = ivec3(x.length(), y.length(), z.length()); 1747 ${OUTPUT} 1748 } 1749 "" 1750 end 1751 1752end # length 1753 1754group invalid "Invalid Functions" 1755 1756 case multidimensional_array1 1757 version 330 1758 expect compile_fail 1759 1760 both "" 1761 #version 330 1762 precision mediump float; 1763 ${DECLARATIONS} 1764 1765 void main () 1766 { 1767 float a[5][3]; 1768 ${POSITION_FRAG_COLOR} = vec4(1.0); 1769 } 1770 "" 1771 end 1772 1773 case multidimensional_array2 1774 version 330 1775 expect compile_fail 1776 1777 both "" 1778 #version 330 1779 precision mediump float; 1780 ${DECLARATIONS} 1781 1782 void main () 1783 { 1784 float[5] a[3]; 1785 ${POSITION_FRAG_COLOR} = vec4(1.0); 1786 } 1787 "" 1788 end 1789 1790 case dynamic_expression_array_size 1791 version 330 1792 expect compile_fail 1793 1794 both "" 1795 #version 330 1796 precision mediump float; 1797 ${DECLARATIONS} 1798 1799 void main () 1800 { 1801 int a = 5; 1802 float[a] array; 1803 ${POSITION_FRAG_COLOR} = vec4(1.0); 1804 } 1805 "" 1806 end 1807 1808 1809 case constructor_c-style1 1810 version 330 1811 expect compile_fail 1812 1813 both "" 1814 #version 330 1815 precision mediump float; 1816 ${DECLARATIONS} 1817 1818 void main () 1819 { 1820 float a[]; 1821 a = float[3] { 1.0, 2.0, 3.0 }; 1822 1823 ${POSITION_FRAG_COLOR} = vec4(1.0); 1824 } 1825 "" 1826 end 1827 1828 case constructor_c-style2 1829 version 330 1830 expect compile_fail 1831 1832 both "" 1833 #version 330 1834 precision mediump float; 1835 ${DECLARATIONS} 1836 1837 void main () 1838 { 1839 float a[5] = { 1.0, 2.0, 3.0 }; 1840 1841 ${POSITION_FRAG_COLOR} = vec4(1.0); 1842 } 1843 "" 1844 end 1845 1846end # invalid 1847