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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 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 300 es 1556 1557 both "" 1558 #version 300 es 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 300 es 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 300 es 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 case dynamic_expression_array_access 1605 version 300 es 1606 values 1607 { 1608 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1609 input ivec2 in1 = ivec2(3, 2); 1610 output vec3 out0 = [ vec3(-2.0, -1.0, -0.5) ]; 1611 } 1612 1613 both "" 1614 #version 300 es 1615 precision mediump float; 1616 ${DECLARATIONS} 1617 1618 void main () 1619 { 1620 ${SETUP} 1621 float x = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.x]; 1622 float y = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.y+2]; 1623 float z = float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) [in1.x+in1.y]; 1624 out0 = vec3(x, y, z); 1625 ${OUTPUT} 1626 } 1627 "" 1628 end 1629 1630 case multiple_declarations_single_statement_explicit 1631 version 300 es 1632 values 1633 { 1634 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1635 output vec3 out0 = [ vec3(2.0, -1.0, 0.5) ]; 1636 } 1637 1638 both "" 1639 #version 300 es 1640 precision mediump float; 1641 ${DECLARATIONS} 1642 1643 void main () 1644 { 1645 ${SETUP} 1646 float[] x = float[6] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x), 1647 y = float[2] (in0.x, -in0.y); 1648 out0 = vec3(x[2], y[1], x[0]); 1649 ${OUTPUT} 1650 } 1651 "" 1652 end 1653 1654 case multiple_declarations_single_statement_implicit 1655 version 300 es 1656 values 1657 { 1658 input ivec3 in0 = [ ivec3(5, 1, 2) ]; 1659 output ivec3 out0 = [ ivec3(2, -1, 5) ]; 1660 } 1661 1662 both "" 1663 #version 300 es 1664 precision mediump float; 1665 ${DECLARATIONS} 1666 1667 void main () 1668 { 1669 ${SETUP} 1670 int[] x = int[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x), 1671 y = int[] (in0.x, -in0.y); 1672 out0 = ivec3(x[2], y[1], x[0]); 1673 ${OUTPUT} 1674 } 1675 "" 1676 end 1677 1678end # declaration 1679 1680group length "Array length method" 1681 1682 case float 1683 version 300 es 1684 values 1685 { 1686 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1687 output ivec3 out0 = [ ivec3(3, 5, 13) ]; 1688 } 1689 1690 both "" 1691 #version 300 es 1692 precision mediump float; 1693 ${DECLARATIONS} 1694 1695 void main() 1696 { 1697 ${SETUP} 1698 float[] x = float[3] (in0.z, in0.x, in0.y); 1699 float[] y = float[] (in0.z, in0.x, in0.y, in0.x, in0.y); 1700 float[13] z; 1701 1702 out0 = ivec3(x.length(), y.length(), z.length()); 1703 ${OUTPUT} 1704 } 1705 "" 1706 end 1707 1708 case int 1709 version 300 es 1710 values 1711 { 1712 input ivec3 in0 = [ ivec3(0, 1, 2) ]; 1713 output ivec3 out0 = [ ivec3(3, 5, 13) ]; 1714 } 1715 1716 both "" 1717 #version 300 es 1718 precision mediump int; 1719 precision mediump float; 1720 ${DECLARATIONS} 1721 1722 void main() 1723 { 1724 ${SETUP} 1725 int[] x = int[3] (in0.z, in0.x, in0.y); 1726 int[] y = int[] (in0.z, in0.x, in0.y, in0.x, in0.y); 1727 int[13] z; 1728 1729 out0 = ivec3(x.length(), y.length(), z.length()); 1730 ${OUTPUT} 1731 } 1732 "" 1733 end 1734 1735 case bool 1736 version 300 es 1737 values 1738 { 1739 input bvec3 in0 = [ bvec3(true, false, true) ]; 1740 output ivec3 out0 = [ ivec3(3, 5, 13) ]; 1741 } 1742 1743 both "" 1744 #version 300 es 1745 precision mediump float; 1746 ${DECLARATIONS} 1747 1748 void main() 1749 { 1750 ${SETUP} 1751 bool[] x = bool[3] (in0.z, in0.x, in0.y); 1752 bool[] y = bool[] (in0.z, in0.x, in0.y, in0.x, in0.y); 1753 bool[13] z; 1754 1755 out0 = ivec3(x.length(), y.length(), z.length()); 1756 ${OUTPUT} 1757 } 1758 "" 1759 end 1760 1761 case struct 1762 version 300 es 1763 values 1764 { 1765 input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ]; 1766 output ivec3 out0 = [ ivec3(3, 5, 13) ]; 1767 } 1768 1769 both "" 1770 #version 300 es 1771 precision mediump float; 1772 ${DECLARATIONS} 1773 1774 struct test 1775 { 1776 float f; 1777 vec3 v; 1778 }; 1779 1780 void main() 1781 { 1782 ${SETUP} 1783 1784 test a = test(in0.z, vec3(in0.x, in0.y, in0.z)); 1785 test b = test(in0.y, vec3(-in0.z, -in0.x, -in0.y)); 1786 test c = test(in0.x, vec3(-in0.y, in0.z, -in0.x)); 1787 1788 test[] x = test[3] (a, b, c); 1789 test[] y = test[] (c, a, b, b, a); 1790 test[13] z; 1791 1792 out0 = ivec3(x.length(), y.length(), z.length()); 1793 ${OUTPUT} 1794 } 1795 "" 1796 end 1797 1798end # length 1799 1800group invalid "Invalid Functions" 1801 1802 case multidimensional_array1 1803 version 300 es 1804 expect compile_fail 1805 1806 both "" 1807 #version 300 es 1808 precision mediump float; 1809 ${DECLARATIONS} 1810 1811 void main () 1812 { 1813 float a[5][3]; 1814 ${POSITION_FRAG_COLOR} = vec4(1.0); 1815 } 1816 "" 1817 end 1818 1819 case multidimensional_array2 1820 version 300 es 1821 expect compile_fail 1822 1823 both "" 1824 #version 300 es 1825 precision mediump float; 1826 ${DECLARATIONS} 1827 1828 void main () 1829 { 1830 float[5] a[3]; 1831 ${POSITION_FRAG_COLOR} = vec4(1.0); 1832 } 1833 "" 1834 end 1835 1836 case multidimensional_uniform_array 1837 version 300 es 1838 expect compile_fail 1839 1840 both "" 1841 #version 300 es 1842 precision mediump float; 1843 ${DECLARATIONS} 1844 uniform float a[3][2]; 1845 1846 void main () 1847 { 1848 ${POSITION_FRAG_COLOR} = vec4(1.0); 1849 } 1850 "" 1851 end 1852 1853 case multidimensional_array_in_uniform_block 1854 version 300 es 1855 expect compile_fail 1856 1857 both "" 1858 #version 300 es 1859 precision mediump float; 1860 ${DECLARATIONS} 1861 uniform MyBlock 1862 { 1863 float a[3][2]; 1864 }; 1865 1866 void main () 1867 { 1868 ${POSITION_FRAG_COLOR} = vec4(1.0); 1869 } 1870 "" 1871 end 1872 1873 case dynamic_expression_array_size 1874 version 300 es 1875 expect compile_fail 1876 1877 both "" 1878 #version 300 es 1879 precision mediump float; 1880 ${DECLARATIONS} 1881 1882 void main () 1883 { 1884 int a = 5; 1885 float[a] array; 1886 ${POSITION_FRAG_COLOR} = vec4(1.0); 1887 } 1888 "" 1889 end 1890 1891 case empty_declaration_without_var_name 1892 version 300 es 1893 expect compile_or_link_fail 1894 1895 both "" 1896 #version 300 es 1897 precision mediump float; 1898 ${DECLARATIONS} 1899 1900 void main () 1901 { 1902 int[]; 1903 ${POSITION_FRAG_COLOR} = vec4(1.0); 1904 } 1905 "" 1906 end 1907 1908 case empty_declaration_with_var_name 1909 version 300 es 1910 expect compile_or_link_fail 1911 1912 both "" 1913 #version 300 es 1914 precision mediump float; 1915 ${DECLARATIONS} 1916 1917 void main () 1918 { 1919 int[] a; 1920 ${POSITION_FRAG_COLOR} = vec4(1.0); 1921 } 1922 "" 1923 end 1924 1925 case constructor_c_style1 1926 version 300 es 1927 expect compile_fail 1928 1929 both "" 1930 #version 300 es 1931 precision mediump float; 1932 ${DECLARATIONS} 1933 1934 void main () 1935 { 1936 float a[]; 1937 a = float[3] { 1.0, 2.0, 3.0 }; 1938 1939 ${POSITION_FRAG_COLOR} = vec4(1.0); 1940 } 1941 "" 1942 end 1943 1944 case constructor_c_style2 1945 version 300 es 1946 expect compile_fail 1947 1948 both "" 1949 #version 300 es 1950 precision mediump float; 1951 ${DECLARATIONS} 1952 1953 void main () 1954 { 1955 float a[5] = { 1.0, 2.0, 3.0 }; 1956 1957 ${POSITION_FRAG_COLOR} = vec4(1.0); 1958 } 1959 "" 1960 end 1961 1962 case constructor_c_style3 1963 version 300 es 1964 expect compile_fail 1965 1966 both "" 1967 #version 300 es 1968 precision mediump float; 1969 ${DECLARATIONS} 1970 1971 void main () 1972 { 1973 float a[] = float[3] { 1.0, 2.0, 3.0 }; 1974 1975 ${POSITION_FRAG_COLOR} = vec4(1.0); 1976 } 1977 "" 1978 end 1979 1980 case constructor_c_style4 1981 version 300 es 1982 expect compile_fail 1983 1984 both "" 1985 #version 300 es 1986 precision mediump float; 1987 ${DECLARATIONS} 1988 1989 void main () 1990 { 1991 float a[3] = { 1.0, 2.0, 3.0 }; 1992 1993 ${POSITION_FRAG_COLOR} = vec4(1.0); 1994 } 1995 "" 1996 end 1997 1998end # invalid 1999 2000# https://github.com/KhronosGroup/WebGL/blob/master/sdk/tests/conformance2/glsl3/array-in-complex-expression.html 2001group complex_expression "Arrays in complex expressions" 2002 2003 case and_short_circuits 2004 version 300 es 2005 values 2006 { 2007 output int g = -1; 2008 } 2009 2010 both "" 2011 #version 300 es 2012 precision mediump float; 2013 ${DECLARATIONS} 2014 2015 int[2] plus() { 2016 ++g; 2017 return int[2](g, g); 2018 } 2019 2020 bool minus() { 2021 --g; 2022 return false; 2023 } 2024 2025 void main() { 2026 ${SETUP} 2027 g = 0; 2028 int a[2] = int[2](0, 0); 2029 // The plus() call must not be evaluated, since && short-circuits 2030 minus() && (a == plus()); 2031 ${OUTPUT} 2032 } 2033 "" 2034 end 2035 2036 case or_short_circuits 2037 version 300 es 2038 values 2039 { 2040 output int g = -1; 2041 } 2042 2043 both "" 2044 #version 300 es 2045 precision mediump float; 2046 ${DECLARATIONS} 2047 2048 int[2] plus() { 2049 ++g; 2050 return int[2](g, g); 2051 } 2052 2053 bool minus() { 2054 --g; 2055 return false; 2056 } 2057 2058 void main() { 2059 ${SETUP} 2060 g = 0; 2061 int a[2] = int[2](0, 0); 2062 // The function call must not be evaluated, since && short-circuits 2063 minus() && (a == plus()); 2064 ${OUTPUT} 2065 } 2066 "" 2067 end 2068 2069 case ternary_only_evaluates_one_operand 2070 version 300 es 2071 values 2072 { 2073 output int g = 0; 2074 } 2075 2076 both "" 2077 #version 300 es 2078 precision mediump float; 2079 ${DECLARATIONS} 2080 2081 int[2] plus() { 2082 ++g; 2083 return int[2](g, g); 2084 } 2085 2086 void main() { 2087 ${SETUP} 2088 g = 0; 2089 int a[2] = int[2](0, 0); 2090 // The function call must not be evaluated, since the condition is true. 2091 (g == 0) ? true : (a == plus()); 2092 ${OUTPUT} 2093 } 2094 "" 2095 end 2096 2097 case sequence_side_effects_affecting_compared_array_content 2098 version 300 es 2099 values 2100 { 2101 output bool success = true; 2102 } 2103 2104 both "" 2105 #version 300 es 2106 precision mediump float; 2107 ${DECLARATIONS} 2108 2109 int[2] func(int param) { 2110 return int[2](param, param); 2111 } 2112 2113 void main() { 2114 ${SETUP} 2115 int a[2]; 2116 for (int i = 0; i < 2; ++i) { 2117 a[i] = 1; 2118 } 2119 int j = 0; 2120 // Sequence operator evaluates operands from left to right (ESSL 3.00 section 5.9). 2121 // The function call that returns the array needs to be evaluated after ++j 2122 // for the expression to return the correct value (true). 2123 success = ((++j), (a == func(j))); 2124 ${OUTPUT} 2125 } 2126 "" 2127 end 2128 2129end # complex_expression 2130