1 /*------------------------------------------------------------------------- 2 * OpenGL Conformance Test Suite 3 * ----------------------------- 4 * 5 * Copyright (c) 2014-2016 The Khronos Group Inc. 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 */ /*! 20 * \file 21 * \brief 22 */ /*-------------------------------------------------------------------*/ 23 24 /** 25 * \file gl4cShadingLanguage420PackTests.cpp 26 * \brief Implements conformance tests for "Shading Language 420Pack" functionality. 27 */ /*-------------------------------------------------------------------*/ 28 29 #include "gl4cShadingLanguage420PackTests.hpp" 30 31 #include "gluContextInfo.hpp" 32 #include "gluDefs.hpp" 33 #include "glwEnums.hpp" 34 #include "glwFunctions.hpp" 35 #include "tcuTestLog.hpp" 36 37 #include <algorithm> 38 #include <iomanip> 39 #include <stdio.h> 40 #include <string.h> 41 #include <string> 42 #include <vector> 43 44 #define IS_DEBUG 0 45 46 using namespace glw; 47 48 namespace gl4cts 49 { 50 51 namespace GLSL420Pack 52 { 53 /** Check binding of uniform 54 * 55 * @param program Program object 56 * @param name Array name 57 * @param expected_binding Expected binding value 58 * 59 * @return true if binding is as expected, false otherwise 60 **/ 61 bool Utils::checkUniformBinding(Utils::program& program, const glw::GLchar* name, glw::GLint expected_binding) 62 { 63 const GLint uniform_location = program.getUniformLocation(name); 64 if (-1 == uniform_location) 65 { 66 TCU_FAIL("Uniform is inactive"); 67 } 68 69 GLint binding = program.getUniform1i(uniform_location); 70 71 return (expected_binding == binding); 72 } 73 /** Check binding of uniform array element at <index> 74 * 75 * @param program Program object 76 * @param name Array name 77 * @param index Index 78 * @param expected_binding Expected binding value 79 * 80 * @return true if binding is as expected, false otherwise 81 **/ 82 bool Utils::checkUniformArrayBinding(Utils::program& program, const glw::GLchar* name, glw::GLuint index, 83 glw::GLint expected_binding) 84 { 85 GLchar buffer[64]; 86 sprintf(buffer, "%s[%d]", name, index); 87 88 const GLint uniform_location = program.getUniformLocation(buffer); 89 if (-1 == uniform_location) 90 { 91 TCU_FAIL("Uniform is inactive"); 92 } 93 94 GLint binding = program.getUniform1i(uniform_location); 95 96 return (expected_binding == binding); 97 } 98 99 /** Check if given qualifier is present in set 100 * 101 * @param qualifier Specific qualifier 102 * @param qualifiers Qualifiers' set 103 * 104 * @return true if qualifier is present, false otherwise 105 **/ 106 bool Utils::doesContainQualifier(Utils::QUALIFIERS qualifier, const Utils::qualifierSet& qualifiers) 107 { 108 for (GLuint i = 0; i < qualifiers.size(); ++i) 109 { 110 if (qualifiers[i] == qualifier) 111 { 112 return true; 113 } 114 } 115 116 return false; 117 } 118 119 /** Check if given stage supports specific qualifier 120 * 121 * @param stage Shader stage 122 * @param storage Storage of variable 123 * @param qualifier Qualifier 124 * 125 * @return true if qualifier can be used in given stage, false otherwise 126 **/ 127 bool Utils::doesStageSupportQualifier(Utils::SHADER_STAGES stage, Utils::VARIABLE_STORAGE storage, 128 Utils::QUALIFIERS qualifier) 129 { 130 bool result = true; 131 132 switch (stage) 133 { 134 case COMPUTE_SHADER: 135 switch (qualifier) 136 { 137 case QUAL_NONE: 138 case QUAL_UNIFORM: 139 case QUAL_LOWP: 140 case QUAL_MEDIUMP: 141 case QUAL_HIGHP: 142 case QUAL_INVARIANT: 143 result = true; 144 break; 145 default: 146 result = false; 147 break; 148 } 149 break; 150 case FRAGMENT_SHADER: 151 if (QUAL_PATCH == qualifier) 152 { 153 result = false; 154 } 155 else if ((OUTPUT == storage) && 156 ((QUAL_SMOOTH == qualifier) || (QUAL_NOPERSPECTIVE == qualifier) || (QUAL_FLAT == qualifier))) 157 { 158 result = false; 159 } 160 break; 161 case VERTEX_SHADER: 162 if (QUAL_PATCH == qualifier) 163 { 164 result = false; 165 } 166 else if ((INPUT == storage) && 167 ((QUAL_SMOOTH == qualifier) || (QUAL_NOPERSPECTIVE == qualifier) || (QUAL_FLAT == qualifier) || 168 (QUAL_INVARIANT == qualifier) || (QUAL_CENTROID == qualifier) || (QUAL_SAMPLE == qualifier))) 169 { 170 result = false; 171 } 172 break; 173 case GEOMETRY_SHADER: 174 if (QUAL_PATCH == qualifier) 175 { 176 result = false; 177 } 178 break; 179 case TESS_CTRL_SHADER: 180 if ((INPUT == storage) && (QUAL_PATCH == qualifier)) 181 { 182 result = false; 183 } 184 break; 185 case TESS_EVAL_SHADER: 186 if ((OUTPUT == storage) && (QUAL_PATCH == qualifier)) 187 { 188 result = false; 189 } 190 break; 191 default: 192 break; 193 } 194 195 return result; 196 } 197 198 /** Get string for qualifier 199 * 200 * @param qualifier Qualifier 201 * 202 * @return A string for given qualifier 203 **/ 204 const GLchar* Utils::getQualifierString(Utils::QUALIFIERS qualifier) 205 { 206 const GLchar* result = 0; 207 switch (qualifier) 208 { 209 case QUAL_NONE: 210 result = ""; 211 break; 212 case QUAL_CONST: 213 result = "const"; 214 break; 215 case QUAL_IN: 216 result = "in"; 217 break; 218 case QUAL_OUT: 219 result = "out"; 220 break; 221 case QUAL_INOUT: 222 result = "inout"; 223 break; 224 case QUAL_UNIFORM: 225 result = "uniform"; 226 break; 227 case QUAL_PATCH: 228 result = "patch"; 229 break; 230 case QUAL_CENTROID: 231 result = "centroid"; 232 break; 233 case QUAL_SAMPLE: 234 result = "sample"; 235 break; 236 case QUAL_FLAT: 237 result = "flat"; 238 break; 239 case QUAL_NOPERSPECTIVE: 240 result = "noperspective"; 241 break; 242 case QUAL_SMOOTH: 243 result = "smooth"; 244 break; 245 case QUAL_LOCATION: 246 result = "layout (location = LOC_VALUE)"; 247 break; 248 case QUAL_LOWP: 249 result = "lowp"; 250 break; 251 case QUAL_MEDIUMP: 252 result = "mediump"; 253 break; 254 case QUAL_HIGHP: 255 result = "highp"; 256 break; 257 case QUAL_PRECISE: 258 result = "precise"; 259 break; 260 case QUAL_INVARIANT: 261 result = "invariant"; 262 break; 263 default: 264 TCU_FAIL("Invalid enum"); 265 }; 266 267 return result; 268 } 269 270 /** Returns a string with set of qualifiers. 271 * 272 * @param qualifiers Set of qualifiers 273 * 274 * @return String 275 **/ 276 std::string Utils::getQualifiersListString(const qualifierSet& qualifiers) 277 { 278 static const GLchar* qualifier_list = "QUALIFIER QUALIFIER_LIST"; 279 const GLuint qualifier_list_length = static_cast<GLuint>(strlen(qualifier_list)); 280 281 /* Tokens */ 282 static const GLchar* token_qualifier = "QUALIFIER"; 283 static const GLchar* token_qual_list = "QUALIFIER_LIST"; 284 285 /* Variables */ 286 std::string list = token_qual_list; 287 size_t position = 0; 288 289 /* Replace tokens */ 290 for (GLuint i = 0; i < qualifiers.size(); ++i) 291 { 292 Utils::replaceToken(token_qual_list, position, qualifier_list, list); 293 position -= qualifier_list_length; 294 295 const GLchar* qualifier_str = getQualifierString(qualifiers[i]); 296 297 Utils::replaceToken(token_qualifier, position, qualifier_str, list); 298 } 299 300 Utils::replaceToken(token_qual_list, position, "", list); 301 302 return list; 303 } 304 305 /** Prepare a set of qualifiers for given shader stage and variable storage. 306 * Filters out not supported qualifiers from in_qualifiers 307 * 308 * @param in_qualifiers Origiranl set of qualifiers 309 * @param stage Shader stage 310 * @param storage Variable storage 311 * 312 * @return Set of qualifiers 313 **/ 314 Utils::qualifierSet Utils::prepareQualifiersSet(const qualifierSet& in_qualifiers, SHADER_STAGES stage, 315 VARIABLE_STORAGE storage) 316 { 317 qualifierSet result; 318 319 for (GLuint i = 0; i < in_qualifiers.size(); ++i) 320 { 321 Utils::QUALIFIERS qualifier = in_qualifiers[i]; 322 323 if (false == doesStageSupportQualifier(stage, storage, qualifier)) 324 { 325 continue; 326 }; 327 328 /* Replace wrong storage qualifiers */ 329 if ((Utils::INPUT == storage) && ((Utils::QUAL_UNIFORM == qualifier) || (Utils::QUAL_OUT == qualifier))) 330 { 331 qualifier = QUAL_IN; 332 } 333 else if ((Utils::OUTPUT == storage) && ((Utils::QUAL_IN == qualifier) || (Utils::QUAL_UNIFORM == qualifier))) 334 { 335 qualifier = QUAL_OUT; 336 } 337 else if ((Utils::UNIFORM == storage) && ((Utils::QUAL_IN == qualifier) || (Utils::QUAL_OUT == qualifier))) 338 { 339 qualifier = QUAL_UNIFORM; 340 } 341 342 result.push_back(qualifier); 343 } 344 345 return result; 346 } 347 348 /** Get image type for given texture type 349 * 350 * @param type Texture type 351 * 352 * @return String representing sampler type 353 **/ 354 const GLchar* Utils::getImageType(Utils::TEXTURE_TYPES type) 355 { 356 const GLchar* result = 0; 357 358 switch (type) 359 { 360 case TEX_BUFFER: 361 result = "imageBuffer"; 362 break; 363 case TEX_2D: 364 result = "image2D"; 365 break; 366 case TEX_2D_RECT: 367 result = "image2DRect"; 368 break; 369 case TEX_2D_ARRAY: 370 result = "image2DArray"; 371 break; 372 case TEX_3D: 373 result = "image3D"; 374 break; 375 case TEX_CUBE: 376 result = "imageCube"; 377 break; 378 case TEX_1D: 379 result = "image1D"; 380 break; 381 case TEX_1D_ARRAY: 382 result = "image1DArray"; 383 break; 384 default: 385 TCU_FAIL("Invalid enum"); 386 } 387 388 return result; 389 } 390 391 /** Get number of coordinates required to address texture of given type 392 * 393 * @param type Type of texture 394 * 395 * @return Number of coordinates 396 **/ 397 GLuint Utils::getNumberOfCoordinates(Utils::TEXTURE_TYPES type) 398 { 399 GLuint result = 0; 400 401 switch (type) 402 { 403 case TEX_BUFFER: 404 result = 1; 405 break; 406 case TEX_2D: 407 result = 2; 408 break; 409 case TEX_2D_RECT: 410 result = 2; 411 break; 412 case TEX_2D_ARRAY: 413 result = 3; 414 break; 415 case TEX_3D: 416 result = 3; 417 break; 418 case TEX_CUBE: 419 result = 3; 420 break; 421 case TEX_1D: 422 result = 1; 423 break; 424 case TEX_1D_ARRAY: 425 result = 2; 426 break; 427 default: 428 TCU_FAIL("Invalid enum"); 429 } 430 431 return result; 432 } 433 434 /** Get sampler type for given texture type 435 * 436 * @param type Texture type 437 * 438 * @return String representing sampler type 439 **/ 440 const GLchar* Utils::getSamplerType(Utils::TEXTURE_TYPES type) 441 { 442 const GLchar* result = 0; 443 444 switch (type) 445 { 446 case TEX_BUFFER: 447 result = "samplerBuffer"; 448 break; 449 case TEX_2D: 450 result = "sampler2D"; 451 break; 452 case TEX_2D_RECT: 453 result = "sampler2DRect"; 454 break; 455 case TEX_2D_ARRAY: 456 result = "sampler2DArray"; 457 break; 458 case TEX_3D: 459 result = "sampler3D"; 460 break; 461 case TEX_CUBE: 462 result = "samplerCube"; 463 break; 464 case TEX_1D: 465 result = "sampler1D"; 466 break; 467 case TEX_1D_ARRAY: 468 result = "sampler1DArray"; 469 break; 470 default: 471 TCU_FAIL("Invalid enum"); 472 } 473 474 return result; 475 } 476 477 /** Get target for given texture type 478 * 479 * @param type Type of texture 480 * 481 * @return Target 482 **/ 483 GLenum Utils::getTextureTartet(Utils::TEXTURE_TYPES type) 484 { 485 GLenum result = 0; 486 487 switch (type) 488 { 489 case TEX_BUFFER: 490 result = GL_TEXTURE_BUFFER; 491 break; 492 case TEX_2D: 493 result = GL_TEXTURE_2D; 494 break; 495 case TEX_2D_RECT: 496 result = GL_TEXTURE_RECTANGLE; 497 break; 498 case TEX_2D_ARRAY: 499 result = GL_TEXTURE_2D_ARRAY; 500 break; 501 case TEX_3D: 502 result = GL_TEXTURE_3D; 503 break; 504 case TEX_CUBE: 505 result = GL_TEXTURE_CUBE_MAP; 506 break; 507 case TEX_1D: 508 result = GL_TEXTURE_1D; 509 break; 510 case TEX_1D_ARRAY: 511 result = GL_TEXTURE_1D_ARRAY; 512 break; 513 default: 514 TCU_FAIL("Invalid enum"); 515 } 516 517 return result; 518 } 519 520 /** Get name of given texture type 521 * 522 * @param type Texture type 523 * 524 * @return String representing name of texture type 525 **/ 526 const GLchar* Utils::getTextureTypeName(Utils::TEXTURE_TYPES type) 527 { 528 const GLchar* result = 0; 529 530 switch (type) 531 { 532 case TEX_BUFFER: 533 result = "buffer"; 534 break; 535 case TEX_2D: 536 result = "2D"; 537 break; 538 case TEX_2D_RECT: 539 result = "2D rectangle"; 540 break; 541 case TEX_2D_ARRAY: 542 result = "2D array"; 543 break; 544 case TEX_3D: 545 result = "3D"; 546 break; 547 case TEX_CUBE: 548 result = "cube"; 549 break; 550 case TEX_1D: 551 result = "1D"; 552 break; 553 case TEX_1D_ARRAY: 554 result = "1D array"; 555 break; 556 default: 557 TCU_FAIL("Invalid enum"); 558 } 559 560 return result; 561 } 562 563 /** Check if glsl support matrices for specific basic type 564 * 565 * @param type Basic type 566 * 567 * @return true if matrices of <type> are supported, false otherwise 568 **/ 569 bool Utils::doesTypeSupportMatrix(TYPES type) 570 { 571 bool result = false; 572 573 switch (type) 574 { 575 case FLOAT: 576 case DOUBLE: 577 result = true; 578 break; 579 case INT: 580 case UINT: 581 result = false; 582 break; 583 default: 584 TCU_FAIL("Invliad enum"); 585 } 586 587 return result; 588 } 589 590 /** Get string representing name of shader stage 591 * 592 * @param stage Shader stage 593 * 594 * @return String with name of shader stage 595 **/ 596 const glw::GLchar* Utils::getShaderStageName(Utils::SHADER_STAGES stage) 597 { 598 const GLchar* result = 0; 599 600 switch (stage) 601 { 602 case COMPUTE_SHADER: 603 result = "compute"; 604 break; 605 case VERTEX_SHADER: 606 result = "vertex"; 607 break; 608 case TESS_CTRL_SHADER: 609 result = "tesselation control"; 610 break; 611 case TESS_EVAL_SHADER: 612 result = "tesselation evaluation"; 613 break; 614 case GEOMETRY_SHADER: 615 result = "geomtery"; 616 break; 617 case FRAGMENT_SHADER: 618 result = "fragment"; 619 break; 620 default: 621 TCU_FAIL("Invalid enum"); 622 } 623 624 return result; 625 } 626 627 /** Get glsl name of specified type 628 * 629 * @param type Basic type 630 * @param n_columns Number of columns 631 * @param n_rows Number of rows 632 * 633 * @return Name of glsl type 634 **/ 635 const glw::GLchar* Utils::getTypeName(TYPES type, glw::GLuint n_columns, glw::GLuint n_rows) 636 { 637 static const GLchar* float_lut[4][4] = { 638 { "float", "vec2", "vec3", "vec4" }, 639 { 0, "mat2", "mat2x3", "mat2x4" }, 640 { 0, "mat3x2", "mat3", "mat3x4" }, 641 { 0, "mat4x2", "mat4x3", "mat4" }, 642 }; 643 644 static const GLchar* double_lut[4][4] = { 645 { "double", "dvec2", "dvec3", "dvec4" }, 646 { 0, "dmat2", "dmat2x3", "dmat2x4" }, 647 { 0, "dmat3x2", "dmat3", "dmat3x4" }, 648 { 0, "dmat4x2", "dmat4x3", "dmat4" }, 649 }; 650 651 static const GLchar* int_lut[4] = { "int", "ivec2", "ivec3", "ivec4" }; 652 653 static const GLchar* uint_lut[4] = { "uint", "uvec2", "uvec3", "uvec4" }; 654 655 const GLchar* result = 0; 656 657 if ((1 > n_columns) || (1 > n_rows) || (4 < n_columns) || (4 < n_rows)) 658 { 659 return 0; 660 } 661 662 switch (type) 663 { 664 case FLOAT: 665 result = float_lut[n_columns - 1][n_rows - 1]; 666 break; 667 case DOUBLE: 668 result = double_lut[n_columns - 1][n_rows - 1]; 669 break; 670 case INT: 671 result = int_lut[n_rows - 1]; 672 break; 673 case UINT: 674 result = uint_lut[n_rows - 1]; 675 break; 676 default: 677 TCU_FAIL("Invliad enum"); 678 } 679 680 return result; 681 } 682 683 /** Get proper glUniformNdv routine for vectors with specified number of rows 684 * 685 * @param gl GL functions 686 * @param n_rows Number of rows 687 * 688 * @return Function address 689 **/ 690 Utils::uniformNdv Utils::getUniformNdv(const glw::Functions& gl, glw::GLuint n_rows) 691 { 692 uniformNdv result = 0; 693 694 switch (n_rows) 695 { 696 case 1: 697 result = gl.uniform1dv; 698 break; 699 case 2: 700 result = gl.uniform2dv; 701 break; 702 case 3: 703 result = gl.uniform3dv; 704 break; 705 case 4: 706 result = gl.uniform4dv; 707 break; 708 default: 709 TCU_FAIL("Invalid number of rows"); 710 } 711 712 return result; 713 } 714 715 /** Get proper glUniformNfv routine for vectors with specified number of rows 716 * 717 * @param gl GL functions 718 * @param n_rows Number of rows 719 * 720 * @return Function address 721 **/ 722 Utils::uniformNfv Utils::getUniformNfv(const glw::Functions& gl, glw::GLuint n_rows) 723 { 724 uniformNfv result = 0; 725 726 switch (n_rows) 727 { 728 case 1: 729 result = gl.uniform1fv; 730 break; 731 case 2: 732 result = gl.uniform2fv; 733 break; 734 case 3: 735 result = gl.uniform3fv; 736 break; 737 case 4: 738 result = gl.uniform4fv; 739 break; 740 default: 741 TCU_FAIL("Invalid number of rows"); 742 } 743 744 return result; 745 } 746 747 /** Get proper glUniformNiv routine for vectors with specified number of rows 748 * 749 * @param gl GL functions 750 * @param n_rows Number of rows 751 * 752 * @return Function address 753 **/ 754 Utils::uniformNiv Utils::getUniformNiv(const glw::Functions& gl, glw::GLuint n_rows) 755 { 756 uniformNiv result = 0; 757 758 switch (n_rows) 759 { 760 case 1: 761 result = gl.uniform1iv; 762 break; 763 case 2: 764 result = gl.uniform2iv; 765 break; 766 case 3: 767 result = gl.uniform3iv; 768 break; 769 case 4: 770 result = gl.uniform4iv; 771 break; 772 default: 773 TCU_FAIL("Invalid number of rows"); 774 } 775 776 return result; 777 } 778 779 /** Get proper glUniformNuiv routine for vectors with specified number of rows 780 * 781 * @param gl GL functions 782 * @param n_rows Number of rows 783 * 784 * @return Function address 785 **/ 786 Utils::uniformNuiv Utils::getUniformNuiv(const glw::Functions& gl, glw::GLuint n_rows) 787 { 788 uniformNuiv result = 0; 789 790 switch (n_rows) 791 { 792 case 1: 793 result = gl.uniform1uiv; 794 break; 795 case 2: 796 result = gl.uniform2uiv; 797 break; 798 case 3: 799 result = gl.uniform3uiv; 800 break; 801 case 4: 802 result = gl.uniform4uiv; 803 break; 804 default: 805 TCU_FAIL("Invalid number of rows"); 806 } 807 808 return result; 809 } 810 811 /** Get proper glUniformMatrixNdv routine for matrix with specified number of columns and rows 812 * 813 * @param gl GL functions 814 * @param n_rows Number of rows 815 * 816 * @return Function address 817 **/ 818 Utils::uniformMatrixNdv Utils::getUniformMatrixNdv(const glw::Functions& gl, glw::GLuint n_columns, glw::GLuint n_rows) 819 { 820 uniformMatrixNdv result = 0; 821 822 switch (n_columns) 823 { 824 case 2: 825 switch (n_rows) 826 { 827 case 2: 828 result = gl.uniformMatrix2dv; 829 break; 830 case 3: 831 result = gl.uniformMatrix2x3dv; 832 break; 833 case 4: 834 result = gl.uniformMatrix2x4dv; 835 break; 836 default: 837 TCU_FAIL("Invalid number of rows"); 838 } 839 break; 840 case 3: 841 switch (n_rows) 842 { 843 case 2: 844 result = gl.uniformMatrix3x2dv; 845 break; 846 case 3: 847 result = gl.uniformMatrix3dv; 848 break; 849 case 4: 850 result = gl.uniformMatrix3x4dv; 851 break; 852 default: 853 TCU_FAIL("Invalid number of rows"); 854 } 855 break; 856 case 4: 857 switch (n_rows) 858 { 859 case 2: 860 result = gl.uniformMatrix4x2dv; 861 break; 862 case 3: 863 result = gl.uniformMatrix4x3dv; 864 break; 865 case 4: 866 result = gl.uniformMatrix4dv; 867 break; 868 default: 869 TCU_FAIL("Invalid number of rows"); 870 } 871 break; 872 default: 873 TCU_FAIL("Invalid number of columns"); 874 } 875 876 return result; 877 } 878 879 /** Get proper glUniformMatrixNfv routine for vectors with specified number of columns and rows 880 * 881 * @param gl GL functions 882 * @param n_rows Number of rows 883 * 884 * @return Function address 885 **/ 886 Utils::uniformMatrixNfv Utils::getUniformMatrixNfv(const glw::Functions& gl, glw::GLuint n_columns, glw::GLuint n_rows) 887 { 888 uniformMatrixNfv result = 0; 889 890 switch (n_columns) 891 { 892 case 2: 893 switch (n_rows) 894 { 895 case 2: 896 result = gl.uniformMatrix2fv; 897 break; 898 case 3: 899 result = gl.uniformMatrix2x3fv; 900 break; 901 case 4: 902 result = gl.uniformMatrix2x4fv; 903 break; 904 default: 905 TCU_FAIL("Invalid number of rows"); 906 } 907 break; 908 case 3: 909 switch (n_rows) 910 { 911 case 2: 912 result = gl.uniformMatrix3x2fv; 913 break; 914 case 3: 915 result = gl.uniformMatrix3fv; 916 break; 917 case 4: 918 result = gl.uniformMatrix3x4fv; 919 break; 920 default: 921 TCU_FAIL("Invalid number of rows"); 922 } 923 break; 924 case 4: 925 switch (n_rows) 926 { 927 case 2: 928 result = gl.uniformMatrix4x2fv; 929 break; 930 case 3: 931 result = gl.uniformMatrix4x3fv; 932 break; 933 case 4: 934 result = gl.uniformMatrix4fv; 935 break; 936 default: 937 TCU_FAIL("Invalid number of rows"); 938 } 939 break; 940 default: 941 TCU_FAIL("Invalid number of columns"); 942 } 943 944 return result; 945 } 946 947 /** Prepare definition of input or output block's variable 948 * 949 * @param qualifiers Set of qualifiers 950 * @param type_name Name of type 951 * @param variable_name Meaningful part of variable name, eg. tex_coord 952 * 953 * @return Definition of variable 954 **/ 955 std::string Utils::getBlockVariableDefinition(const qualifierSet& qualifiers, const glw::GLchar* type_name, 956 const glw::GLchar* variable_name) 957 { 958 /* Templates */ 959 static const GLchar* def_template = "QUALIFIER_LISTTYPE VARIABLE_NAME"; 960 961 /* Tokens */ 962 static const GLchar* token_type = "TYPE"; 963 static const GLchar* token_variable_name = "VARIABLE_NAME"; 964 static const GLchar* token_qual_list = "QUALIFIER_LIST"; 965 966 /* Variables */ 967 std::string variable_definition = def_template; 968 size_t position = 0; 969 970 /* Get qualifiers list */ 971 const std::string& list = getQualifiersListString(qualifiers); 972 973 /* Replace tokens */ 974 Utils::replaceToken(token_qual_list, position, list.c_str(), variable_definition); 975 Utils::replaceToken(token_type, position, type_name, variable_definition); 976 Utils::replaceToken(token_variable_name, position, variable_name, variable_definition); 977 978 /* Done */ 979 return variable_definition; 980 } 981 982 /** Prepare reference to input or output variable 983 * 984 * @param flavour "Flavour" of variable 985 * @param variable_name Meaningful part of variable name, eg. tex_coord 986 * @param block_name Name of block 987 * 988 * @return Reference to variable 989 **/ 990 std::string Utils::getBlockVariableReference(VARIABLE_FLAVOUR flavour, const glw::GLchar* variable_name, 991 const glw::GLchar* block_name) 992 { 993 /* Templates */ 994 static const GLchar* ref_template = "BLOCK_NAME.VARIABLE_NAME"; 995 static const GLchar* array_ref_template = "BLOCK_NAME[0].VARIABLE_NAME"; 996 static const GLchar* tcs_ref_template = "BLOCK_NAME[gl_InvocationID].VARIABLE_NAME"; 997 998 /* Token */ 999 static const GLchar* token_block_name = "BLOCK_NAME"; 1000 static const GLchar* token_variable_name = "VARIABLE_NAME"; 1001 1002 /* Variables */ 1003 std::string variable_definition; 1004 size_t position = 0; 1005 1006 /* Select variable reference template */ 1007 switch (flavour) 1008 { 1009 case BASIC: 1010 variable_definition = ref_template; 1011 break; 1012 case ARRAY: 1013 variable_definition = array_ref_template; 1014 break; 1015 case INDEXED_BY_INVOCATION_ID: 1016 variable_definition = tcs_ref_template; 1017 break; 1018 default: 1019 variable_definition = ref_template; 1020 break; 1021 } 1022 1023 /* Replace tokens */ 1024 replaceAllTokens(token_block_name, block_name, variable_definition); 1025 replaceToken(token_variable_name, position, variable_name, variable_definition); 1026 1027 /* Done */ 1028 return variable_definition; 1029 } 1030 1031 /** Prepare definition of input or output variable 1032 * 1033 * @param flavour "Flavour" of variable 1034 * @param qualifiers Set of qualifiers 1035 * @param type_name Name of type 1036 * @param variable_name Meaningful part of variable name, eg. tex_coord 1037 * 1038 * @return Definition of variable 1039 **/ 1040 std::string Utils::getVariableDefinition(VARIABLE_FLAVOUR flavour, const qualifierSet& qualifiers, 1041 const glw::GLchar* type_name, const glw::GLchar* variable_name) 1042 { 1043 /* Templates */ 1044 static const GLchar* def_template = "QUALIFIER_LISTTYPE VARIABLE_NAME"; 1045 static const GLchar* def_array_template = "QUALIFIER_LISTTYPE VARIABLE_NAME[]"; 1046 1047 /* Tokens */ 1048 static const GLchar* token_type = "TYPE"; 1049 static const GLchar* token_variable_name = "VARIABLE_NAME"; 1050 static const GLchar* token_qual_list = "QUALIFIER_LIST"; 1051 1052 /* Variables */ 1053 std::string variable_definition; 1054 size_t position = 0; 1055 1056 /* Select variable definition template */ 1057 switch (flavour) 1058 { 1059 case BASIC: 1060 variable_definition = def_template; 1061 break; 1062 case ARRAY: 1063 case INDEXED_BY_INVOCATION_ID: 1064 variable_definition = def_array_template; 1065 break; 1066 default: 1067 TCU_FAIL("Invliad enum"); 1068 break; 1069 } 1070 1071 /* Get qualifiers list */ 1072 const std::string& list = getQualifiersListString(qualifiers); 1073 1074 /* Replace tokens */ 1075 replaceToken(token_qual_list, position, list.c_str(), variable_definition); 1076 replaceToken(token_type, position, type_name, variable_definition); 1077 replaceToken(token_variable_name, position, variable_name, variable_definition); 1078 1079 /* Done */ 1080 return variable_definition; 1081 } 1082 1083 /** Get "flavour" of variable 1084 * 1085 * @param stage Shader stage 1086 * @param storage Storage of variable 1087 * @param qualifiers Set of qualifiers for variable 1088 * 1089 * @return "Flavour" of variable 1090 **/ 1091 Utils::VARIABLE_FLAVOUR Utils::getVariableFlavour(SHADER_STAGES stage, VARIABLE_STORAGE storage, 1092 const qualifierSet& qualifiers) 1093 { 1094 VARIABLE_FLAVOUR result; 1095 1096 if (UNIFORM == storage) 1097 { 1098 result = BASIC; 1099 } 1100 else 1101 { 1102 switch (stage) 1103 { 1104 case Utils::GEOMETRY_SHADER: 1105 if (Utils::INPUT == storage) 1106 { 1107 result = ARRAY; 1108 } 1109 else /* OUTPUT */ 1110 { 1111 result = BASIC; 1112 } 1113 break; 1114 case Utils::TESS_EVAL_SHADER: 1115 if ((false == Utils::doesContainQualifier(Utils::QUAL_PATCH, qualifiers)) && (Utils::INPUT == storage)) 1116 { 1117 result = ARRAY; 1118 } 1119 else /* OUTPUT */ 1120 { 1121 result = BASIC; 1122 } 1123 break; 1124 case Utils::TESS_CTRL_SHADER: 1125 if ((true == Utils::doesContainQualifier(Utils::QUAL_PATCH, qualifiers)) && (Utils::OUTPUT == storage)) 1126 { 1127 result = BASIC; 1128 } 1129 else 1130 { 1131 result = INDEXED_BY_INVOCATION_ID; 1132 } 1133 break; 1134 case Utils::VERTEX_SHADER: 1135 case Utils::FRAGMENT_SHADER: 1136 result = BASIC; 1137 break; 1138 default: 1139 TCU_FAIL("Invliad enum"); 1140 break; 1141 } 1142 } 1143 1144 return result; 1145 } 1146 1147 /** Prepare name of input or output variable 1148 * 1149 * @param stage Shader stage 1150 * @param storage Storage of variable 1151 * @param variable_name Meaningful part of variable name, eg. tex_coord 1152 * 1153 * @return Name of variable 1154 **/ 1155 std::string Utils::getVariableName(SHADER_STAGES stage, VARIABLE_STORAGE storage, const glw::GLchar* variable_name) 1156 { 1157 /* Variable name template */ 1158 static const GLchar* variable_name_template = "PRECEEDING_PREFIX_VARIABLE_NAME"; 1159 1160 /* Tokens */ 1161 static const GLchar* token_preceeding = "PRECEEDING"; 1162 static const GLchar* token_prefix = "PREFIX"; 1163 static const GLchar* token_variable_name = "VARIABLE_NAME"; 1164 1165 static const GLchar* prefixes[Utils::STORAGE_MAX][Utils::SHADER_STAGES_MAX][2] = { 1166 /* COMPUTE, VERTEX, TCS, TES, GEOMETRY, FRAGMENT */ 1167 { { "", "" }, 1168 { "in", "vs" }, 1169 { "vs", "tcs" }, 1170 { "tcs", "tes" }, 1171 { "tes", "gs" }, 1172 { "gs", "fs" } }, /* INPUT */ 1173 { { "", "" }, 1174 { "vs", "tcs" }, 1175 { "tcs", "tes" }, 1176 { "tes", "gs" }, 1177 { "gs", "fs" }, 1178 { "fs", "out" } }, /* OUTPUT */ 1179 { { "uni", "comp" }, 1180 { "uni", "vs" }, 1181 { "uni", "tcs" }, 1182 { "uni", "tes" }, 1183 { "uni", "gs" }, 1184 { "uni", "fs" } } /* UNIFORM */ 1185 }; 1186 1187 /* Variables */ 1188 const GLchar* preceeding = prefixes[storage][stage][0]; 1189 const GLchar* prefix = prefixes[storage][stage][1]; 1190 std::string name = variable_name_template; 1191 size_t position = 0; 1192 1193 /* Replace tokens */ 1194 Utils::replaceToken(token_preceeding, position, preceeding, name); 1195 Utils::replaceToken(token_prefix, position, prefix, name); 1196 Utils::replaceToken(token_variable_name, position, variable_name, name); 1197 1198 /* Done */ 1199 return name; 1200 } 1201 1202 /** Prepare reference to input or output variable 1203 * 1204 * @param flavour "Flavour" of variable 1205 * @param variable_name Meaningful part of variable name, eg. tex_coord 1206 * 1207 * @return Reference to variable 1208 **/ 1209 std::string Utils::getVariableReference(VARIABLE_FLAVOUR flavour, const glw::GLchar* variable_name) 1210 { 1211 /* Templates */ 1212 static const GLchar* ref_template = "VARIABLE_NAME"; 1213 static const GLchar* array_ref_template = "VARIABLE_NAME[0]"; 1214 static const GLchar* tcs_ref_template = "VARIABLE_NAME[gl_InvocationID]"; 1215 1216 /* Token */ 1217 static const GLchar* token_variable_name = "VARIABLE_NAME"; 1218 1219 /* Variables */ 1220 std::string variable_definition; 1221 size_t position = 0; 1222 1223 /* Select variable reference template */ 1224 switch (flavour) 1225 { 1226 case BASIC: 1227 variable_definition = ref_template; 1228 break; 1229 case ARRAY: 1230 variable_definition = array_ref_template; 1231 break; 1232 case INDEXED_BY_INVOCATION_ID: 1233 variable_definition = tcs_ref_template; 1234 break; 1235 default: 1236 variable_definition = ref_template; 1237 break; 1238 } 1239 1240 /* Replace token */ 1241 Utils::replaceToken(token_variable_name, position, variable_name, variable_definition); 1242 1243 /* Done */ 1244 return variable_definition; 1245 } 1246 1247 /** Prepare definition and reference string for block varaible 1248 * 1249 * @param in_stage Shader stage 1250 * @param in_storage Storage of variable 1251 * @param in_qualifiers Set of qualifiers 1252 * @param in_type_name Type name 1253 * @param in_variable_name Meaningful part of variable name, like "color" 1254 * @param in_block_name Name of block, like "input" 1255 * @param out_definition Definition string 1256 * @param out_reference Reference string 1257 **/ 1258 void Utils::prepareBlockVariableStrings(Utils::SHADER_STAGES in_stage, Utils::VARIABLE_STORAGE in_storage, 1259 const Utils::qualifierSet& in_qualifiers, const glw::GLchar* in_type_name, 1260 const glw::GLchar* in_variable_name, const glw::GLchar* in_block_name, 1261 std::string& out_definition, std::string& out_reference) 1262 { 1263 VARIABLE_FLAVOUR flavour = getVariableFlavour(in_stage, in_storage, in_qualifiers); 1264 const qualifierSet& qualifiers = prepareQualifiersSet(in_qualifiers, in_stage, in_storage); 1265 const std::string& name = getVariableName(in_stage, in_storage, in_variable_name); 1266 1267 out_definition = getBlockVariableDefinition(qualifiers, in_type_name, name.c_str()); 1268 out_reference = getBlockVariableReference(flavour, name.c_str(), in_block_name); 1269 } 1270 1271 /** Prepare definition and reference string for block varaible 1272 * 1273 * @param in_stage Shader stage 1274 * @param in_storage Storage of variable 1275 * @param in_qualifiers Set of qualifiers 1276 * @param in_type_name Type name 1277 * @param in_variable_name Meaningful part of variable name, like "color" 1278 * @param out_definition Definition string 1279 * @param out_reference Reference string 1280 **/ 1281 void Utils::prepareVariableStrings(Utils::SHADER_STAGES in_stage, Utils::VARIABLE_STORAGE in_storage, 1282 const Utils::qualifierSet& in_qualifiers, const glw::GLchar* in_type_name, 1283 const glw::GLchar* in_variable_name, std::string& out_definition, 1284 std::string& out_reference) 1285 { 1286 VARIABLE_FLAVOUR flavour = getVariableFlavour(in_stage, in_storage, in_qualifiers); 1287 const qualifierSet& qualifiers = prepareQualifiersSet(in_qualifiers, in_stage, in_storage); 1288 const std::string& name = getVariableName(in_stage, in_storage, in_variable_name); 1289 1290 out_definition = getVariableDefinition(flavour, qualifiers, in_type_name, name.c_str()); 1291 out_reference = getVariableReference(flavour, name.c_str()); 1292 } 1293 1294 /** Returns string with UTF8 character for current test case 1295 * 1296 * @return String with UTF8 character 1297 **/ 1298 const GLchar* Utils::getUtf8Character(Utils::UTF8_CHARACTERS character) 1299 { 1300 static const unsigned char two_bytes[] = { 0xd7, 0x84, 0x00 }; 1301 static const unsigned char three_bytes[] = { 0xe3, 0x82, 0x81, 0x00 }; 1302 static const unsigned char four_bytes[] = { 0xf0, 0x93, 0x83, 0x93, 0x00 }; 1303 static const unsigned char five_bytes[] = { 0xfa, 0x82, 0x82, 0x82, 0x82, 0x00 }; 1304 static const unsigned char six_bytes[] = { 0xfd, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00 }; 1305 static const unsigned char redundant_bytes[] = { 0xf2, 0x80, 0x80, 0x5e, 0x00 }; 1306 1307 const GLchar* result = 0; 1308 1309 switch (character) 1310 { 1311 case TWO_BYTES: 1312 result = (const GLchar*)two_bytes; 1313 break; 1314 case THREE_BYTES: 1315 result = (const GLchar*)three_bytes; 1316 break; 1317 case FOUR_BYTES: 1318 result = (const GLchar*)four_bytes; 1319 break; 1320 case FIVE_BYTES: 1321 result = (const GLchar*)five_bytes; 1322 break; 1323 case SIX_BYTES: 1324 result = (const GLchar*)six_bytes; 1325 break; 1326 case REDUNDANT_ASCII: 1327 result = (const GLchar*)redundant_bytes; 1328 break; 1329 case EMPTY: 1330 result = ""; 1331 break; 1332 default: 1333 TCU_FAIL("Invalid enum"); 1334 } 1335 1336 return result; 1337 } 1338 /** Check if extension is supported 1339 * 1340 * @param context Test context 1341 * @param extension_name Name of extension 1342 * 1343 * @return true if extension is supported, false otherwise 1344 **/ 1345 bool Utils::isExtensionSupported(deqp::Context& context, const GLchar* extension_name) 1346 { 1347 const std::vector<std::string>& extensions = context.getContextInfo().getExtensions(); 1348 1349 if (std::find(extensions.begin(), extensions.end(), extension_name) == extensions.end()) 1350 { 1351 return false; 1352 } 1353 1354 return true; 1355 } 1356 1357 /** Check if GL context meets version requirements 1358 * 1359 * @param gl Functions 1360 * @param required_major Minimum required MAJOR_VERSION 1361 * @param required_minor Minimum required MINOR_VERSION 1362 * 1363 * @return true if GL context version is at least as requested, false otherwise 1364 **/ 1365 bool Utils::isGLVersionAtLeast(const glw::Functions& gl, glw::GLint required_major, glw::GLint required_minor) 1366 { 1367 glw::GLint major = 0; 1368 glw::GLint minor = 0; 1369 1370 gl.getIntegerv(GL_MAJOR_VERSION, &major); 1371 gl.getIntegerv(GL_MINOR_VERSION, &minor); 1372 1373 GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv"); 1374 1375 if (major > required_major) 1376 { 1377 /* Major is higher than required one */ 1378 return true; 1379 } 1380 else if (major == required_major) 1381 { 1382 if (minor >= required_minor) 1383 { 1384 /* Major is equal to required one */ 1385 /* Minor is higher than or equal to required one */ 1386 return true; 1387 } 1388 else 1389 { 1390 /* Major is equal to required one */ 1391 /* Minor is lower than required one */ 1392 return false; 1393 } 1394 } 1395 else 1396 { 1397 /* Major is lower than required one */ 1398 return false; 1399 } 1400 } 1401 1402 /** Replace first occurance of <token> with <text> in <string> starting at <search_posistion> 1403 * 1404 * @param token Token string 1405 * @param search_position Position at which find will start, it is updated to position at which replaced text ends 1406 * @param text String that will be used as replacement for <token> 1407 * @param string String to work on 1408 **/ 1409 void Utils::replaceToken(const glw::GLchar* token, size_t& search_position, const glw::GLchar* text, 1410 std::string& string) 1411 { 1412 const size_t text_length = strlen(text); 1413 const size_t token_length = strlen(token); 1414 const size_t token_position = string.find(token, search_position); 1415 1416 string.replace(token_position, token_length, text, text_length); 1417 1418 search_position = token_position + text_length; 1419 } 1420 1421 /** Replace all occurances of <token> with <text> in <string> 1422 * 1423 * @param token Token string 1424 * @param text String that will be used as replacement for <token> 1425 * @param string String to work on 1426 **/ 1427 void Utils::replaceAllTokens(const glw::GLchar* token, const glw::GLchar* text, std::string& string) 1428 { 1429 const size_t text_length = strlen(text); 1430 const size_t token_length = strlen(token); 1431 1432 size_t search_position = 0; 1433 1434 while (1) 1435 { 1436 const size_t token_position = string.find(token, search_position); 1437 1438 if (std::string::npos == token_position) 1439 { 1440 break; 1441 } 1442 1443 search_position = token_position + text_length; 1444 1445 string.replace(token_position, token_length, text, text_length); 1446 } 1447 } 1448 1449 /** Constructor 1450 * 1451 * @param context Test context 1452 * @param test_name Test name 1453 * @param test_description Test description 1454 **/ 1455 TestBase::TestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description) 1456 : TestCase(context, test_name, test_description) 1457 , m_is_compute_shader_supported(false) 1458 , m_is_explicit_uniform_location(false) 1459 , m_is_shader_language_420pack(false) 1460 { 1461 /* Nothing to be done here */ 1462 } 1463 1464 /** Execute test 1465 * 1466 * @return tcu::TestNode::CONTINUE after executing test case, tcu::TestNode::STOP otherwise 1467 **/ 1468 tcu::TestNode::IterateResult TestBase::iterate() 1469 { 1470 /* GL entry points */ 1471 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 1472 1473 /* Check extension support and version */ 1474 m_is_explicit_uniform_location = Utils::isExtensionSupported(m_context, "GL_ARB_explicit_uniform_location"); 1475 m_is_shader_language_420pack = Utils::isExtensionSupported(m_context, "GL_ARB_shading_language_420pack"); 1476 m_is_compute_shader_supported = Utils::isGLVersionAtLeast(gl, 4, 3); 1477 1478 /* Execute test */ 1479 bool test_result = test(); 1480 1481 /* Set result */ 1482 if (true == test_result) 1483 { 1484 m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Pass"); 1485 } 1486 else 1487 { 1488 m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 1489 } 1490 1491 /* Done */ 1492 return tcu::TestNode::STOP; 1493 } 1494 1495 /** Basic implementation of getShaderSourceConfig method. 1496 * 1497 * @param out_n_parts Number of source parts used by this test case 1498 * @param out_use_lengths If source lengths shall be provided to compiler 1499 **/ 1500 void TestBase::getShaderSourceConfig(glw::GLuint& out_n_parts, bool& out_use_lengths) 1501 { 1502 out_n_parts = 1; 1503 out_use_lengths = false; 1504 } 1505 1506 /** Basic implementation of prepareNextTestCase method. 1507 * 1508 * @param test_case_index Index of test case 1509 * 1510 * @return true if index is -1 or 0, false otherwise 1511 **/ 1512 bool TestBase::prepareNextTestCase(GLuint test_case_index) 1513 { 1514 if (((GLuint)-1 == test_case_index) || (0 == test_case_index)) 1515 { 1516 return true; 1517 } 1518 else 1519 { 1520 return false; 1521 } 1522 } 1523 1524 /** Basic implementation of prepareUniforms method 1525 * 1526 * @param ignored 1527 **/ 1528 void TestBase::prepareUniforms(Utils::program& /* program */) 1529 { 1530 /* Nothing to be done */ 1531 } 1532 1533 /** Basic implementation of testInit method 1534 * 1535 * @return true if test can be executed, false otherwise 1536 **/ 1537 bool TestBase::testInit() 1538 { 1539 return true; 1540 } 1541 1542 /** Get layout specific for given stage 1543 * 1544 * @param stage Shader stage 1545 * 1546 * @return Stage specific part 1547 **/ 1548 const GLchar* TestBase::getStageSpecificLayout(Utils::SHADER_STAGES stage) const 1549 { 1550 static const GLchar* stage_layout_geometry = "layout(points) in;\n" 1551 "layout(triangle_strip, max_vertices = 4) out;\n"; 1552 static const GLchar* stage_layout_tess_ctrl = "layout(vertices = 1) out;\n"; 1553 static const GLchar* stage_layout_tess_eval = "layout(isolines, point_mode) in;\n"; 1554 1555 const GLchar* result = ""; 1556 1557 switch (stage) 1558 { 1559 case Utils::GEOMETRY_SHADER: 1560 result = stage_layout_geometry; 1561 break; 1562 case Utils::TESS_CTRL_SHADER: 1563 result = stage_layout_tess_ctrl; 1564 break; 1565 case Utils::TESS_EVAL_SHADER: 1566 result = stage_layout_tess_eval; 1567 break; 1568 case Utils::VERTEX_SHADER: 1569 case Utils::FRAGMENT_SHADER: 1570 default: 1571 break; 1572 } 1573 1574 return result; 1575 } 1576 1577 /** Get "version" string 1578 * 1579 * @param stage Shader stage, compute shader will use 430 1580 * @param use_version_400 Select if 400 or 420 should be used 1581 * 1582 * @return Version string 1583 **/ 1584 const GLchar* TestBase::getVersionString(Utils::SHADER_STAGES stage, bool use_version_400) const 1585 { 1586 static const GLchar* version_400 = "#version 400\n" 1587 "#extension GL_ARB_shading_language_420pack : require\n" 1588 "#extension GL_ARB_separate_shader_objects : enable"; 1589 static const GLchar* version_420 = "#version 420"; 1590 static const GLchar* version_430 = "#version 430"; 1591 1592 const GLchar* result = ""; 1593 1594 if (Utils::COMPUTE_SHADER == stage) 1595 { 1596 result = version_430; 1597 } 1598 else if (true == use_version_400) 1599 { 1600 result = version_400; 1601 } 1602 else 1603 { 1604 result = version_420; 1605 } 1606 1607 return result; 1608 } 1609 1610 /** Initialize shaderSource instance, reserve storage and prepare shader source 1611 * 1612 * @param in_stage Shader stage 1613 * @param in_use_version_400 If version 400 or 420 should be used 1614 * @param out_source Shader source instance 1615 **/ 1616 void TestBase::initShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, Utils::shaderSource& out_source) 1617 { 1618 /* Shader source configuration */ 1619 glw::GLuint n_parts = 0; 1620 bool use_lengths = false; 1621 1622 getShaderSourceConfig(n_parts, use_lengths); 1623 1624 out_source.m_parts.resize(n_parts); 1625 out_source.m_use_lengths = use_lengths; 1626 1627 /* Request child class to prepare shader sources */ 1628 prepareShaderSource(in_stage, in_use_version_400, out_source); 1629 1630 /* Prepare source lengths */ 1631 if (true == use_lengths) 1632 { 1633 for (GLuint i = 0; i < n_parts; ++i) 1634 { 1635 out_source.m_parts[i].m_length = static_cast<glw::GLint>(out_source.m_parts[i].m_code.length()); 1636 1637 out_source.m_parts[i].m_code.append("This should be ignored by compiler, as source length is provided"); 1638 } 1639 } 1640 else 1641 { 1642 for (GLuint i = 0; i < n_parts; ++i) 1643 { 1644 out_source.m_parts[i].m_length = 0; 1645 } 1646 } 1647 } 1648 1649 /** Execute test 1650 * 1651 * @return true if test pass, false otherwise 1652 **/ 1653 bool TestBase::test() 1654 { 1655 bool result = true; 1656 GLuint test_case_index = 0; 1657 1658 /* Prepare test cases */ 1659 testInit(); 1660 1661 /* GL entry points */ 1662 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 1663 1664 /* Tesselation patch set up */ 1665 gl.patchParameteri(GL_PATCH_VERTICES, 1); 1666 GLU_EXPECT_NO_ERROR(gl.getError(), "PatchParameteri"); 1667 1668 while (true == prepareNextTestCase(test_case_index)) 1669 { 1670 bool case_result = true; 1671 1672 /* Execute drawing case */ 1673 if (false == testDrawArray(false)) 1674 { 1675 case_result = false; 1676 } 1677 1678 if (true == m_is_shader_language_420pack) 1679 { 1680 if (false == testDrawArray(true)) 1681 { 1682 case_result = false; 1683 } 1684 } 1685 1686 /* Execute compute shader case */ 1687 if (true == m_is_compute_shader_supported) 1688 { 1689 if (false == testCompute()) 1690 { 1691 case_result = false; 1692 } 1693 } 1694 1695 /* Log failure */ 1696 if (false == case_result) 1697 { 1698 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Test case failed." 1699 << tcu::TestLog::EndMessage; 1700 1701 result = false; 1702 } 1703 1704 /* Go to next test case */ 1705 test_case_index += 1; 1706 } 1707 1708 /* Done */ 1709 return result; 1710 } 1711 1712 /** Constructor 1713 * 1714 * @param context Test context 1715 * @param test_name Name of test 1716 * @param test_description Description of test 1717 **/ 1718 APITestBase::APITestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description) 1719 : TestBase(context, test_name, test_description) 1720 { 1721 /* Nothing to be done here */ 1722 } 1723 1724 /** Execute test with compute shader 1725 * 1726 * @return true if test pass, false otherwise 1727 **/ 1728 bool APITestBase::testCompute() 1729 { 1730 /* GL objects */ 1731 Utils::program program(m_context); 1732 1733 /* Shaders */ 1734 Utils::shaderSource compute_shader; 1735 initShaderSource(Utils::COMPUTE_SHADER, false, compute_shader); 1736 1737 /* Check if test support compute shaders */ 1738 if (true == compute_shader.m_parts[0].m_code.empty()) 1739 { 1740 return true; 1741 } 1742 1743 /* Build program */ 1744 try 1745 { 1746 program.build(compute_shader, 0 /* fragment shader */, 0 /* geometry shader */, 1747 0 /* tesselation control shader */, 0 /* tesselation evaluation shader */, 0 /* vertex shader */, 1748 0 /* varying names */, 0 /* n varying names */, false); 1749 } 1750 catch (Utils::shaderCompilationException& exc) 1751 { 1752 /* Something wrong with compilation, test case failed */ 1753 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 1754 1755 message << "Shader compilation failed. Error message: " << exc.m_error_message; 1756 1757 Utils::program::printShaderSource(exc.m_shader_source, message); 1758 1759 message << tcu::TestLog::EndMessage; 1760 1761 return false; 1762 } 1763 catch (Utils::programLinkageException& exc) 1764 { 1765 /* Something wrong with linking, test case failed */ 1766 m_context.getTestContext().getLog() << tcu::TestLog::Message 1767 << "Program linking failed. Error message: " << exc.m_error_message 1768 << tcu::TestLog::EndMessage; 1769 return false; 1770 } 1771 1772 /* Set current program */ 1773 program.use(); 1774 1775 /* Return result of verification */ 1776 return checkResults(program); 1777 } 1778 1779 /** Execute test with VS, TCS, TES, GS and FS 1780 * 1781 * @param use_version_400 Select if 400 or 420 should be used 1782 * 1783 * @return true if test pass, false otherwise 1784 **/ 1785 bool APITestBase::testDrawArray(bool use_version_400) 1786 { 1787 /* GL objects */ 1788 Utils::program program(m_context); 1789 1790 /* Shaders */ 1791 Utils::shaderSource fragment_data; 1792 Utils::shaderSource geometry_data; 1793 Utils::shaderSource tess_ctrl_data; 1794 Utils::shaderSource tess_eval_data; 1795 Utils::shaderSource vertex_data; 1796 1797 initShaderSource(Utils::FRAGMENT_SHADER, use_version_400, fragment_data); 1798 initShaderSource(Utils::GEOMETRY_SHADER, use_version_400, geometry_data); 1799 initShaderSource(Utils::TESS_CTRL_SHADER, use_version_400, tess_ctrl_data); 1800 initShaderSource(Utils::TESS_EVAL_SHADER, use_version_400, tess_eval_data); 1801 initShaderSource(Utils::VERTEX_SHADER, use_version_400, vertex_data); 1802 1803 /* Build program */ 1804 try 1805 { 1806 program.build(0 /* compute shader */, fragment_data, geometry_data, tess_ctrl_data, tess_eval_data, vertex_data, 1807 0 /* varying names */, 0 /* n varying names */, false); 1808 } 1809 catch (Utils::shaderCompilationException& exc) 1810 { 1811 /* Something wrong with compilation, test case failed */ 1812 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 1813 1814 message << "Shader compilation failed. Error message: " << exc.m_error_message; 1815 1816 Utils::program::printShaderSource(exc.m_shader_source, message); 1817 1818 message << tcu::TestLog::EndMessage; 1819 1820 return false; 1821 } 1822 catch (Utils::programLinkageException& exc) 1823 { 1824 /* Something wrong with linking, test case failed */ 1825 m_context.getTestContext().getLog() << tcu::TestLog::Message 1826 << "Program linking failed. Error message: " << exc.m_error_message 1827 << tcu::TestLog::EndMessage; 1828 return false; 1829 } 1830 1831 /* Set current program */ 1832 program.use(); 1833 1834 /* Return result of verification */ 1835 return checkResults(program); 1836 } 1837 1838 /* Constants used by GLSLTestBase */ 1839 const glw::GLenum GLSLTestBase::m_color_texture_internal_format = GL_RGBA8; 1840 const glw::GLenum GLSLTestBase::m_color_texture_format = GL_RGBA; 1841 const glw::GLenum GLSLTestBase::m_color_texture_type = GL_UNSIGNED_BYTE; 1842 const glw::GLuint GLSLTestBase::m_color_texture_width = 16; 1843 const glw::GLuint GLSLTestBase::m_color_texture_height = 16; 1844 1845 /** Constructor 1846 * 1847 * @param context Test context 1848 * @param test_name Test name 1849 * @param test_description Test description 1850 **/ 1851 GLSLTestBase::GLSLTestBase(deqp::Context& context, const glw::GLchar* test_name, const glw::GLchar* test_description) 1852 : TestBase(context, test_name, test_description) 1853 { 1854 /* Nothing to be done here */ 1855 } 1856 1857 /** Basic implementation of prepareSourceTexture method. 1858 * 1859 * @param ignored Texture instance 1860 * 1861 * @return 0 1862 **/ 1863 const GLchar* GLSLTestBase::prepareSourceTexture(Utils::texture&) 1864 { 1865 return 0; 1866 } 1867 1868 /** Basic implementation of prepareVertexBuffer method. 1869 * 1870 * @param ignored Program instance 1871 * @param ignored Buffer instance 1872 * @param vao VertexArray instance 1873 * 1874 * @return 0 1875 **/ 1876 void GLSLTestBase::prepareVertexBuffer(const Utils::program&, Utils::buffer&, Utils::vertexArray& vao) 1877 { 1878 vao.generate(); 1879 vao.bind(); 1880 } 1881 1882 /** Basic implementation of verifyAdditionalResults 1883 * 1884 * @return true 1885 **/ 1886 bool GLSLTestBase::verifyAdditionalResults() const 1887 { 1888 return true; 1889 } 1890 1891 /** Basic implementation of releaseResource method 1892 * 1893 * @param ignored 1894 **/ 1895 void GLSLTestBase::releaseResource() 1896 { 1897 /* Nothing to be done */ 1898 } 1899 1900 /** Bind texture to first image unit and set image uniform to that unit 1901 * 1902 * @param program Program object 1903 * @param texture Texture object 1904 * @param uniform_name Name of image uniform 1905 **/ 1906 void GLSLTestBase::bindTextureToimage(Utils::program& program, Utils::texture& texture, 1907 const glw::GLchar* uniform_name) const 1908 { 1909 /* GL entry points */ 1910 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 1911 1912 gl.bindImageTexture(0 /* unit */, texture.m_id, 0 /* level */, GL_FALSE /* layered */, 0 /* layer */, GL_WRITE_ONLY, 1913 GL_RGBA8); 1914 GLU_EXPECT_NO_ERROR(gl.getError(), "BindImageTexture"); 1915 1916 GLint location = program.getUniformLocation(uniform_name); 1917 gl.uniform1i(location, 0); 1918 GLU_EXPECT_NO_ERROR(gl.getError(), "Uniform1i"); 1919 } 1920 1921 /** Bind texture to first texture unit and set sampler uniform to that unit 1922 * 1923 * @param program Program object 1924 * @param texture Texture object 1925 * @param uniform_name Name of sampler uniform 1926 **/ 1927 void GLSLTestBase::bindTextureToSampler(Utils::program& program, Utils::texture& texture, 1928 const glw::GLchar* uniform_name) const 1929 { 1930 /* GL entry points */ 1931 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 1932 1933 gl.activeTexture(GL_TEXTURE0); 1934 GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture"); 1935 1936 texture.bind(); 1937 1938 GLint location = program.getUniformLocation(uniform_name); 1939 gl.uniform1i(location, 0); 1940 GLU_EXPECT_NO_ERROR(gl.getError(), "Uniform1i"); 1941 } 1942 1943 /** Check contents of texture. It is expected that it will be filled with green color 1944 * 1945 * @param color_texture Texture that will be verified 1946 * 1947 * @return true if texture is all green, false otherwise 1948 **/ 1949 bool GLSLTestBase::checkResults(Utils::texture& color_texture) const 1950 { 1951 static const GLuint green_color = 0xff00ff00; 1952 const GLuint texture_data_size = m_color_texture_width * m_color_texture_height; 1953 std::vector<glw::GLuint> texture_data; 1954 1955 texture_data.resize(texture_data_size); 1956 1957 color_texture.get(m_color_texture_format, m_color_texture_type, &texture_data[0]); 1958 1959 for (GLuint i = 0; i < texture_data_size; ++i) 1960 { 1961 if (green_color != texture_data[i]) 1962 { 1963 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Invalid texel: " << std::setbase(16) 1964 << std::setfill('0') << std::setw(8) << texture_data[i] 1965 << " at index: " << i << tcu::TestLog::EndMessage; 1966 1967 return false; 1968 } 1969 } 1970 1971 return verifyAdditionalResults(); 1972 } 1973 1974 /** Prepare framebuffer with texture used as attachment 1975 * 1976 * @param framebuffer Framebuffer 1977 * @param color_texture Textue used as color attachment 0 1978 **/ 1979 void GLSLTestBase::prepareFramebuffer(Utils::framebuffer& framebuffer, Utils::texture& color_texture) const 1980 { 1981 framebuffer.generate(); 1982 1983 color_texture.create(m_color_texture_width, m_color_texture_height, m_color_texture_internal_format); 1984 1985 framebuffer.attachTexture(GL_COLOR_ATTACHMENT0, color_texture.m_id, m_color_texture_width, m_color_texture_height); 1986 1987 framebuffer.clearColor(0.0f, 0.0f, 0.0f, 0.0f); 1988 framebuffer.clear(GL_COLOR_BUFFER_BIT); 1989 } 1990 1991 /** Prepare texture and bind it to image uniform 1992 * 1993 * @param framebuffer Framebuffer 1994 * @param color_texture Textue used as color attachment 0 1995 **/ 1996 void GLSLTestBase::prepareImage(Utils::program& program, Utils::texture& color_texture) const 1997 { 1998 color_texture.create(m_color_texture_width, m_color_texture_height, m_color_texture_internal_format); 1999 2000 bindTextureToimage(program, color_texture, "uni_image"); 2001 } 2002 2003 /** Execute test with compute shader 2004 * 2005 * @return true if test pass, false otherwise 2006 **/ 2007 bool GLSLTestBase::testCompute() 2008 { 2009 /* Test Result */ 2010 bool result = true; 2011 2012 /* GL objects */ 2013 Utils::texture color_tex(m_context); 2014 Utils::program program(m_context); 2015 Utils::texture source_tex(m_context); 2016 2017 /* Shaders */ 2018 Utils::shaderSource compute_shader; 2019 initShaderSource(Utils::COMPUTE_SHADER, false, compute_shader); 2020 2021 /* Check if test support compute shaders */ 2022 if (true == compute_shader.m_parts[0].m_code.empty()) 2023 { 2024 return true; 2025 } 2026 2027 /* Build program */ 2028 try 2029 { 2030 program.build(compute_shader, 0 /* fragment shader */, 0 /* geometry shader */, 2031 0 /* tesselation control shader */, 0 /* tesselation evaluation shader */, 0 /* vertex shader */, 2032 0 /* varying names */, 0 /* n varying names */, false); 2033 } 2034 catch (Utils::shaderCompilationException& exc) 2035 { 2036 /* Something wrong with compilation, test case failed */ 2037 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 2038 2039 message << "Shader compilation failed. Error message: " << exc.m_error_message; 2040 2041 Utils::program::printShaderSource(exc.m_shader_source, message); 2042 2043 message << tcu::TestLog::EndMessage; 2044 2045 return false; 2046 } 2047 catch (Utils::programLinkageException& exc) 2048 { 2049 /* Something wrong with linking, test case failed */ 2050 m_context.getTestContext().getLog() << tcu::TestLog::Message 2051 << "Program linking failed. Error message: " << exc.m_error_message 2052 << tcu::TestLog::EndMessage; 2053 return false; 2054 } 2055 2056 /* Log shaders, for debugging */ 2057 #if IS_DEBUG 2058 { 2059 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 2060 2061 Utils::program::printShaderSource(compute_shader, message); 2062 2063 message << tcu::TestLog::EndMessage; 2064 } 2065 #endif /* IS_DEBUG */ 2066 2067 /* Set current program */ 2068 program.use(); 2069 2070 /* Prepare image unit */ 2071 prepareImage(program, color_tex); 2072 2073 /* Test specific preparation of source texture */ 2074 const GLchar* sampler_name = prepareSourceTexture(source_tex); 2075 if (0 != sampler_name) 2076 { 2077 bindTextureToSampler(program, source_tex, sampler_name); 2078 } 2079 2080 /* Set up uniforms */ 2081 prepareUniforms(program); 2082 2083 /* GL entry points */ 2084 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 2085 2086 /* Draw */ 2087 gl.dispatchCompute(m_color_texture_width, m_color_texture_height, 1); 2088 GLU_EXPECT_NO_ERROR(gl.getError(), "DispatchCompute"); 2089 2090 /* Return result of verification */ 2091 result = checkResults(color_tex); 2092 2093 /* Release extra resource for the test */ 2094 releaseResource(); 2095 2096 return result; 2097 } 2098 2099 /** Execute test with draw array operation 2100 * 2101 * @param use_version_400 Select if 400 or 420 should be used 2102 * 2103 * @return true if test pass, false otherwise 2104 **/ 2105 bool GLSLTestBase::testDrawArray(bool use_version_400) 2106 { 2107 /* Test Result */ 2108 bool result = true; 2109 2110 /* GL objects */ 2111 Utils::texture color_tex(m_context); 2112 Utils::framebuffer framebuffer(m_context); 2113 Utils::program program(m_context); 2114 Utils::texture source_tex(m_context); 2115 Utils::vertexArray vao(m_context); 2116 Utils::buffer vertex_buffer(m_context); 2117 2118 /* Shaders */ 2119 Utils::shaderSource fragment_data; 2120 Utils::shaderSource geometry_data; 2121 Utils::shaderSource tess_ctrl_data; 2122 Utils::shaderSource tess_eval_data; 2123 Utils::shaderSource vertex_data; 2124 2125 initShaderSource(Utils::FRAGMENT_SHADER, use_version_400, fragment_data); 2126 initShaderSource(Utils::GEOMETRY_SHADER, use_version_400, geometry_data); 2127 initShaderSource(Utils::TESS_CTRL_SHADER, use_version_400, tess_ctrl_data); 2128 initShaderSource(Utils::TESS_EVAL_SHADER, use_version_400, tess_eval_data); 2129 initShaderSource(Utils::VERTEX_SHADER, use_version_400, vertex_data); 2130 2131 /* Build program */ 2132 try 2133 { 2134 program.build(0 /* compute shader */, fragment_data, geometry_data, tess_ctrl_data, tess_eval_data, vertex_data, 2135 0 /* varying names */, 0 /* n varying names */, false); 2136 } 2137 catch (Utils::shaderCompilationException& exc) 2138 { 2139 /* Something wrong with compilation, test case failed */ 2140 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 2141 2142 message << "Shader compilation failed. Error message: " << exc.m_error_message; 2143 2144 Utils::program::printShaderSource(exc.m_shader_source, message); 2145 2146 message << tcu::TestLog::EndMessage; 2147 2148 return false; 2149 } 2150 catch (Utils::programLinkageException& exc) 2151 { 2152 /* Something wrong with linking, test case failed */ 2153 m_context.getTestContext().getLog() << tcu::TestLog::Message 2154 << "Program linking failed. Error message: " << exc.m_error_message 2155 << tcu::TestLog::EndMessage; 2156 return false; 2157 } 2158 2159 /* Log shaders, for debugging */ 2160 #if IS_DEBUG 2161 { 2162 const Utils::shaderSource* data[] = { &vertex_data, &tess_ctrl_data, &tess_eval_data, &geometry_data, 2163 &fragment_data }; 2164 2165 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 2166 2167 for (GLuint i = 0; i < 5; ++i) 2168 { 2169 Utils::program::printShaderSource(*data[i], message); 2170 } 2171 2172 message << tcu::TestLog::EndMessage; 2173 } 2174 #endif /* IS_DEBUG */ 2175 2176 /* Test specific preparation of vertex buffer and vao*/ 2177 prepareVertexBuffer(program, vertex_buffer, vao); 2178 2179 /* Set current program */ 2180 program.use(); 2181 2182 /* Prepare framebuffer */ 2183 prepareFramebuffer(framebuffer, color_tex); 2184 2185 /* Test specific preparation of source texture */ 2186 const GLchar* sampler_name = prepareSourceTexture(source_tex); 2187 if (0 != sampler_name) 2188 { 2189 bindTextureToSampler(program, source_tex, sampler_name); 2190 } 2191 2192 /* Set up uniforms */ 2193 prepareUniforms(program); 2194 2195 /* GL entry points */ 2196 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 2197 2198 /* Draw */ 2199 gl.drawArrays(GL_PATCHES, 0 /* first */, 1 /* count */); 2200 GLU_EXPECT_NO_ERROR(gl.getError(), "DrawArrays"); 2201 2202 /* Return result of verification */ 2203 result = checkResults(color_tex); 2204 2205 /* Release extra resource for the test */ 2206 releaseResource(); 2207 2208 return result; 2209 } 2210 2211 /** Constructor 2212 * 2213 * @param context Test context 2214 * @param test_name Test name 2215 * @param test_description Test description 2216 **/ 2217 NegativeTestBase::NegativeTestBase(deqp::Context& context, const glw::GLchar* test_name, 2218 const glw::GLchar* test_description) 2219 : TestBase(context, test_name, test_description) 2220 { 2221 /* Nothing to be done here */ 2222 } 2223 2224 /** Execute test with compute shader 2225 * 2226 * @return true if test pass, false otherwise 2227 **/ 2228 bool NegativeTestBase::testCompute() 2229 { 2230 /* GL objects */ 2231 Utils::program program(m_context); 2232 2233 /* Shaders */ 2234 Utils::shaderSource conmpute_data; 2235 initShaderSource(Utils::COMPUTE_SHADER, false, conmpute_data); 2236 2237 /* Build program */ 2238 try 2239 { 2240 program.build(conmpute_data /* compute shader */, 0 /* fragment shader */, 0 /* geometry shader */, 2241 0 /* tesselation control shader */, 0 /* tesselation evaluation shader */, 0 /* vertex shader */, 2242 0 /* varying names */, 0 /* n varying names */, false); 2243 } 2244 catch (Utils::shaderCompilationException& exc) 2245 { 2246 /* Compilation failed, as expected. Verify that reason of failure is as expected */ 2247 m_context.getTestContext().getLog() << tcu::TestLog::Message 2248 << "Shader compilation error message: " << exc.m_error_message 2249 << tcu::TestLog::EndMessage; 2250 return true; 2251 } 2252 catch (Utils::programLinkageException& exc) 2253 { 2254 /* Something wrong with linking, test case failed */ 2255 m_context.getTestContext().getLog() << tcu::TestLog::Message 2256 << "Program linking failed. Error message: " << exc.m_error_message 2257 << tcu::TestLog::EndMessage; 2258 return true; 2259 } 2260 2261 /* Build process succeded */ 2262 return false; 2263 } 2264 2265 /** Execute test with draw array operation 2266 * 2267 * @param use_version_400 Select if 400 or 420 should be used 2268 * 2269 * @return true if test pass, false otherwise 2270 **/ 2271 bool NegativeTestBase::testDrawArray(bool use_version_400) 2272 { 2273 /* GL objects */ 2274 Utils::program program(m_context); 2275 2276 /* Shaders */ 2277 Utils::shaderSource fragment_data; 2278 Utils::shaderSource geometry_data; 2279 Utils::shaderSource tess_ctrl_data; 2280 Utils::shaderSource tess_eval_data; 2281 Utils::shaderSource vertex_data; 2282 2283 initShaderSource(Utils::FRAGMENT_SHADER, use_version_400, fragment_data); 2284 initShaderSource(Utils::GEOMETRY_SHADER, use_version_400, geometry_data); 2285 initShaderSource(Utils::TESS_CTRL_SHADER, use_version_400, tess_ctrl_data); 2286 initShaderSource(Utils::TESS_EVAL_SHADER, use_version_400, tess_eval_data); 2287 initShaderSource(Utils::VERTEX_SHADER, use_version_400, vertex_data); 2288 2289 /* Build program */ 2290 try 2291 { 2292 program.build(0 /* compute shader */, fragment_data, geometry_data, tess_ctrl_data, tess_eval_data, vertex_data, 2293 0 /* varying names */, 0 /* n varying names */, false); 2294 } 2295 catch (Utils::shaderCompilationException& exc) 2296 { 2297 /* Compilation failed, as expected. Verify that reason of failure is as expected */ 2298 m_context.getTestContext().getLog() << tcu::TestLog::Message 2299 << "Shader compilation error message: " << exc.m_error_message 2300 << tcu::TestLog::EndMessage; 2301 return true; 2302 } 2303 catch (Utils::programLinkageException& exc) 2304 { 2305 /* Something wrong with linking, test case failed */ 2306 m_context.getTestContext().getLog() << tcu::TestLog::Message 2307 << "Program linking failed. Error message: " << exc.m_error_message 2308 << tcu::TestLog::EndMessage; 2309 return true; 2310 } 2311 2312 /* Build process succeded */ 2313 return false; 2314 } 2315 2316 /* Constants used by BindingImageTest */ 2317 const GLuint BindingImageTest::m_width = 16; 2318 const GLuint BindingImageTest::m_green_color = 0xff00ff00; 2319 const GLuint BindingImageTest::m_height = 16; 2320 const GLuint BindingImageTest::m_depth = 6; 2321 2322 /** Constructor 2323 * 2324 * @param context Test context 2325 **/ 2326 BindingImageTest::BindingImageTest(deqp::Context& context, const glw::GLchar* test_name, 2327 const glw::GLchar* test_description) 2328 : GLSLTestBase(context, test_name, test_description) 2329 { 2330 /* Nothing to be done */ 2331 } 2332 2333 /** Prepare buffer, filled with given color 2334 * 2335 * @param buffer Buffer object 2336 * @param color Color 2337 **/ 2338 void BindingImageTest::prepareBuffer(Utils::buffer& buffer, GLuint color) 2339 { 2340 std::vector<GLuint> texture_data; 2341 texture_data.resize(m_width); 2342 2343 buffer.generate(GL_TEXTURE_BUFFER); 2344 2345 for (GLuint i = 0; i < texture_data.size(); ++i) 2346 { 2347 texture_data[i] = color; 2348 } 2349 2350 buffer.update(m_width * sizeof(GLuint), &texture_data[0], GL_STATIC_DRAW); 2351 } 2352 2353 /** Prepare texture of given type filled with given color and bind to specified image unit 2354 * 2355 * @param texture Texture 2356 * @param buffer Buffer 2357 * @param texture_type Type of texture 2358 * @param color Color 2359 **/ 2360 void BindingImageTest::prepareTexture(Utils::texture& texture, const Utils::buffer& buffer, 2361 Utils::TEXTURE_TYPES texture_type, GLuint color, GLuint unit) 2362 { 2363 std::vector<GLuint> texture_data; 2364 texture_data.resize(m_width * m_height * m_depth); 2365 2366 GLboolean is_layered = GL_FALSE; 2367 2368 for (GLuint i = 0; i < texture_data.size(); ++i) 2369 { 2370 texture_data[i] = color; 2371 } 2372 2373 if (Utils::TEX_BUFFER != texture_type) 2374 { 2375 texture.create(m_width, m_height, m_depth, GL_RGBA8, texture_type); 2376 2377 texture.update(m_width, m_height, m_depth, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]); 2378 } 2379 else 2380 { 2381 buffer.bind(); 2382 2383 texture.createBuffer(GL_RGBA8, buffer.m_id); 2384 } 2385 2386 switch (texture_type) 2387 { 2388 case Utils::TEX_1D_ARRAY: 2389 case Utils::TEX_2D_ARRAY: 2390 case Utils::TEX_3D: 2391 case Utils::TEX_CUBE: 2392 is_layered = GL_TRUE; 2393 break; 2394 default: 2395 break; 2396 } 2397 2398 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 2399 2400 gl.bindImageTexture(unit, texture.m_id, 0 /* level */, is_layered /* layered */, 0 /* layer */, GL_READ_WRITE, 2401 GL_RGBA8); 2402 GLU_EXPECT_NO_ERROR(gl.getError(), "BindImageTexture"); 2403 } 2404 2405 /** Verifies that texel at offset 0 is green 2406 * 2407 * @param buffer Buffer object 2408 * 2409 * @return true if texel at offset 0 is green, false otherwise 2410 **/ 2411 bool BindingImageTest::verifyBuffer(const Utils::buffer& buffer) const 2412 { 2413 GLuint* data = (GLuint*)buffer.map(GL_READ_ONLY); 2414 2415 GLuint color = data[0]; 2416 2417 buffer.unmap(); 2418 2419 return (m_green_color == color); 2420 } 2421 2422 /** Verifies that texel at offset 0 is green 2423 * 2424 * @param buffer Buffer object 2425 * 2426 * @return true if texel at offset 0 is green, false otherwise 2427 **/ 2428 bool BindingImageTest::verifyTexture(const Utils::texture& texture) const 2429 { 2430 static const GLuint texture_data_size = m_width * m_height * m_depth; 2431 2432 std::vector<glw::GLuint> texture_data; 2433 texture_data.resize(texture_data_size); 2434 2435 texture.get(GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]); 2436 2437 GLuint color = texture_data[0]; 2438 2439 return (m_green_color == color); 2440 } 2441 2442 /* Constants used by LineContinuationTest */ 2443 const GLuint LineContinuationTest::m_n_repetitions = 20; 2444 const GLchar* LineContinuationTest::m_texture_coordinates_name = "texture_coordinates"; 2445 2446 /** Constructor 2447 * 2448 * @param context Test context 2449 **/ 2450 LineContinuationTest::LineContinuationTest(deqp::Context& context) : GLSLTestBase(context, "line_continuation", "desc") 2451 { 2452 /* Nothing to be done here */ 2453 } 2454 2455 /** Overwrite getShaderSourceConfig method 2456 * 2457 * @param out_n_parts Number of source parts used by this test case 2458 * @param out_use_lengths If source lengths shall be provided to compiler 2459 **/ 2460 void LineContinuationTest::getShaderSourceConfig(GLuint& out_n_parts, bool& out_use_lengths) 2461 { 2462 out_n_parts = (true == isShaderMultipart()) ? 2 : 1; 2463 out_use_lengths = useSourceLengths(); 2464 } 2465 2466 /** Set up next test case 2467 * 2468 * @param test_case_index Index of next test case 2469 * 2470 * @return false if there is no more test cases, true otherwise 2471 **/ 2472 bool LineContinuationTest::prepareNextTestCase(glw::GLuint test_case_index) 2473 { 2474 static const testCase test_cases[] = { { ASSIGNMENT_BEFORE_OPERATOR, ONCE, UNIX }, 2475 { ASSIGNMENT_BEFORE_OPERATOR, ONCE, DOS }, 2476 { ASSIGNMENT_BEFORE_OPERATOR, MULTIPLE_TIMES, UNIX }, 2477 { ASSIGNMENT_BEFORE_OPERATOR, MULTIPLE_TIMES, DOS }, 2478 { ASSIGNMENT_AFTER_OPERATOR, ONCE, UNIX }, 2479 { ASSIGNMENT_AFTER_OPERATOR, ONCE, DOS }, 2480 { ASSIGNMENT_AFTER_OPERATOR, MULTIPLE_TIMES, UNIX }, 2481 { ASSIGNMENT_AFTER_OPERATOR, MULTIPLE_TIMES, DOS }, 2482 { VECTOR_VARIABLE_INITIALIZER, ONCE, UNIX }, 2483 { VECTOR_VARIABLE_INITIALIZER, ONCE, DOS }, 2484 { VECTOR_VARIABLE_INITIALIZER, MULTIPLE_TIMES, UNIX }, 2485 { VECTOR_VARIABLE_INITIALIZER, MULTIPLE_TIMES, DOS }, 2486 { TOKEN_INSIDE_FUNCTION_NAME, ONCE, UNIX }, 2487 { TOKEN_INSIDE_FUNCTION_NAME, ONCE, DOS }, 2488 { TOKEN_INSIDE_FUNCTION_NAME, MULTIPLE_TIMES, UNIX }, 2489 { TOKEN_INSIDE_FUNCTION_NAME, MULTIPLE_TIMES, DOS }, 2490 { TOKEN_INSIDE_TYPE_NAME, ONCE, UNIX }, 2491 { TOKEN_INSIDE_TYPE_NAME, ONCE, DOS }, 2492 { TOKEN_INSIDE_TYPE_NAME, MULTIPLE_TIMES, UNIX }, 2493 { TOKEN_INSIDE_TYPE_NAME, MULTIPLE_TIMES, DOS }, 2494 { TOKEN_INSIDE_VARIABLE_NAME, ONCE, UNIX }, 2495 { TOKEN_INSIDE_VARIABLE_NAME, ONCE, DOS }, 2496 { TOKEN_INSIDE_VARIABLE_NAME, MULTIPLE_TIMES, UNIX }, 2497 { TOKEN_INSIDE_VARIABLE_NAME, MULTIPLE_TIMES, DOS }, 2498 { PREPROCESSOR_TOKEN_INSIDE, ONCE, UNIX }, 2499 { PREPROCESSOR_TOKEN_INSIDE, ONCE, DOS }, 2500 { PREPROCESSOR_TOKEN_INSIDE, MULTIPLE_TIMES, UNIX }, 2501 { PREPROCESSOR_TOKEN_INSIDE, MULTIPLE_TIMES, DOS }, 2502 { PREPROCESSOR_TOKEN_BETWEEN, ONCE, UNIX }, 2503 { PREPROCESSOR_TOKEN_BETWEEN, ONCE, DOS }, 2504 { PREPROCESSOR_TOKEN_BETWEEN, MULTIPLE_TIMES, UNIX }, 2505 { PREPROCESSOR_TOKEN_BETWEEN, MULTIPLE_TIMES, DOS }, 2506 { COMMENT, ONCE, UNIX }, 2507 { COMMENT, ONCE, DOS }, 2508 { COMMENT, MULTIPLE_TIMES, UNIX }, 2509 { COMMENT, MULTIPLE_TIMES, DOS }, 2510 { SOURCE_TERMINATION_NULL, ONCE, UNIX }, 2511 { SOURCE_TERMINATION_NULL, ONCE, DOS }, 2512 { SOURCE_TERMINATION_NULL, MULTIPLE_TIMES, UNIX }, 2513 { SOURCE_TERMINATION_NULL, MULTIPLE_TIMES, DOS }, 2514 { SOURCE_TERMINATION_NON_NULL, ONCE, UNIX }, 2515 { SOURCE_TERMINATION_NON_NULL, ONCE, DOS }, 2516 { SOURCE_TERMINATION_NON_NULL, MULTIPLE_TIMES, UNIX }, 2517 { SOURCE_TERMINATION_NON_NULL, MULTIPLE_TIMES, DOS }, 2518 { PART_TERMINATION_NULL, ONCE, UNIX }, 2519 { PART_TERMINATION_NULL, ONCE, DOS }, 2520 { PART_TERMINATION_NULL, MULTIPLE_TIMES, UNIX }, 2521 { PART_TERMINATION_NULL, MULTIPLE_TIMES, DOS }, 2522 { PART_NEXT_TO_TERMINATION_NULL, ONCE, UNIX }, 2523 { PART_NEXT_TO_TERMINATION_NULL, ONCE, DOS }, 2524 { PART_NEXT_TO_TERMINATION_NULL, MULTIPLE_TIMES, UNIX }, 2525 { PART_NEXT_TO_TERMINATION_NULL, MULTIPLE_TIMES, DOS }, 2526 { PART_TERMINATION_NON_NULL, ONCE, UNIX }, 2527 { PART_TERMINATION_NON_NULL, ONCE, DOS }, 2528 { PART_TERMINATION_NON_NULL, MULTIPLE_TIMES, UNIX }, 2529 { PART_TERMINATION_NON_NULL, MULTIPLE_TIMES, DOS }, 2530 { PART_NEXT_TO_TERMINATION_NON_NULL, ONCE, UNIX }, 2531 { PART_NEXT_TO_TERMINATION_NON_NULL, ONCE, DOS }, 2532 { PART_NEXT_TO_TERMINATION_NON_NULL, MULTIPLE_TIMES, UNIX }, 2533 { PART_NEXT_TO_TERMINATION_NON_NULL, MULTIPLE_TIMES, DOS } }; 2534 2535 static const GLuint max_test_cases = sizeof(test_cases) / sizeof(testCase); 2536 2537 if ((GLuint)-1 == test_case_index) 2538 { 2539 m_test_case.m_case = DEBUG_CASE; 2540 } 2541 else if (max_test_cases <= test_case_index) 2542 { 2543 return false; 2544 } 2545 else 2546 { 2547 m_test_case = test_cases[test_case_index]; 2548 } 2549 2550 m_context.getTestContext().getLog() << tcu::TestLog::Message 2551 << "Test case: " << repetitionsToStr((REPETITIONS)m_test_case.m_repetitions) 2552 << " line continuation, with " 2553 << lineEndingsToStr((LINE_ENDINGS)m_test_case.m_line_endings) 2554 << " line endings, is placed " << casesToStr((CASES)m_test_case.m_case) 2555 << tcu::TestLog::EndMessage; 2556 2557 return true; 2558 } 2559 2560 /** Prepare source for given shader stage 2561 * 2562 * @param in_stage Shader stage, compute shader will use 430 2563 * @param in_use_version_400 Select if 400 or 420 should be used 2564 * @param out_source Prepared shader source instance 2565 **/ 2566 void LineContinuationTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 2567 Utils::shaderSource& out_source) 2568 { 2569 if (Utils::COMPUTE_SHADER == in_stage) 2570 { 2571 prepareComputShaderSource(out_source); 2572 } 2573 else 2574 { 2575 prepareShaderSourceForDraw(in_stage, in_use_version_400, out_source); 2576 } 2577 } 2578 2579 /** Prepare compute shader source 2580 * 2581 * @param source Result shader source 2582 **/ 2583 void LineContinuationTest::prepareComputShaderSource(Utils::shaderSource& source) 2584 { 2585 static const GLchar* shader_template_part_0 = 2586 "#version 430\n" 2587 "\n" 2588 "// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n" 2589 "\n" 2590 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 2591 "\n" 2592 "/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n" 2593 "\n" 2594 "writeonly uniform image2D uni_image;\n" 2595 " uniform sampler2D uni_sampler;\n" 2596 "\n" 2597 "void funFUNCTION_CASEction(in veTYPE_CASEc4 in_vVARIABLE_CASEalue)\n" 2598 "{\n" 2599 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), inVARIABLE_CASE_value);\n" 2600 "}\n" 2601 "\n" 2602 "#define SET_PREPROCESSOR_INSIDE_CASERESULT(XX) " 2603 "PREPROCESSOR_BETWEEN_CASEfuncFUNCTION_CASEtion(XPREPROCESSOR_INSIDE_CASEX)\n" 2604 "NEXT_TO_TERMINATION_CASE\nTERMINATION_CASE"; 2605 2606 static const GLchar* shader_template_part_1 = 2607 "void main()\n" 2608 "{\n" 2609 " ivec2 coordinates ASSIGNMENT_BEFORE_OPERATOR_CASE=ASSIGNMENT_AFTER_OPERATOR_CASE " 2610 "ivec2(gl_GlobalInvocationID.xy + ivec2(16, 16));\n" 2611 " vec4 sampled_color = texelFetch(uni_sampler, coordinates, 0 /* lod */);\n" 2612 " vec4 result = vec4(0, 0VECTOR_VARIABLE_INITIALIZER_CASE, 0, 1);\n" 2613 "\n" 2614 " if (vec4(0, 0, 1, 1) == sampled_color)\n" 2615 " {\n" 2616 " result = vecTYPE_CASE4(VECTOR_VARIABLE_INITIALIZER_CASE0, 1, 0, 1);\n" 2617 " }\n" 2618 " else\n" 2619 " {\n" 2620 " result = vec4(coordinates.xy, sampled_color.rg);\n" 2621 " }\n" 2622 "\n" 2623 " SET_RESULT(result);" 2624 "}\n"; 2625 2626 /* Init strings with templates and replace all CASE tokens */ 2627 if (true == isShaderMultipart()) 2628 { 2629 source.m_parts[0].m_code = shader_template_part_0; 2630 source.m_parts[1].m_code = shader_template_part_1; 2631 2632 replaceAllCaseTokens(source.m_parts[0].m_code); 2633 replaceAllCaseTokens(source.m_parts[1].m_code); 2634 } 2635 else 2636 { 2637 source.m_parts[0].m_code = shader_template_part_0; 2638 source.m_parts[0].m_code.append(shader_template_part_1); 2639 2640 replaceAllCaseTokens(source.m_parts[0].m_code); 2641 } 2642 } 2643 2644 /** Prepare source for given shader stage 2645 * 2646 * @param stage Shader stage, compute shader will use 430 2647 * @param use_version_400 Select if 400 or 420 should be used 2648 * @param source Result shader sources 2649 **/ 2650 void LineContinuationTest::prepareShaderSourceForDraw(Utils::SHADER_STAGES stage, bool use_version_400, 2651 Utils::shaderSource& source) 2652 { 2653 /* Templates */ 2654 static const GLchar* shader_template_part_0 = 2655 "VERSION\n" 2656 "\n" 2657 "// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n" 2658 "\n" 2659 "STAGE_SPECIFIC\n" 2660 "\n" 2661 "/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n" 2662 "\n" 2663 "IN_COLOR_DEFINITION\n" 2664 "IN_TEXTURE_COORDINATES_DEFINITION\n" 2665 "OUT_COLOR_DEFINITION\n" 2666 "OUT_TEXTURE_COORDINATES_DEFINITION\n" 2667 "uniform sampler2D uni_sampler;\n" 2668 "\n" 2669 "void funFUNCTION_CASEction(in veTYPE_CASEc4 in_vVARIABLE_CASEalue)\n" 2670 "{\n" 2671 " OUT_COLOR ASSIGNMENT_BEFORE_OPERATOR_CASE=ASSIGNMENT_AFTER_OPERATOR_CASE inVARIABLE_CASE_value;\n" 2672 "}\n" 2673 "\n" 2674 "#define SET_PREPROCESSOR_INSIDE_CASERESULT(XX) " 2675 "PREPROCESSOR_BETWEEN_CASEfuncFUNCTION_CASEtion(XPREPROCESSOR_INSIDE_CASEX)\n" 2676 "NEXT_TO_TERMINATION_CASE\nTERMINATION_CASE"; 2677 2678 static const GLchar* shader_template_part_1 = 2679 "void main()\n" 2680 "{\n" 2681 " vec2 coordinates = TEXTURE_COORDINATES;\n" 2682 " vec4 sampled_color = texture(uni_sampler, coordinates);\n" 2683 " vec4 result = vec4(0, 0VECTOR_VARIABLE_INITIALIZER_CASE, 0, 1);\n" 2684 "\n" 2685 " if (PASS_CONDITION)\n" 2686 " {\n" 2687 " result = vecTYPE_CASE4(VECTOR_VARIABLE_INITIALIZER_CASE0, 1, 0, 1);\n" 2688 " }\n" 2689 " else\n" 2690 " {\n" 2691 " result = vec4(coordinates.xy, sampled_color.rg);\n" 2692 " }\n" 2693 "\n" 2694 "STORE_RESULTS" 2695 "}\n" 2696 "NEXT_TO_TERMINATION_CASE\nTERMINATION_CASE"; 2697 2698 static const GLchar* store_results_template = " SET_RESULT(result);\n" 2699 " TEXTURE_COORDINATES = coordinates;\n"; 2700 2701 static const GLchar* store_results_tcs_template = " SET_RESULT(result);\n" 2702 " TEXTURE_COORDINATES = coordinates;\n" 2703 " gl_TessLevelOuter[0] = 1.0;\n" 2704 " gl_TessLevelOuter[1] = 1.0;\n" 2705 " gl_TessLevelOuter[2] = 1.0;\n" 2706 " gl_TessLevelOuter[3] = 1.0;\n" 2707 " gl_TessLevelInner[0] = 1.0;\n" 2708 " gl_TessLevelInner[1] = 1.0;\n"; 2709 2710 static const GLchar* store_results_fs_template = " SET_RESULT(result);\n"; 2711 2712 static const GLchar* store_results_gs_template = " gl_Position = vec4(-1, -1, 0, 1);\n" 2713 " SET_RESULT(result);\n" 2714 " TEXTURE_COORDINATES = coordinates + vec2(-0.25, -0.25);\n" 2715 " EmitVertex();\n" 2716 " gl_Position = vec4(-1, 1, 0, 1);\n" 2717 " SET_RESULT(result);\n" 2718 " TEXTURE_COORDINATES = coordinates + vec2(-0.25, 0.25);\n" 2719 " EmitVertex();\n" 2720 " gl_Position = vec4(1, -1, 0, 1);\n" 2721 " SET_RESULT(result);\n" 2722 " TEXTURE_COORDINATES = coordinates + vec2(0.25, -0.25);\n" 2723 " EmitVertex();\n" 2724 " gl_Position = vec4(1, 1, 0, 1);\n" 2725 " SET_RESULT(result);\n" 2726 " TEXTURE_COORDINATES = coordinates + vec2(0.25, 0.25);\n" 2727 " EmitVertex();\n"; 2728 2729 static const GLchar* pass_condition_template = "(EXPECTED_VALUE == sampled_color) &&\n" 2730 " (vec4(0, 1, 0, 1) == IN_COLOR) "; 2731 2732 static const GLchar* pass_condition_vs_template = "EXPECTED_VALUE == sampled_color"; 2733 2734 /* Tokens to be replaced with GLSL stuff */ 2735 static const GLchar* token_version = "VERSION"; 2736 static const GLchar* token_stage_specific = "STAGE_SPECIFIC"; 2737 2738 static const GLchar* token_in_color_definition = "IN_COLOR_DEFINITION"; 2739 static const GLchar* token_in_tex_coord_definition = "IN_TEXTURE_COORDINATES_DEFINITION"; 2740 static const GLchar* token_out_color_definition = "OUT_COLOR_DEFINITION"; 2741 static const GLchar* token_out_tex_coord_definition = "OUT_TEXTURE_COORDINATES_DEFINITION"; 2742 2743 static const GLchar* token_expected_value = "EXPECTED_VALUE"; 2744 static const GLchar* token_texture_coordinates = "TEXTURE_COORDINATES"; 2745 static const GLchar* token_in_color = "IN_COLOR"; 2746 static const GLchar* token_out_color = "OUT_COLOR"; 2747 2748 static const GLchar* token_store_results = "STORE_RESULTS"; 2749 static const GLchar* token_pass_condition = "PASS_CONDITION"; 2750 2751 /* Name of variable and empty string*/ 2752 static const GLchar* color_name = "color"; 2753 static const GLchar* empty = ""; 2754 2755 /* GLSL stuff */ 2756 const GLchar* version = getVersionString(stage, use_version_400); 2757 const GLchar* stage_specific_layout = getStageSpecificLayout(stage); 2758 const GLchar* expected_value = getExpectedValueString(); 2759 2760 /* Qualifiers */ 2761 Utils::qualifierSet in; 2762 Utils::qualifierSet out; 2763 in.push_back(Utils::QUAL_IN); 2764 out.push_back(Utils::QUAL_OUT); 2765 2766 /* In/Out variables definitions and references */ 2767 std::string in_tex_coord_reference; 2768 std::string out_tex_coord_reference; 2769 std::string in_color_reference; 2770 std::string out_color_reference; 2771 std::string in_tex_coord_definition; 2772 std::string out_tex_coord_definition; 2773 std::string in_color_definition; 2774 std::string out_color_definition; 2775 2776 Utils::prepareVariableStrings(stage, Utils::INPUT, in, "vec2", m_texture_coordinates_name, in_tex_coord_definition, 2777 in_tex_coord_reference); 2778 Utils::prepareVariableStrings(stage, Utils::OUTPUT, out, "vec2", m_texture_coordinates_name, 2779 out_tex_coord_definition, out_tex_coord_reference); 2780 Utils::prepareVariableStrings(stage, Utils::INPUT, in, "vec4", color_name, in_color_definition, in_color_reference); 2781 Utils::prepareVariableStrings(stage, Utils::OUTPUT, out, "vec4", color_name, out_color_definition, 2782 out_color_reference); 2783 2784 in_tex_coord_definition.append(";"); 2785 out_tex_coord_definition.append(";"); 2786 in_color_definition.append(";"); 2787 out_color_definition.append(";"); 2788 2789 /* Select pass condition and store results tempaltes */ 2790 const GLchar* store_results = store_results_template; 2791 const GLchar* pass_condition = pass_condition_template; 2792 2793 switch (stage) 2794 { 2795 case Utils::FRAGMENT_SHADER: 2796 store_results = store_results_fs_template; 2797 break; 2798 case Utils::GEOMETRY_SHADER: 2799 store_results = store_results_gs_template; 2800 break; 2801 case Utils::TESS_CTRL_SHADER: 2802 store_results = store_results_tcs_template; 2803 break; 2804 case Utils::VERTEX_SHADER: 2805 pass_condition = pass_condition_vs_template; 2806 break; 2807 default: 2808 break; 2809 }; 2810 const GLuint store_results_length = static_cast<GLuint>(strlen(store_results)); 2811 const GLuint pass_condition_length = static_cast<GLuint>(strlen(pass_condition)); 2812 2813 /* Init strings with templates and replace all CASE tokens */ 2814 if (true == isShaderMultipart()) 2815 { 2816 source.m_parts[0].m_code = shader_template_part_0; 2817 source.m_parts[1].m_code = shader_template_part_1; 2818 2819 replaceAllCaseTokens(source.m_parts[0].m_code); 2820 replaceAllCaseTokens(source.m_parts[1].m_code); 2821 } 2822 else 2823 { 2824 source.m_parts[0].m_code = shader_template_part_0; 2825 source.m_parts[0].m_code.append(shader_template_part_1); 2826 2827 replaceAllCaseTokens(source.m_parts[0].m_code); 2828 } 2829 2830 /* Get memory for shader source parts */ 2831 const bool is_multipart = isShaderMultipart(); 2832 size_t position = 0; 2833 std::string& shader_source_part_0 = source.m_parts[0].m_code; 2834 std::string& shader_source_part_1 = (true == is_multipart) ? source.m_parts[1].m_code : source.m_parts[0].m_code; 2835 2836 /* Replace tokens */ 2837 /* Part 0 */ 2838 Utils::replaceToken(token_version, position, version, shader_source_part_0); 2839 2840 Utils::replaceToken(token_stage_specific, position, stage_specific_layout, shader_source_part_0); 2841 2842 if (Utils::VERTEX_SHADER != stage) 2843 { 2844 Utils::replaceToken(token_in_color_definition, position, in_color_definition.c_str(), shader_source_part_0); 2845 } 2846 else 2847 { 2848 Utils::replaceToken(token_in_color_definition, position, empty, shader_source_part_0); 2849 } 2850 Utils::replaceToken(token_in_tex_coord_definition, position, in_tex_coord_definition.c_str(), shader_source_part_0); 2851 Utils::replaceToken(token_out_color_definition, position, out_color_definition.c_str(), shader_source_part_0); 2852 if (Utils::FRAGMENT_SHADER == stage) 2853 { 2854 Utils::replaceToken(token_out_tex_coord_definition, position, empty, shader_source_part_0); 2855 } 2856 else 2857 { 2858 Utils::replaceToken(token_out_tex_coord_definition, position, out_tex_coord_definition.c_str(), 2859 shader_source_part_0); 2860 } 2861 2862 Utils::replaceToken(token_out_color, position, out_color_reference.c_str(), shader_source_part_0); 2863 2864 /* Part 1 */ 2865 if (true == is_multipart) 2866 { 2867 position = 0; 2868 } 2869 2870 Utils::replaceToken(token_texture_coordinates, position, in_tex_coord_reference.c_str(), shader_source_part_1); 2871 2872 Utils::replaceToken(token_pass_condition, position, pass_condition, shader_source_part_1); 2873 position -= pass_condition_length; 2874 2875 Utils::replaceToken(token_expected_value, position, expected_value, shader_source_part_1); 2876 if (Utils::VERTEX_SHADER != stage) 2877 { 2878 Utils::replaceToken(token_in_color, position, in_color_reference.c_str(), shader_source_part_1); 2879 } 2880 2881 Utils::replaceToken(token_store_results, position, store_results, shader_source_part_1); 2882 position -= store_results_length; 2883 2884 if (Utils::GEOMETRY_SHADER == stage) 2885 { 2886 for (GLuint i = 0; i < 4; ++i) 2887 { 2888 Utils::replaceToken(token_texture_coordinates, position, out_tex_coord_reference.c_str(), 2889 shader_source_part_1); 2890 } 2891 } 2892 else if (Utils::FRAGMENT_SHADER == stage) 2893 { 2894 /* Nothing to be done */ 2895 } 2896 else 2897 { 2898 Utils::replaceToken(token_texture_coordinates, position, out_tex_coord_reference.c_str(), shader_source_part_1); 2899 } 2900 } 2901 2902 /** Prepare texture 2903 * 2904 * @param texture Texutre to be created and filled with content 2905 * 2906 * @return Name of sampler uniform that should be used for the texture 2907 **/ 2908 const GLchar* LineContinuationTest::prepareSourceTexture(Utils::texture& texture) 2909 { 2910 std::vector<GLuint> data; 2911 static const GLuint width = 64; 2912 static const GLuint height = 64; 2913 static const GLuint data_size = width * height; 2914 static const GLuint blue_color = 0xffff0000; 2915 static const GLuint grey_color = 0xaaaaaaaa; 2916 2917 data.resize(data_size); 2918 2919 for (GLuint i = 0; i < data_size; ++i) 2920 { 2921 data[i] = grey_color; 2922 } 2923 2924 for (GLuint y = 16; y < 48; ++y) 2925 { 2926 const GLuint line_offset = y * 64; 2927 2928 for (GLuint x = 16; x < 48; ++x) 2929 { 2930 const GLuint pixel_offset = x + line_offset; 2931 2932 data[pixel_offset] = blue_color; 2933 } 2934 } 2935 2936 texture.create(width, height, GL_RGBA8); 2937 2938 texture.update(width, height, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); 2939 2940 return "uni_sampler"; 2941 } 2942 2943 /** Prepare vertex buffer, vec2 tex_coord 2944 * 2945 * @param program Program object 2946 * @param buffer Vertex buffer 2947 * @param vao Vertex array object 2948 **/ 2949 void LineContinuationTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, 2950 Utils::vertexArray& vao) 2951 { 2952 std::string tex_coord_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, m_texture_coordinates_name); 2953 GLint tex_coord_loc = program.getAttribLocation(tex_coord_name.c_str()); 2954 2955 if (-1 == tex_coord_loc) 2956 { 2957 TCU_FAIL("Vertex attribute location is invalid"); 2958 } 2959 2960 vao.generate(); 2961 vao.bind(); 2962 2963 buffer.generate(GL_ARRAY_BUFFER); 2964 2965 GLfloat data[] = { 0.5f, 0.5f, 0.5f, 0.5f }; 2966 GLsizeiptr data_size = sizeof(data); 2967 2968 buffer.update(data_size, data, GL_STATIC_DRAW); 2969 2970 /* GL entry points */ 2971 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 2972 2973 /* Set up vao */ 2974 gl.vertexAttribPointer(tex_coord_loc, 2 /* size */, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0 /* stride */, 2975 0 /* offset */); 2976 GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer"); 2977 2978 /* Enable attribute */ 2979 gl.enableVertexAttribArray(tex_coord_loc); 2980 GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray"); 2981 } 2982 2983 /** Get string describing test cases 2984 * 2985 * @param cases Test case 2986 * 2987 * @return String describing current test case 2988 **/ 2989 const GLchar* LineContinuationTest::casesToStr(CASES cases) const 2990 { 2991 const GLchar* result = 0; 2992 switch (cases) 2993 { 2994 case ASSIGNMENT_BEFORE_OPERATOR: 2995 result = "just before assignment operator"; 2996 break; 2997 case ASSIGNMENT_AFTER_OPERATOR: 2998 result = "just after assignment operator"; 2999 break; 3000 case VECTOR_VARIABLE_INITIALIZER: 3001 result = "inside vector variable initializer"; 3002 break; 3003 case TOKEN_INSIDE_FUNCTION_NAME: 3004 result = "inside function name"; 3005 break; 3006 case TOKEN_INSIDE_TYPE_NAME: 3007 result = "inside type name"; 3008 break; 3009 case TOKEN_INSIDE_VARIABLE_NAME: 3010 result = "inside variable name"; 3011 break; 3012 case PREPROCESSOR_TOKEN_INSIDE: 3013 result = "inside preprocessor token"; 3014 break; 3015 case PREPROCESSOR_TOKEN_BETWEEN: 3016 result = "between preprocessor token"; 3017 break; 3018 case COMMENT: 3019 result = "inside comment"; 3020 break; 3021 case SOURCE_TERMINATION_NULL: 3022 result = "just before null terminating source"; 3023 break; 3024 case SOURCE_TERMINATION_NON_NULL: 3025 result = "as last character in source string, without null termination"; 3026 break; 3027 case PART_TERMINATION_NULL: 3028 result = "just before null terminating part of source"; 3029 break; 3030 case PART_NEXT_TO_TERMINATION_NULL: 3031 result = "just before last character in part of source"; 3032 break; 3033 case PART_TERMINATION_NON_NULL: 3034 result = "as last character in part string, without null termination"; 3035 break; 3036 case PART_NEXT_TO_TERMINATION_NON_NULL: 3037 result = "just before last character in part string, without null termination"; 3038 break; 3039 case DEBUG_CASE: /* intended fall through */ 3040 default: 3041 result = "nowhere at all. This is debug!"; 3042 break; 3043 } 3044 3045 return result; 3046 } 3047 3048 /** Get expected value, blue color as vec4 3049 * 3050 * @return blue color 3051 **/ 3052 const GLchar* LineContinuationTest::getExpectedValueString() const 3053 { 3054 return "vec4(0, 0, 1, 1)"; 3055 } 3056 3057 /** Get line continuation string, single or multiple \ 3058 * 3059 * @return String 3060 **/ 3061 std::string LineContinuationTest::getLineContinuationString() const 3062 { 3063 static const GLchar line_continuation_ending_dos[] = { '\\', 0x0d, 0x0a, 0x00 }; 3064 static const GLchar line_continuation_ending_unix[] = { '\\', 0x0a, 0x00 }; 3065 3066 std::string result; 3067 const GLchar* selected_string; 3068 3069 if (DOS == m_test_case.m_line_endings) 3070 { 3071 selected_string = line_continuation_ending_dos; 3072 } 3073 else 3074 { 3075 selected_string = line_continuation_ending_unix; 3076 } 3077 3078 GLuint n_repetitions = (ONCE == m_test_case.m_repetitions) ? 1 : m_n_repetitions; 3079 3080 for (GLuint i = 0; i < n_repetitions; ++i) 3081 { 3082 result.append(selected_string); 3083 } 3084 3085 return result; 3086 } 3087 3088 /** Decides if shader should consist of multiple parts for the current test case 3089 * 3090 * @return true if test case requires multiple parts, false otherwise 3091 **/ 3092 bool LineContinuationTest::isShaderMultipart() const 3093 { 3094 bool result; 3095 3096 switch (m_test_case.m_case) 3097 { 3098 case ASSIGNMENT_BEFORE_OPERATOR: 3099 case ASSIGNMENT_AFTER_OPERATOR: 3100 case VECTOR_VARIABLE_INITIALIZER: 3101 case TOKEN_INSIDE_FUNCTION_NAME: 3102 case TOKEN_INSIDE_TYPE_NAME: 3103 case TOKEN_INSIDE_VARIABLE_NAME: 3104 case PREPROCESSOR_TOKEN_INSIDE: 3105 case PREPROCESSOR_TOKEN_BETWEEN: 3106 case COMMENT: 3107 case SOURCE_TERMINATION_NULL: 3108 case SOURCE_TERMINATION_NON_NULL: 3109 default: 3110 result = false; 3111 break; 3112 case PART_TERMINATION_NULL: 3113 case PART_NEXT_TO_TERMINATION_NULL: 3114 case PART_TERMINATION_NON_NULL: 3115 case PART_NEXT_TO_TERMINATION_NON_NULL: 3116 result = true; 3117 break; 3118 }; 3119 3120 return result; 3121 } 3122 3123 /** String describing line endings 3124 * 3125 * @param line_ending Line ending enum 3126 * 3127 * @return "unix" or "dos" strings 3128 **/ 3129 const GLchar* LineContinuationTest::lineEndingsToStr(LINE_ENDINGS line_ending) const 3130 { 3131 const GLchar* result = 0; 3132 3133 if (UNIX == line_ending) 3134 { 3135 result = "unix"; 3136 } 3137 else 3138 { 3139 result = "dos"; 3140 } 3141 3142 return result; 3143 } 3144 3145 /** String describing number of repetitions 3146 * 3147 * @param repetitions Repetitions enum 3148 * 3149 * @return "single" or "multiple" strings 3150 **/ 3151 const GLchar* LineContinuationTest::repetitionsToStr(REPETITIONS repetitions) const 3152 { 3153 const GLchar* result = 0; 3154 3155 if (ONCE == repetitions) 3156 { 3157 result = "single"; 3158 } 3159 else 3160 { 3161 result = "multiple"; 3162 } 3163 3164 return result; 3165 } 3166 3167 /** Replace all CASES tokens 3168 * 3169 * @param source String with shader template 3170 **/ 3171 void LineContinuationTest::replaceAllCaseTokens(std::string& source) const 3172 { 3173 3174 /* Tokens to be replaced with line continuation */ 3175 static const GLchar* token_assignment_before_operator_case = "ASSIGNMENT_BEFORE_OPERATOR_CASE"; 3176 static const GLchar* token_assignment_after_operator_case = "ASSIGNMENT_AFTER_OPERATOR_CASE"; 3177 static const GLchar* token_vector_initializer = "VECTOR_VARIABLE_INITIALIZER_CASE"; 3178 static const GLchar* token_function_case = "FUNCTION_CASE"; 3179 static const GLchar* token_type_case = "TYPE_CASE"; 3180 static const GLchar* token_variable_case = "VARIABLE_CASE"; 3181 static const GLchar* token_preprocessor_inside_case = "PREPROCESSOR_INSIDE_CASE"; 3182 static const GLchar* token_preprocessor_between_case = "PREPROCESSOR_BETWEEN_CASE"; 3183 static const GLchar* token_comment = "COMMENT_CASE"; 3184 static const GLchar* token_termination = "TERMINATION_CASE"; 3185 static const GLchar* token_next_to_termination = "NEXT_TO_TERMINATION_CASE"; 3186 3187 /* Line continuation and empty string*/ 3188 static const GLchar* empty = ""; 3189 const std::string& line_continuation = getLineContinuationString(); 3190 3191 /* These strings will used to replace "CASE" tokens */ 3192 const GLchar* assignment_before_operator_case = empty; 3193 const GLchar* assignment_after_operator_case = empty; 3194 const GLchar* vector_variable_initializer_case = empty; 3195 const GLchar* function_case = empty; 3196 const GLchar* type_case = empty; 3197 const GLchar* variable_case = empty; 3198 const GLchar* preprocessor_inside_case = empty; 3199 const GLchar* preprocessor_between_case = empty; 3200 const GLchar* comment_case = empty; 3201 const GLchar* source_termination_case = empty; 3202 const GLchar* part_termination_case = empty; 3203 const GLchar* next_to_part_termination_case = empty; 3204 3205 /* Configuration of test case */ 3206 switch (m_test_case.m_case) 3207 { 3208 case ASSIGNMENT_BEFORE_OPERATOR: 3209 assignment_before_operator_case = line_continuation.c_str(); 3210 break; 3211 case ASSIGNMENT_AFTER_OPERATOR: 3212 assignment_after_operator_case = line_continuation.c_str(); 3213 break; 3214 case VECTOR_VARIABLE_INITIALIZER: 3215 vector_variable_initializer_case = line_continuation.c_str(); 3216 break; 3217 case TOKEN_INSIDE_FUNCTION_NAME: 3218 function_case = line_continuation.c_str(); 3219 break; 3220 case TOKEN_INSIDE_TYPE_NAME: 3221 type_case = line_continuation.c_str(); 3222 break; 3223 case TOKEN_INSIDE_VARIABLE_NAME: 3224 variable_case = line_continuation.c_str(); 3225 break; 3226 case PREPROCESSOR_TOKEN_INSIDE: 3227 preprocessor_inside_case = line_continuation.c_str(); 3228 break; 3229 case PREPROCESSOR_TOKEN_BETWEEN: 3230 preprocessor_between_case = line_continuation.c_str(); 3231 break; 3232 case COMMENT: 3233 comment_case = line_continuation.c_str(); 3234 break; 3235 case SOURCE_TERMINATION_NULL: /* intended fall through */ 3236 case SOURCE_TERMINATION_NON_NULL: 3237 source_termination_case = line_continuation.c_str(); 3238 break; 3239 case PART_TERMINATION_NULL: /* intended fall through */ 3240 case PART_TERMINATION_NON_NULL: 3241 part_termination_case = line_continuation.c_str(); 3242 source_termination_case = line_continuation.c_str(); 3243 break; 3244 case PART_NEXT_TO_TERMINATION_NULL: /* intended fall through */ 3245 case PART_NEXT_TO_TERMINATION_NON_NULL: 3246 next_to_part_termination_case = line_continuation.c_str(); 3247 break; 3248 case DEBUG_CASE: /* intended fall through */ 3249 default: 3250 break; /* no line continuations */ 3251 }; 3252 3253 Utils::replaceAllTokens(token_assignment_after_operator_case, assignment_after_operator_case, source); 3254 Utils::replaceAllTokens(token_assignment_before_operator_case, assignment_before_operator_case, source); 3255 Utils::replaceAllTokens(token_comment, comment_case, source); 3256 Utils::replaceAllTokens(token_function_case, function_case, source); 3257 Utils::replaceAllTokens(token_next_to_termination, next_to_part_termination_case, source); 3258 Utils::replaceAllTokens(token_termination, part_termination_case, source); 3259 Utils::replaceAllTokens(token_preprocessor_between_case, preprocessor_between_case, source); 3260 Utils::replaceAllTokens(token_preprocessor_inside_case, preprocessor_inside_case, source); 3261 Utils::replaceAllTokens(token_termination, source_termination_case, source); 3262 Utils::replaceAllTokens(token_type_case, type_case, source); 3263 Utils::replaceAllTokens(token_variable_case, variable_case, source); 3264 Utils::replaceAllTokens(token_vector_initializer, vector_variable_initializer_case, source); 3265 } 3266 3267 /** Decides if the current test case requires source lengths 3268 * 3269 * @return true if test requires lengths, false otherwise 3270 **/ 3271 bool LineContinuationTest::useSourceLengths() const 3272 { 3273 bool result; 3274 3275 switch (m_test_case.m_case) 3276 { 3277 case ASSIGNMENT_BEFORE_OPERATOR: 3278 case ASSIGNMENT_AFTER_OPERATOR: 3279 case VECTOR_VARIABLE_INITIALIZER: 3280 case TOKEN_INSIDE_FUNCTION_NAME: 3281 case TOKEN_INSIDE_TYPE_NAME: 3282 case TOKEN_INSIDE_VARIABLE_NAME: 3283 case PREPROCESSOR_TOKEN_INSIDE: 3284 case PREPROCESSOR_TOKEN_BETWEEN: 3285 case COMMENT: 3286 case SOURCE_TERMINATION_NULL: 3287 case PART_TERMINATION_NULL: 3288 case PART_NEXT_TO_TERMINATION_NULL: 3289 default: 3290 result = false; 3291 break; 3292 case SOURCE_TERMINATION_NON_NULL: 3293 case PART_TERMINATION_NON_NULL: 3294 case PART_NEXT_TO_TERMINATION_NON_NULL: 3295 result = true; 3296 break; 3297 }; 3298 3299 return result; 3300 } 3301 3302 /** Constructor 3303 * 3304 * @param context Test context 3305 **/ 3306 LineNumberingTest::LineNumberingTest(deqp::Context& context) 3307 : GLSLTestBase(context, "line_numbering", "Verify if line numbering is correct after line continuation") 3308 { 3309 /* Nothing to be done here */ 3310 } 3311 3312 /** Prepare source for given shader stage 3313 * 3314 * @param in_stage Shader stage, compute shader will use 430 3315 * @param in_use_version_400 Select if 400 or 420 should be used 3316 * @param out_source Prepared shader source instance 3317 **/ 3318 void LineNumberingTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 3319 Utils::shaderSource& out_source) 3320 { 3321 static const GLchar* test_result_snippet_normal[6] = { /* Utils::COMPUTE_SHADER */ 3322 "ivec4(11, 1, 2, 3)", 3323 /* Utils::VERTEX_SHADER */ 3324 "ivec4(9, 1, 2, 3)", 3325 /* Utils::TESS_CTRL_SHADER */ 3326 "ivec4(12, 1, 2, 3)", 3327 /* Utils::TESS_EVAL_SHADER */ 3328 "ivec4(12, 1, 2, 3)", 3329 /* Utils::GEOMETRY_SHADER */ 3330 "ivec4(13, 1, 2, 3)", 3331 /* Utils::FRAGMENT_SHADER */ 3332 "ivec4(10, 1, 2, 3)" 3333 }; 3334 3335 static const GLchar* test_result_snippet_400[6] = { /* Utils::COMPUTE_SHADER */ 3336 "ivec4(13, 1, 2, 3)", 3337 /* Utils::VERTEX_SHADER */ 3338 "ivec4(11, 1, 2, 3)", 3339 /* Utils::TESS_CTRL_SHADER */ 3340 "ivec4(14, 1, 2, 3)", 3341 /* Utils::TESS_EVAL_SHADER */ 3342 "ivec4(14, 1, 2, 3)", 3343 /* Utils::GEOMETRY_SHADER */ 3344 "ivec4(15, 1, 2, 3)", 3345 /* Utils::FRAGMENT_SHADER */ 3346 "ivec4(12, 1, 2, 3)" 3347 }; 3348 3349 static const GLchar* line_numbering_snippet = "ivec4 glsl\\\n" 3350 "Test\\\n" 3351 "Function(in ivec3 arg)\n" 3352 "{\n" 3353 " return ivec4(__LINE__, arg.xyz);\n" 3354 "}\n"; 3355 3356 static const GLchar* compute_shader_template = 3357 "VERSION\n" 3358 "\n" 3359 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 3360 "\n" 3361 "writeonly uniform image2D uni_image;\n" 3362 "\n" 3363 "GLSL_TEST_FUNCTION" 3364 "\n" 3365 "void main()\n" 3366 "{\n" 3367 " vec4 result = vec4(1, 0, 0, 1);\n" 3368 "\n" 3369 " if (GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3)))\n" 3370 " {\n" 3371 " result = vec4(0, 1, 0, 1);\n" 3372 " }\n" 3373 "\n" 3374 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 3375 "}\n" 3376 "\n"; 3377 3378 static const GLchar* fragment_shader_template = 3379 "VERSION\n" 3380 "\n" 3381 "in vec4 gs_fs_result;\n" 3382 "out vec4 fs_out_result;\n" 3383 "\n" 3384 "GLSL_TEST_FUNCTION" 3385 "\n" 3386 "void main()\n" 3387 "{\n" 3388 " vec4 result = vec4(1, 0, 0, 1);\n" 3389 "\n" 3390 " if ((GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3))) &&\n" 3391 " (vec4(0, 1, 0, 1) == gs_fs_result) )\n" 3392 " {\n" 3393 " result = vec4(0, 1, 0, 1);\n" 3394 " }\n" 3395 "\n" 3396 " fs_out_result = result;\n" 3397 "}\n" 3398 "\n"; 3399 3400 static const GLchar* geometry_shader_template = 3401 "VERSION\n" 3402 "\n" 3403 "layout(points) in;\n" 3404 "layout(triangle_strip, max_vertices = 4) out;\n" 3405 "\n" 3406 "in vec4 tes_gs_result[];\n" 3407 "out vec4 gs_fs_result;\n" 3408 "\n" 3409 "GLSL_TEST_FUNCTION" 3410 "\n" 3411 "void main()\n" 3412 "{\n" 3413 " vec4 result = vec4(1, 0, 0, 1);\n" 3414 "\n" 3415 " if ((GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3))) &&\n" 3416 " (vec4(0, 1, 0, 1) == tes_gs_result[0]) )\n" 3417 " {\n" 3418 " result = vec4(0, 1, 0, 1);\n" 3419 " }\n" 3420 "\n" 3421 " gs_fs_result = result;\n" 3422 " gl_Position = vec4(-1, -1, 0, 1);\n" 3423 " EmitVertex();\n" 3424 " gs_fs_result = result;\n" 3425 " gl_Position = vec4(-1, 1, 0, 1);\n" 3426 " EmitVertex();\n" 3427 " gs_fs_result = result;\n" 3428 " gl_Position = vec4(1, -1, 0, 1);\n" 3429 " EmitVertex();\n" 3430 " gs_fs_result = result;\n" 3431 " gl_Position = vec4(1, 1, 0, 1);\n" 3432 " EmitVertex();\n" 3433 "}\n" 3434 "\n"; 3435 3436 static const GLchar* tess_ctrl_shader_template = 3437 "VERSION\n" 3438 "\n" 3439 "layout(vertices = 1) out;\n" 3440 "\n" 3441 "in vec4 vs_tcs_result[];\n" 3442 "out vec4 tcs_tes_result[];\n" 3443 "\n" 3444 "GLSL_TEST_FUNCTION" 3445 "\n" 3446 "void main()\n" 3447 "{\n" 3448 " vec4 result = vec4(1, 0, 0, 1);\n" 3449 "\n" 3450 " if ((GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3))) &&\n" 3451 " (vec4(0, 1, 0, 1) == vs_tcs_result[gl_InvocationID]) )\n" 3452 " {\n" 3453 " result = vec4(0, 1, 0, 1);\n" 3454 " }\n" 3455 "\n" 3456 " tcs_tes_result[gl_InvocationID] = result;\n" 3457 "\n" 3458 " gl_TessLevelOuter[0] = 1.0;\n" 3459 " gl_TessLevelOuter[1] = 1.0;\n" 3460 " gl_TessLevelOuter[2] = 1.0;\n" 3461 " gl_TessLevelOuter[3] = 1.0;\n" 3462 " gl_TessLevelInner[0] = 1.0;\n" 3463 " gl_TessLevelInner[1] = 1.0;\n" 3464 "}\n" 3465 "\n"; 3466 3467 static const GLchar* tess_eval_shader_template = 3468 "VERSION\n" 3469 "\n" 3470 "layout(isolines, point_mode) in;\n" 3471 "\n" 3472 "in vec4 tcs_tes_result[];\n" 3473 "out vec4 tes_gs_result;\n" 3474 "\n" 3475 "GLSL_TEST_FUNCTION" 3476 "\n" 3477 "void main()\n" 3478 "{\n" 3479 " vec4 result = vec4(1, 0, 0, 1);\n" 3480 "\n" 3481 " if ((GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3))) &&\n" 3482 " (vec4(0, 1, 0, 1) == tcs_tes_result[0]) )\n" 3483 " {\n" 3484 " result = vec4(0, 1, 0, 1);\n" 3485 " }\n" 3486 "\n" 3487 " tes_gs_result = result;\n" 3488 "}\n" 3489 "\n"; 3490 3491 static const GLchar* vertex_shader_template = "VERSION\n" 3492 "\n" 3493 "out vec4 vs_tcs_result;\n" 3494 "\n" 3495 "GLSL_TEST_FUNCTION" 3496 "\n" 3497 "void main()\n" 3498 "{\n" 3499 " vec4 result = vec4(1, 0, 0, 1);\n" 3500 "\n" 3501 " if (GLSL_TEST_RESULT == glslTestFunction(ivec3(1, 2, 3)))\n" 3502 " {\n" 3503 " result = vec4(0, 1, 0, 1);\n" 3504 " }\n" 3505 "\n" 3506 " vs_tcs_result = result;\n" 3507 "}\n" 3508 "\n"; 3509 3510 const GLchar* shader_template = 0; 3511 3512 switch (in_stage) 3513 { 3514 case Utils::COMPUTE_SHADER: 3515 shader_template = compute_shader_template; 3516 break; 3517 case Utils::FRAGMENT_SHADER: 3518 shader_template = fragment_shader_template; 3519 break; 3520 case Utils::GEOMETRY_SHADER: 3521 shader_template = geometry_shader_template; 3522 break; 3523 case Utils::TESS_CTRL_SHADER: 3524 shader_template = tess_ctrl_shader_template; 3525 break; 3526 case Utils::TESS_EVAL_SHADER: 3527 shader_template = tess_eval_shader_template; 3528 break; 3529 case Utils::VERTEX_SHADER: 3530 shader_template = vertex_shader_template; 3531 break; 3532 default: 3533 TCU_FAIL("Invalid enum"); 3534 break; 3535 } 3536 3537 out_source.m_parts[0].m_code = shader_template; 3538 3539 size_t position = 0; 3540 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 3541 out_source.m_parts[0].m_code); 3542 3543 Utils::replaceToken("GLSL_TEST_FUNCTION", position, line_numbering_snippet, out_source.m_parts[0].m_code); 3544 3545 Utils::replaceToken("GLSL_TEST_RESULT", position, 3546 in_use_version_400 ? test_result_snippet_400[in_stage] : test_result_snippet_normal[in_stage], 3547 out_source.m_parts[0].m_code); 3548 } 3549 3550 /** Constructor 3551 * 3552 * @param context Test context 3553 **/ 3554 UTF8CharactersTest::UTF8CharactersTest(deqp::Context& context) 3555 : GLSLTestBase(context, "utf8_characters", "UTF8 character used in comment or preprocessor") 3556 { 3557 /* Nothing to be done here */ 3558 } 3559 3560 /** Overwrite getShaderSourceConfig method 3561 * 3562 * @param out_n_parts Number of source parts used by this test case 3563 * @param out_use_lengths If source lengths shall be provided to compiler 3564 **/ 3565 void UTF8CharactersTest::getShaderSourceConfig(GLuint& out_n_parts, bool& out_use_lengths) 3566 { 3567 out_n_parts = 1; 3568 out_use_lengths = (AS_LAST_CHARACTER_NON_NULL_TERMINATED == m_test_case.m_case) ? true : false; 3569 } 3570 3571 /** Set up next test case 3572 * 3573 * @param test_case_index Index of next test case 3574 * 3575 * @return false if there is no more test cases, true otherwise 3576 **/ 3577 bool UTF8CharactersTest::prepareNextTestCase(glw::GLuint test_case_index) 3578 { 3579 static const testCase test_cases[] = { 3580 { IN_COMMENT, Utils::TWO_BYTES }, 3581 { IN_COMMENT, Utils::THREE_BYTES }, 3582 { IN_COMMENT, Utils::FOUR_BYTES }, 3583 { IN_COMMENT, Utils::FIVE_BYTES }, 3584 { IN_COMMENT, Utils::SIX_BYTES }, 3585 { IN_COMMENT, Utils::REDUNDANT_ASCII }, 3586 { IN_PREPROCESSOR, Utils::TWO_BYTES }, 3587 { IN_PREPROCESSOR, Utils::THREE_BYTES }, 3588 { IN_PREPROCESSOR, Utils::FOUR_BYTES }, 3589 { IN_PREPROCESSOR, Utils::FIVE_BYTES }, 3590 { IN_PREPROCESSOR, Utils::SIX_BYTES }, 3591 { IN_PREPROCESSOR, Utils::REDUNDANT_ASCII }, 3592 { AS_LAST_CHARACTER_NULL_TERMINATED, Utils::TWO_BYTES }, 3593 { AS_LAST_CHARACTER_NULL_TERMINATED, Utils::THREE_BYTES }, 3594 { AS_LAST_CHARACTER_NULL_TERMINATED, Utils::FOUR_BYTES }, 3595 { AS_LAST_CHARACTER_NULL_TERMINATED, Utils::FIVE_BYTES }, 3596 { AS_LAST_CHARACTER_NULL_TERMINATED, Utils::SIX_BYTES }, 3597 { AS_LAST_CHARACTER_NULL_TERMINATED, Utils::REDUNDANT_ASCII }, 3598 { AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::TWO_BYTES }, 3599 { AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::THREE_BYTES }, 3600 { AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::FOUR_BYTES }, 3601 { AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::FIVE_BYTES }, 3602 { AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::SIX_BYTES }, 3603 { AS_LAST_CHARACTER_NON_NULL_TERMINATED, Utils::REDUNDANT_ASCII }, 3604 }; 3605 3606 static const GLuint max_test_cases = sizeof(test_cases) / sizeof(testCase); 3607 3608 if ((GLuint)-1 == test_case_index) 3609 { 3610 m_test_case.m_case = DEBUG_CASE; 3611 m_test_case.m_character = Utils::EMPTY; 3612 } 3613 else if (max_test_cases <= test_case_index) 3614 { 3615 return false; 3616 } 3617 else 3618 { 3619 m_test_case = test_cases[test_case_index]; 3620 } 3621 3622 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Test case: utf8 character: " 3623 << Utils::getUtf8Character(m_test_case.m_character) << " is placed " 3624 << casesToStr() << tcu::TestLog::EndMessage; 3625 3626 return true; 3627 } 3628 3629 /** Prepare source for given shader stage 3630 * 3631 * @param in_stage Shader stage, compute shader will use 430 3632 * @param in_use_version_400 Select if 400 or 420 should be used 3633 * @param out_source Prepared shader source instance 3634 **/ 3635 void UTF8CharactersTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 3636 Utils::shaderSource& out_source) 3637 { 3638 static const GLchar* compute_shader_template = 3639 "VERSION\n" 3640 "\n" 3641 "// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n" 3642 "\n" 3643 "/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n" 3644 "\n" 3645 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 3646 "\n" 3647 "writeonly uniform image2D uni_image;\n" 3648 " uniform sampler2D uni_sampler;\n" 3649 "\n" 3650 "#if 0\n" 3651 " #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n" 3652 "#else\n" 3653 " #define SET_RESULT(XX) result = XX\n" 3654 "#endif\n" 3655 "\n" 3656 "void main()\n" 3657 "{\n" 3658 " ivec2 coordinates = ivec2(gl_GlobalInvocationID.xy + ivec2(16, 16));\n" 3659 " vec4 result = vec4(1, 0, 0, 1);\n" 3660 "\n" 3661 " if (vec4(0, 0, 1, 1) == texelFetch(uni_sampler, coordinates, 0 /* lod */))\n" 3662 " {\n" 3663 " SET_RESULT(vec4(0, 1, 0, 1));\n" 3664 " }\n" 3665 "\n" 3666 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 3667 "}\n" 3668 "// Lorem ipsum LAST_CHARACTER_CASE"; 3669 3670 static const GLchar* fragment_shader_template = 3671 "VERSION\n" 3672 "\n" 3673 "// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n" 3674 "\n" 3675 "/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n" 3676 "\n" 3677 "in vec4 gs_fs_result;\n" 3678 "in vec2 gs_fs_tex_coord;\n" 3679 "out vec4 fs_out_result;\n" 3680 "uniform sampler2D uni_sampler;\n" 3681 "\n" 3682 "#if 0\n" 3683 " #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n" 3684 "#else\n" 3685 " #define SET_RESULT(XX) result = XX\n" 3686 "#endif\n" 3687 "\n" 3688 "void main()\n" 3689 "{\n" 3690 " vec4 result = vec4(1, 0, 0, 1);\n" 3691 "\n" 3692 " if ((vec4(0, 0, 1, 1) == texture(uni_sampler, gs_fs_tex_coord)) &&\n" 3693 " (vec4(0, 1, 0, 1) == gs_fs_result) )\n" 3694 " {\n" 3695 " SET_RESULT(vec4(0, 1, 0, 1));\n" 3696 " }\n" 3697 "\n" 3698 " fs_out_result = result;\n" 3699 "}\n" 3700 "// Lorem ipsum LAST_CHARACTER_CASE"; 3701 3702 static const GLchar* geometry_shader_template = 3703 "VERSION\n" 3704 "\n" 3705 "// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n" 3706 "\n" 3707 "/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n" 3708 "\n" 3709 "layout(points) in;\n" 3710 "layout(triangle_strip, max_vertices = 4) out;\n" 3711 "\n" 3712 "in vec4 tes_gs_result[];\n" 3713 "out vec2 gs_fs_tex_coord;\n" 3714 "out vec4 gs_fs_result;\n" 3715 "uniform sampler2D uni_sampler;\n" 3716 "\n" 3717 "#if 0\n" 3718 " #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n" 3719 "#else\n" 3720 " #define SET_RESULT(XX) result = XX\n" 3721 "#endif\n" 3722 "\n" 3723 "void main()\n" 3724 "{\n" 3725 " vec4 result = vec4(1, 0, 0, 1);\n" 3726 "\n" 3727 " if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.5, 0.5))) &&\n" 3728 " (vec4(0, 1, 0, 1) == tes_gs_result[0]) )\n" 3729 " {\n" 3730 " SET_RESULT(vec4(0, 1, 0, 1));\n" 3731 " }\n" 3732 "\n" 3733 " gs_fs_tex_coord = vec2(0.25, 0.25);\n" 3734 " gs_fs_result = result;\n" 3735 " gl_Position = vec4(-1, -1, 0, 1);\n" 3736 " EmitVertex();\n" 3737 " gs_fs_tex_coord = vec2(0.25, 0.75);\n" 3738 " gs_fs_result = result;\n" 3739 " gl_Position = vec4(-1, 1, 0, 1);\n" 3740 " EmitVertex();\n" 3741 " gs_fs_tex_coord = vec2(0.75, 0.25);\n" 3742 " gs_fs_result = result;\n" 3743 " gl_Position = vec4(1, -1, 0, 1);\n" 3744 " EmitVertex();\n" 3745 " gs_fs_tex_coord = vec2(0.75, 0.75);\n" 3746 " gs_fs_result = result;\n" 3747 " gl_Position = vec4(1, 1, 0, 1);\n" 3748 " EmitVertex();\n" 3749 "}\n" 3750 "// Lorem ipsum LAST_CHARACTER_CASE"; 3751 3752 static const GLchar* tess_ctrl_shader_template = 3753 "VERSION\n" 3754 "\n" 3755 "// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n" 3756 "\n" 3757 "/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n" 3758 "\n" 3759 "layout(vertices = 1) out;\n" 3760 "\n" 3761 "in vec4 vs_tcs_result[];\n" 3762 "out vec4 tcs_tes_result[];\n" 3763 "uniform sampler2D uni_sampler;\n" 3764 "\n" 3765 "#if 0\n" 3766 " #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n" 3767 "#else\n" 3768 " #define SET_RESULT(XX) result = XX\n" 3769 "#endif\n" 3770 "\n" 3771 "void main()\n" 3772 "{\n" 3773 " vec4 result = vec4(1, 0, 0, 1);\n" 3774 "\n" 3775 " if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.4, 0.4))) &&\n" 3776 " (vec4(0, 1, 0, 1) == vs_tcs_result[gl_InvocationID]) )\n" 3777 " {\n" 3778 " SET_RESULT(vec4(0, 1, 0, 1));\n" 3779 " }\n" 3780 "\n" 3781 " tcs_tes_result[gl_InvocationID] = result;\n" 3782 "\n" 3783 " gl_TessLevelOuter[0] = 1.0;\n" 3784 " gl_TessLevelOuter[1] = 1.0;\n" 3785 " gl_TessLevelOuter[2] = 1.0;\n" 3786 " gl_TessLevelOuter[3] = 1.0;\n" 3787 " gl_TessLevelInner[0] = 1.0;\n" 3788 " gl_TessLevelInner[1] = 1.0;\n" 3789 "}\n" 3790 "// Lorem ipsum LAST_CHARACTER_CASE"; 3791 3792 static const GLchar* tess_eval_shader_template = 3793 "VERSION\n" 3794 "\n" 3795 "// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n" 3796 "\n" 3797 "/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n" 3798 "\n" 3799 "layout(isolines, point_mode) in;\n" 3800 "\n" 3801 "in vec4 tcs_tes_result[];\n" 3802 "out vec4 tes_gs_result;\n" 3803 "uniform sampler2D uni_sampler;\n" 3804 "\n" 3805 "#if 0\n" 3806 " #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n" 3807 "#else\n" 3808 " #define SET_RESULT(XX) result = XX\n" 3809 "#endif\n" 3810 "\n" 3811 "void main()\n" 3812 "{\n" 3813 " vec4 result = vec4(1, 0, 0, 1);\n" 3814 "\n" 3815 " if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.6, 0.6))) &&\n" 3816 " (vec4(0, 1, 0, 1) == tcs_tes_result[0]) )\n" 3817 " {\n" 3818 " SET_RESULT(vec4(0, 1, 0, 1));\n" 3819 " }\n" 3820 "\n" 3821 " tes_gs_result = result;\n" 3822 "}\n" 3823 "// Lorem ipsum LAST_CHARACTER_CASE"; 3824 3825 static const GLchar* vertex_shader_template = 3826 "VERSION\n" 3827 "\n" 3828 "// Lorem ipsum dolor sit amCOMMENT_CASEet, consectetur adipiscing elit posuere.\n" 3829 "\n" 3830 "/* Lorem ipsum dolor sit amet, conCOMMENT_CASEsectetur adipiscing elit posuere. */\n" 3831 "\n" 3832 "out vec4 vs_tcs_result;\n" 3833 "uniform sampler2D uni_sampler;\n" 3834 "\n" 3835 "#if 0\n" 3836 " #define SET_REPREPROCESSOR_CASESULT(XX) result = XX\n" 3837 "#else\n" 3838 " #define SET_RESULT(XX) result = XX\n" 3839 "#endif\n" 3840 "\n" 3841 "void main()\n" 3842 "{\n" 3843 " vec4 result = vec4(1, 0, 0, 1);\n" 3844 "\n" 3845 " if (vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.5, 0.5)) )\n" 3846 " {\n" 3847 " SET_RESULT(vec4(0, 1, 0, 1));\n" 3848 " }\n" 3849 "\n" 3850 " vs_tcs_result = result;\n" 3851 "}\n" 3852 "// Lorem ipsum LAST_CHARACTER_CASE"; 3853 3854 const GLchar* shader_template = 0; 3855 const GLchar* comment_case = ""; 3856 const GLchar* preprocessor_case = ""; 3857 const GLchar* last_character_case = ""; 3858 const GLchar* utf8_character = Utils::getUtf8Character(m_test_case.m_character); 3859 3860 switch (in_stage) 3861 { 3862 case Utils::COMPUTE_SHADER: 3863 shader_template = compute_shader_template; 3864 break; 3865 case Utils::FRAGMENT_SHADER: 3866 shader_template = fragment_shader_template; 3867 break; 3868 case Utils::GEOMETRY_SHADER: 3869 shader_template = geometry_shader_template; 3870 break; 3871 case Utils::TESS_CTRL_SHADER: 3872 shader_template = tess_ctrl_shader_template; 3873 break; 3874 case Utils::TESS_EVAL_SHADER: 3875 shader_template = tess_eval_shader_template; 3876 break; 3877 case Utils::VERTEX_SHADER: 3878 shader_template = vertex_shader_template; 3879 break; 3880 default: 3881 TCU_FAIL("Invalid enum"); 3882 break; 3883 } 3884 3885 switch (m_test_case.m_case) 3886 { 3887 case IN_COMMENT: 3888 comment_case = utf8_character; 3889 break; 3890 case IN_PREPROCESSOR: 3891 preprocessor_case = utf8_character; 3892 break; 3893 case AS_LAST_CHARACTER_NULL_TERMINATED: 3894 last_character_case = utf8_character; 3895 break; 3896 case AS_LAST_CHARACTER_NON_NULL_TERMINATED: 3897 last_character_case = utf8_character; 3898 break; 3899 case DEBUG_CASE: 3900 break; 3901 default: 3902 TCU_FAIL("Invalid enum"); 3903 } 3904 3905 out_source.m_parts[0].m_code = shader_template; 3906 3907 size_t position = 0; 3908 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 3909 out_source.m_parts[0].m_code); 3910 3911 Utils::replaceAllTokens("COMMENT_CASE", comment_case, out_source.m_parts[0].m_code); 3912 3913 Utils::replaceAllTokens("PREPROCESSOR_CASE", preprocessor_case, out_source.m_parts[0].m_code); 3914 3915 Utils::replaceAllTokens("LAST_CHARACTER_CASE", last_character_case, out_source.m_parts[0].m_code); 3916 } 3917 3918 /** Prepare texture 3919 * 3920 * @param texture Texutre to be created and filled with content 3921 * 3922 * @return Name of sampler uniform that should be used for the texture 3923 **/ 3924 const GLchar* UTF8CharactersTest::prepareSourceTexture(Utils::texture& texture) 3925 { 3926 std::vector<GLuint> data; 3927 static const GLuint width = 64; 3928 static const GLuint height = 64; 3929 static const GLuint data_size = width * height; 3930 static const GLuint blue_color = 0xffff0000; 3931 static const GLuint grey_color = 0xaaaaaaaa; 3932 3933 data.resize(data_size); 3934 3935 for (GLuint i = 0; i < data_size; ++i) 3936 { 3937 data[i] = grey_color; 3938 } 3939 3940 for (GLuint y = 16; y < 48; ++y) 3941 { 3942 const GLuint line_offset = y * 64; 3943 3944 for (GLuint x = 16; x < 48; ++x) 3945 { 3946 const GLuint pixel_offset = x + line_offset; 3947 3948 data[pixel_offset] = blue_color; 3949 } 3950 } 3951 3952 texture.create(width, height, GL_RGBA8); 3953 3954 texture.update(width, height, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); 3955 3956 return "uni_sampler"; 3957 } 3958 3959 /** Returns description of current test case 3960 * 3961 * @return String with description 3962 **/ 3963 const GLchar* UTF8CharactersTest::casesToStr() const 3964 { 3965 const GLchar* result = 0; 3966 3967 switch (m_test_case.m_case) 3968 { 3969 case IN_COMMENT: 3970 result = "in comment"; 3971 break; 3972 case IN_PREPROCESSOR: 3973 result = "in preprocessor"; 3974 break; 3975 case AS_LAST_CHARACTER_NULL_TERMINATED: 3976 result = "just before null"; 3977 break; 3978 case AS_LAST_CHARACTER_NON_NULL_TERMINATED: 3979 result = "as last character"; 3980 break; 3981 case DEBUG_CASE: 3982 result = "nowhere. This is debug!"; 3983 break; 3984 default: 3985 TCU_FAIL("Invalid enum"); 3986 } 3987 3988 return result; 3989 } 3990 3991 /** Constructor 3992 * 3993 * @param context Test context 3994 **/ 3995 UTF8InSourceTest::UTF8InSourceTest(deqp::Context& context) 3996 : NegativeTestBase(context, "utf8_in_source", "UTF8 characters used in shader source") 3997 { 3998 /* Nothing to be done here */ 3999 } 4000 4001 /** Set up next test case 4002 * 4003 * @param test_case_index Index of next test case 4004 * 4005 * @return false if there is no more test cases, true otherwise 4006 **/ 4007 bool UTF8InSourceTest::prepareNextTestCase(glw::GLuint test_case_index) 4008 { 4009 static const Utils::UTF8_CHARACTERS test_cases[] = { 4010 Utils::TWO_BYTES, Utils::THREE_BYTES, Utils::FOUR_BYTES, 4011 Utils::FIVE_BYTES, Utils::SIX_BYTES, Utils::REDUNDANT_ASCII 4012 }; 4013 4014 static const GLuint max_test_cases = sizeof(test_cases) / sizeof(Utils::UTF8_CHARACTERS); 4015 4016 if ((GLuint)-1 == test_case_index) 4017 { 4018 m_character = Utils::EMPTY; 4019 } 4020 else if (max_test_cases <= test_case_index) 4021 { 4022 return false; 4023 } 4024 else 4025 { 4026 m_character = test_cases[test_case_index]; 4027 } 4028 4029 m_context.getTestContext().getLog() << tcu::TestLog::Message 4030 << "Test case: utf8 character: " << Utils::getUtf8Character(m_character) 4031 << tcu::TestLog::EndMessage; 4032 4033 return true; 4034 } 4035 4036 /** Prepare source for given shader stage 4037 * 4038 * @param in_stage Shader stage, compute shader will use 430 4039 * @param in_use_version_400 Select if 400 or 420 should be used 4040 * @param out_source Prepared shader source instance 4041 **/ 4042 void UTF8InSourceTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 4043 Utils::shaderSource& out_source) 4044 { 4045 static const GLchar* compute_shader_template = 4046 "VERSION\n" 4047 "\n" 4048 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 4049 "\n" 4050 "writeonly uniform image2D uni_image;\n" 4051 " uniform sampler2D uni_sampler;\n" 4052 "\n" 4053 "#define SET_RESULT(XX) resHEREult = XX\n" 4054 "\n" 4055 "void main()\n" 4056 "{\n" 4057 " ivec2 coordinates = ivec2(gl_GlobalInvocationID.xy + ivec2(16, 16));\n" 4058 " vec4 resHEREult = vec4(1, 0, 0, 1);\n" 4059 "\n" 4060 " if (vec4(0, 0, 1, 1) == texelFetch(uni_sampler, coordinates, 0 /* lod */))\n" 4061 " {\n" 4062 " SET_RESULT(vec4(0, 1, 0, 1));\n" 4063 " }\n" 4064 "\n" 4065 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), resHEREult);\n" 4066 "}\n" 4067 ""; 4068 4069 static const GLchar* fragment_shader_template = 4070 "VERSION\n" 4071 "\n" 4072 "in vec4 gs_fs_result;\n" 4073 "in vec2 gs_fs_tex_coord;\n" 4074 "out vec4 fs_out_result;\n" 4075 "uniform sampler2D uni_sampler;\n" 4076 "\n" 4077 "#define SET_RESULT(XX) resHEREult = XX\n" 4078 "\n" 4079 "void main()\n" 4080 "{\n" 4081 " vec4 resHEREult = vec4(1, 0, 0, 1);\n" 4082 "\n" 4083 " if ((vec4(0, 0, 1, 1) == texture(uni_sampler, gs_fs_tex_coord)) &&\n" 4084 " (vec4(0, 1, 0, 1) == gs_fs_result) )\n" 4085 " {\n" 4086 " SET_RESULT(vec4(0, 1, 0, 1));\n" 4087 " }\n" 4088 "\n" 4089 " fs_out_result = resHEREult;\n" 4090 "}\n" 4091 "\n"; 4092 4093 static const GLchar* geometry_shader_template = 4094 "VERSION\n" 4095 "\n" 4096 "layout(points) in;\n" 4097 "layout(triangle_strip, max_vertices = 4) out;\n" 4098 "\n" 4099 "in vec4 tes_gHEREs_result[];\n" 4100 "out vec2 gs_fs_tex_coord;\n" 4101 "out vec4 gs_fs_result;\n" 4102 "uniform sampler2D uni_sampler;\n" 4103 "\n" 4104 "#define SET_RESULT(XX) result = XX\n" 4105 "\n" 4106 "void main()\n" 4107 "{\n" 4108 " vec4 result = vec4(1, 0, 0, 1);\n" 4109 "\n" 4110 " if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.5, 0.5))) &&\n" 4111 " (vec4(0, 1, 0, 1) == tes_gHEREs_result[0]) )\n" 4112 " {\n" 4113 " SET_RESULT(vec4(0, 1, 0, 1));\n" 4114 " }\n" 4115 "\n" 4116 " gs_fs_tex_coord = vec2(0.25, 0.25);\n" 4117 " gs_fs_result = result;\n" 4118 " gl_Position = vec4(-1, -1, 0, 1);\n" 4119 " EmitVertex();\n" 4120 " gs_fs_tex_coord = vec2(0.25, 0.75);\n" 4121 " gs_fs_result = result;\n" 4122 " gl_Position = vec4(-1, 1, 0, 1);\n" 4123 " EmitVertex();\n" 4124 " gs_fs_tex_coord = vec2(0.75, 0.25);\n" 4125 " gs_fs_result = result;\n" 4126 " gl_Position = vec4(1, -1, 0, 1);\n" 4127 " EmitVertex();\n" 4128 " gs_fs_tex_coord = vec2(0.75, 0.75);\n" 4129 " gs_fs_result = result;\n" 4130 " gl_Position = vec4(1, 1, 0, 1);\n" 4131 " EmitVertex();\n" 4132 "}\n" 4133 "\n"; 4134 4135 static const GLchar* tess_ctrl_shader_template = 4136 "VERSION\n" 4137 "\n" 4138 "layout(vertices = 1) out;\n" 4139 "\n" 4140 "in vec4 vs_tcs_result[];\n" 4141 "out vec4 tcHEREs_tes_result[];\n" 4142 "uniform sampler2D uni_sampler;\n" 4143 "\n" 4144 "#define SET_RESULT(XX) resulHEREt = XX\n" 4145 "\n" 4146 "void main()\n" 4147 "{\n" 4148 " vec4 resulHEREt = vec4(1, 0, 0, 1);\n" 4149 "\n" 4150 " if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.4, 0.4))) &&\n" 4151 " (vec4(0, 1, 0, 1) == vs_tcs_result[gl_InvocationID]) )\n" 4152 " {\n" 4153 " SET_RESULT(vec4(0, 1, 0, 1));\n" 4154 " }\n" 4155 "\n" 4156 " tcHEREs_tes_result[gl_InvocationID] = resulHEREt;\n" 4157 "\n" 4158 " gl_TessLevelOuter[0] = 1.0;\n" 4159 " gl_TessLevelOuter[1] = 1.0;\n" 4160 " gl_TessLevelOuter[2] = 1.0;\n" 4161 " gl_TessLevelOuter[3] = 1.0;\n" 4162 " gl_TessLevelInner[0] = 1.0;\n" 4163 " gl_TessLevelInner[1] = 1.0;\n" 4164 "}\n" 4165 "\n"; 4166 4167 static const GLchar* tess_eval_shader_template = 4168 "VERSION\n" 4169 "\n" 4170 "layout(isolines, point_mode) in;\n" 4171 "\n" 4172 "in vec4 tcs_tes_result[];\n" 4173 "out vec4 teHEREs_gs_result;\n" 4174 "uniform sampler2D uni_sampler;\n" 4175 "\n" 4176 "#define SET_RESULT(XX) reHEREsult = XX\n" 4177 "\n" 4178 "void main()\n" 4179 "{\n" 4180 " vec4 reHEREsult = vec4(1, 0, 0, 1);\n" 4181 "\n" 4182 " if ((vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.6, 0.6))) &&\n" 4183 " (vec4(0, 1, 0, 1) == tcs_tes_result[0]) )\n" 4184 " {\n" 4185 " SET_RESULT(vec4(0, 1, 0, 1));\n" 4186 " }\n" 4187 "\n" 4188 " teHEREs_gs_result = reHEREsult;\n" 4189 "}\n" 4190 "\n"; 4191 4192 static const GLchar* vertex_shader_template = "VERSION\n" 4193 "\n" 4194 "out vec4 vs_tcs_HEREresult;\n" 4195 "uniform sampler2D uni_sampler;\n" 4196 "\n" 4197 "#define SET_RHEREESULT(XX) resHEREult = XX\n" 4198 "\n" 4199 "void main()\n" 4200 "{\n" 4201 " vec4 resHEREult = vec4(1, 0, 0, 1);\n" 4202 "\n" 4203 " if (vec4(0, 0, 1, 1) == texture(uni_sampler, vec2(0.5, 0.5)) )\n" 4204 " {\n" 4205 " SET_RHEREESULT(vec4(0, 1, 0, 1));\n" 4206 " }\n" 4207 "\n" 4208 " vs_tcs_HEREresult = resHEREult;\n" 4209 "}\n" 4210 "\n"; 4211 4212 const GLchar* shader_template = 0; 4213 const GLchar* utf8_character = Utils::getUtf8Character(m_character); 4214 4215 switch (in_stage) 4216 { 4217 case Utils::COMPUTE_SHADER: 4218 shader_template = compute_shader_template; 4219 break; 4220 case Utils::FRAGMENT_SHADER: 4221 shader_template = fragment_shader_template; 4222 break; 4223 case Utils::GEOMETRY_SHADER: 4224 shader_template = geometry_shader_template; 4225 break; 4226 case Utils::TESS_CTRL_SHADER: 4227 shader_template = tess_ctrl_shader_template; 4228 break; 4229 case Utils::TESS_EVAL_SHADER: 4230 shader_template = tess_eval_shader_template; 4231 break; 4232 case Utils::VERTEX_SHADER: 4233 shader_template = vertex_shader_template; 4234 break; 4235 default: 4236 TCU_FAIL("Invalid enum"); 4237 break; 4238 } 4239 4240 out_source.m_parts[0].m_code = shader_template; 4241 4242 size_t position = 0; 4243 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 4244 out_source.m_parts[0].m_code); 4245 4246 Utils::replaceAllTokens("HERE", utf8_character, out_source.m_parts[0].m_code); 4247 } 4248 4249 /** Constructor 4250 * 4251 * @param context Test context 4252 **/ 4253 ImplicitConversionsValidTest::ImplicitConversionsValidTest(deqp::Context& context) 4254 : GLSLTestBase(context, "implicit_conversions", "Verifies that implicit conversions are allowed") 4255 { 4256 /* Nothing to be done */ 4257 } 4258 4259 /** Set up next test case 4260 * 4261 * @param test_case_index Index of next test case 4262 * 4263 * @return false if there is no more test cases, true otherwise 4264 **/ 4265 bool ImplicitConversionsValidTest::prepareNextTestCase(glw::GLuint test_case_index) 4266 { 4267 m_current_test_case_index = test_case_index; 4268 4269 if ((glw::GLuint)-1 == test_case_index) 4270 { 4271 return true; 4272 } 4273 else if (m_test_cases.size() <= test_case_index) 4274 { 4275 return false; 4276 } 4277 4278 const testCase& test_case = m_test_cases[test_case_index]; 4279 4280 m_context.getTestContext().getLog() << tcu::TestLog::Message 4281 << "T1:" << Utils::getTypeName(test_case.m_types.m_t1, test_case.m_n_cols, 4282 test_case.m_n_rows) 4283 << " T2:" << Utils::getTypeName(test_case.m_types.m_t2, test_case.m_n_cols, 4284 test_case.m_n_rows) 4285 << tcu::TestLog::EndMessage; 4286 4287 return true; 4288 } 4289 4290 /** Prepare source for given shader stage 4291 * 4292 * @param in_stage Shader stage, compute shader will use 430 4293 * @param in_use_version_400 Select if 400 or 420 should be used 4294 * @param out_source Prepared shader source instance 4295 **/ 4296 void ImplicitConversionsValidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 4297 Utils::shaderSource& out_source) 4298 { 4299 static const GLchar* function_definition = "T1 function(in T2 left, in T2 right)\n" 4300 "{\n" 4301 " return left + right;\n" 4302 "}\n"; 4303 4304 static const GLchar* verification_snippet = " const T2 const_left = T2(VALUE_LIST);\n" 4305 " const T2 const_right = T2(VALUE_LIST);\n" 4306 "\n" 4307 " T1 const_result = function(const_left, const_right);\n" 4308 "\n" 4309 " T1 literal_result = function(T2(VALUE_LIST), T2(VALUE_LIST));\n" 4310 "\n" 4311 " T2 var_left = uni_left;\n" 4312 " T2 var_right = uni_right;\n" 4313 "\n" 4314 " T1 var_result = function(var_left, var_right);\n" 4315 "\n" 4316 " if ((literal_result != const_result) ||\n" 4317 " (const_result != var_result) )\n" 4318 " {\n" 4319 " result = vec4(1, 0, 0, 1);\n" 4320 " }\n"; 4321 4322 static const GLchar* compute_shader_template = 4323 "VERSION\n" 4324 "\n" 4325 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 4326 "\n" 4327 "writeonly uniform image2D uni_image;\n" 4328 " uniform T2 uni_left;\n" 4329 " uniform T2 uni_right;\n" 4330 "\n" 4331 "FUNCTION_DEFINITION" 4332 "\n" 4333 "void main()\n" 4334 "{\n" 4335 " vec4 result = vec4(0, 1, 0, 1);\n" 4336 "\n" 4337 "VERIFICATION" 4338 "\n" 4339 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 4340 "}\n" 4341 "\n"; 4342 4343 static const GLchar* fragment_shader_template = "VERSION\n" 4344 "\n" 4345 "in vec4 gs_fs_result;\n" 4346 "out vec4 fs_out_result;\n" 4347 "uniform T2 uni_left;\n" 4348 "uniform T2 uni_right;\n" 4349 "\n" 4350 "FUNCTION_DEFINITION" 4351 "\n" 4352 "void main()\n" 4353 "{\n" 4354 " vec4 result = vec4(0, 1, 0, 1);\n" 4355 "\n" 4356 "VERIFICATION" 4357 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 4358 " {\n" 4359 " result = vec4(1, 0, 0, 1);\n" 4360 " }\n" 4361 "\n" 4362 " fs_out_result = result;\n" 4363 "}\n" 4364 "\n"; 4365 4366 static const GLchar* geometry_shader_template = "VERSION\n" 4367 "\n" 4368 "layout(points) in;\n" 4369 "layout(triangle_strip, max_vertices = 4) out;\n" 4370 "\n" 4371 "in vec4 tes_gs_result[];\n" 4372 "out vec4 gs_fs_result;\n" 4373 "uniform T2 uni_left;\n" 4374 "uniform T2 uni_right;\n" 4375 "\n" 4376 "FUNCTION_DEFINITION" 4377 "\n" 4378 "void main()\n" 4379 "{\n" 4380 " vec4 result = vec4(0, 1, 0, 1);\n" 4381 "\n" 4382 "VERIFICATION" 4383 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 4384 " {\n" 4385 " result = vec4(1, 0, 0, 1);\n" 4386 " }\n" 4387 "\n" 4388 " gs_fs_result = result;\n" 4389 " gl_Position = vec4(-1, -1, 0, 1);\n" 4390 " EmitVertex();\n" 4391 " gs_fs_result = result;\n" 4392 " gl_Position = vec4(-1, 1, 0, 1);\n" 4393 " EmitVertex();\n" 4394 " gs_fs_result = result;\n" 4395 " gl_Position = vec4(1, -1, 0, 1);\n" 4396 " EmitVertex();\n" 4397 " gs_fs_result = result;\n" 4398 " gl_Position = vec4(1, 1, 0, 1);\n" 4399 " EmitVertex();\n" 4400 "}\n" 4401 "\n"; 4402 4403 static const GLchar* tess_ctrl_shader_template = 4404 "VERSION\n" 4405 "\n" 4406 "layout(vertices = 1) out;\n" 4407 "\n" 4408 "in vec4 vs_tcs_result[];\n" 4409 "out vec4 tcs_tes_result[];\n" 4410 "uniform T2 uni_left;\n" 4411 "uniform T2 uni_right;\n" 4412 "\n" 4413 "FUNCTION_DEFINITION" 4414 "\n" 4415 "void main()\n" 4416 "{\n" 4417 " vec4 result = vec4(0, 1, 0, 1);\n" 4418 "\n" 4419 "VERIFICATION" 4420 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 4421 " {\n" 4422 " result = vec4(1, 0, 0, 1);\n" 4423 " }\n" 4424 "\n" 4425 " tcs_tes_result[gl_InvocationID] = result;\n" 4426 "\n" 4427 " gl_TessLevelOuter[0] = 1.0;\n" 4428 " gl_TessLevelOuter[1] = 1.0;\n" 4429 " gl_TessLevelOuter[2] = 1.0;\n" 4430 " gl_TessLevelOuter[3] = 1.0;\n" 4431 " gl_TessLevelInner[0] = 1.0;\n" 4432 " gl_TessLevelInner[1] = 1.0;\n" 4433 "}\n" 4434 "\n"; 4435 4436 static const GLchar* tess_eval_shader_template = "VERSION\n" 4437 "\n" 4438 "layout(isolines, point_mode) in;\n" 4439 "\n" 4440 "in vec4 tcs_tes_result[];\n" 4441 "out vec4 tes_gs_result;\n" 4442 "uniform T2 uni_left;\n" 4443 "uniform T2 uni_right;\n" 4444 "\n" 4445 "FUNCTION_DEFINITION" 4446 "\n" 4447 "void main()\n" 4448 "{\n" 4449 " vec4 result = vec4(0, 1, 0, 1);\n" 4450 "\n" 4451 "VERIFICATION" 4452 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 4453 " {\n" 4454 " result = vec4(1, 0, 0, 1);\n" 4455 " }\n" 4456 "\n" 4457 " tes_gs_result = result;\n" 4458 "}\n" 4459 "\n"; 4460 4461 static const GLchar* vertex_shader_template = "VERSION\n" 4462 "\n" 4463 "out vec4 vs_tcs_result;\n" 4464 "uniform T2 uni_left;\n" 4465 "uniform T2 uni_right;\n" 4466 "\n" 4467 "FUNCTION_DEFINITION" 4468 "\n" 4469 "void main()\n" 4470 "{\n" 4471 " vec4 result = vec4(0, 1, 0, 1);\n" 4472 "\n" 4473 "VERIFICATION" 4474 "\n" 4475 " vs_tcs_result = result;\n" 4476 "}\n" 4477 "\n"; 4478 4479 const testCase& test_case = getCurrentTestCase(); 4480 const GLchar* t1 = Utils::getTypeName(test_case.m_types.m_t1, test_case.m_n_cols, test_case.m_n_rows); 4481 const GLchar* t2 = Utils::getTypeName(test_case.m_types.m_t2, test_case.m_n_cols, test_case.m_n_rows); 4482 const std::string& value_list = getValueList(test_case.m_n_cols, test_case.m_n_rows); 4483 const GLchar* shader_template = 0; 4484 4485 switch (in_stage) 4486 { 4487 case Utils::COMPUTE_SHADER: 4488 shader_template = compute_shader_template; 4489 break; 4490 case Utils::FRAGMENT_SHADER: 4491 shader_template = fragment_shader_template; 4492 break; 4493 case Utils::GEOMETRY_SHADER: 4494 shader_template = geometry_shader_template; 4495 break; 4496 case Utils::TESS_CTRL_SHADER: 4497 shader_template = tess_ctrl_shader_template; 4498 break; 4499 case Utils::TESS_EVAL_SHADER: 4500 shader_template = tess_eval_shader_template; 4501 break; 4502 case Utils::VERTEX_SHADER: 4503 shader_template = vertex_shader_template; 4504 break; 4505 default: 4506 TCU_FAIL("Invalid enum"); 4507 break; 4508 } 4509 4510 out_source.m_parts[0].m_code = shader_template; 4511 4512 size_t position = 0; 4513 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 4514 out_source.m_parts[0].m_code); 4515 4516 Utils::replaceToken("FUNCTION_DEFINITION", position, function_definition, out_source.m_parts[0].m_code); 4517 4518 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 4519 4520 Utils::replaceAllTokens("VALUE_LIST", value_list.c_str(), out_source.m_parts[0].m_code); 4521 4522 Utils::replaceAllTokens("T1", t1, out_source.m_parts[0].m_code); 4523 4524 Utils::replaceAllTokens("T2", t2, out_source.m_parts[0].m_code); 4525 } 4526 4527 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 4528 * 4529 * @param program Current program 4530 **/ 4531 void ImplicitConversionsValidTest::prepareUniforms(Utils::program& program) 4532 { 4533 static const GLdouble double_data[16] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4534 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; 4535 static const GLfloat float_data[16] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 4536 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; 4537 static const GLint int_data[4] = { 1, 1, 1, 1 }; 4538 static const GLuint uint_data[4] = { 1u, 1u, 1u, 1u }; 4539 4540 const testCase& test_case = getCurrentTestCase(); 4541 4542 switch (test_case.m_types.m_t2) 4543 { 4544 case Utils::DOUBLE: 4545 program.uniform("uni_left", Utils::DOUBLE, test_case.m_n_cols, test_case.m_n_rows, double_data); 4546 program.uniform("uni_right", Utils::DOUBLE, test_case.m_n_cols, test_case.m_n_rows, double_data); 4547 break; 4548 case Utils::FLOAT: 4549 program.uniform("uni_left", Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows, float_data); 4550 program.uniform("uni_right", Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows, float_data); 4551 break; 4552 case Utils::INT: 4553 program.uniform("uni_left", Utils::INT, test_case.m_n_cols, test_case.m_n_rows, int_data); 4554 program.uniform("uni_right", Utils::INT, test_case.m_n_cols, test_case.m_n_rows, int_data); 4555 break; 4556 case Utils::UINT: 4557 program.uniform("uni_left", Utils::UINT, test_case.m_n_cols, test_case.m_n_rows, uint_data); 4558 program.uniform("uni_right", Utils::UINT, test_case.m_n_cols, test_case.m_n_rows, uint_data); 4559 break; 4560 default: 4561 TCU_FAIL("Invalid enum"); 4562 } 4563 } 4564 4565 /** Prepare test cases 4566 * 4567 * @return true 4568 **/ 4569 bool ImplicitConversionsValidTest::testInit() 4570 { 4571 static const typesPair allowed_conversions[] = { 4572 { Utils::UINT, Utils::INT }, { Utils::FLOAT, Utils::INT }, { Utils::DOUBLE, Utils::INT }, 4573 { Utils::FLOAT, Utils::UINT }, { Utils::DOUBLE, Utils::UINT }, { Utils::FLOAT, Utils::FLOAT }, 4574 }; 4575 4576 static GLuint n_allowed_conversions = sizeof(allowed_conversions) / sizeof(typesPair); 4577 4578 m_debug_test_case.m_types.m_t1 = Utils::FLOAT; 4579 m_debug_test_case.m_types.m_t2 = Utils::FLOAT; 4580 m_debug_test_case.m_n_cols = 4; 4581 m_debug_test_case.m_n_rows = 4; 4582 4583 for (GLuint i = 0; i < n_allowed_conversions; ++i) 4584 { 4585 const typesPair& types = allowed_conversions[i]; 4586 4587 GLuint allowed_columns = 1; 4588 if ((true == Utils::doesTypeSupportMatrix(types.m_t1)) && (true == Utils::doesTypeSupportMatrix(types.m_t2))) 4589 { 4590 allowed_columns = 4; 4591 } 4592 4593 { 4594 testCase test_case = { types, 1, 1 }; 4595 4596 m_test_cases.push_back(test_case); 4597 } 4598 4599 for (GLuint row = 2; row <= 4; ++row) 4600 { 4601 for (GLuint col = 1; col <= allowed_columns; ++col) 4602 { 4603 testCase test_case = { types, col, row }; 4604 4605 m_test_cases.push_back(test_case); 4606 } 4607 } 4608 } 4609 4610 return true; 4611 } 4612 4613 /** Returns reference to current test case 4614 * 4615 * @return Reference to testCase 4616 **/ 4617 const ImplicitConversionsValidTest::testCase& ImplicitConversionsValidTest::getCurrentTestCase() 4618 { 4619 if ((glw::GLuint)-1 == m_current_test_case_index) 4620 { 4621 return m_debug_test_case; 4622 } 4623 else 4624 { 4625 return m_test_cases[m_current_test_case_index]; 4626 } 4627 } 4628 4629 /** Get list of values to for glsl constants 4630 * 4631 * @param n_columns Number of columns 4632 * @param n_rows Number of rows 4633 * 4634 * @return String with list of values separated with comma 4635 **/ 4636 std::string ImplicitConversionsValidTest::getValueList(glw::GLuint n_columns, glw::GLuint n_rows) 4637 { 4638 std::string result; 4639 4640 for (GLuint i = 0; i < n_columns * n_rows; ++i) 4641 { 4642 if (i != n_columns * n_rows - 1) 4643 { 4644 result.append("1, "); 4645 } 4646 else 4647 { 4648 result.append("1"); 4649 } 4650 } 4651 4652 return result; 4653 } 4654 4655 /** Constructor 4656 * 4657 * @param context Test context 4658 **/ 4659 ImplicitConversionsInvalidTest::ImplicitConversionsInvalidTest(deqp::Context& context) 4660 : NegativeTestBase(context, "implicit_conversions_invalid", 4661 "Verifies that implicit conversions from uint to int are forbidden") 4662 { 4663 /* Nothing to be done here */ 4664 } 4665 4666 /** Set up next test case 4667 * 4668 * @param test_case_index Index of next test case 4669 * 4670 * @return false if there is no more test cases, true otherwise 4671 **/ 4672 bool ImplicitConversionsInvalidTest::prepareNextTestCase(glw::GLuint test_case_index) 4673 { 4674 m_current_test_case_index = test_case_index; 4675 4676 if ((glw::GLuint)-1 == test_case_index) 4677 { 4678 return false; 4679 } 4680 else if (4 <= test_case_index) 4681 { 4682 return false; 4683 } 4684 4685 m_context.getTestContext().getLog() << tcu::TestLog::Message 4686 << "T1:" << Utils::getTypeName(Utils::UINT, 1, test_case_index + 1) 4687 << " T2:" << Utils::getTypeName(Utils::INT, 1, test_case_index + 1) 4688 << tcu::TestLog::EndMessage; 4689 4690 return true; 4691 } 4692 4693 /** Prepare source for given shader stage 4694 * 4695 * @param in_stage Shader stage, compute shader will use 430 4696 * @param in_use_version_400 Select if 400 or 420 should be used 4697 * @param out_source Prepared shader source instance 4698 **/ 4699 void ImplicitConversionsInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 4700 Utils::shaderSource& out_source) 4701 { 4702 static const GLchar* function_definition = "T1 function(in T2 left, in T2 right)\n" 4703 "{\n" 4704 " return left + right;\n" 4705 "}\n"; 4706 4707 static const GLchar* verification_snippet = " const T2 const_left = T2(VALUE_LIST);\n" 4708 " const T2 const_right = T2(VALUE_LIST);\n" 4709 "\n" 4710 " T1 const_result = function(const_left, const_right);\n" 4711 "\n" 4712 " T1 literal_result = function(T2(VALUE_LIST), T2(VALUE_LIST));\n" 4713 "\n" 4714 " T2 var_left = uni_left;\n" 4715 " T2 var_right = uni_right;\n" 4716 "\n" 4717 " T1 var_result = function(var_left, var_right);\n" 4718 "\n" 4719 " if ((literal_result != const_result) ||\n" 4720 " (const_result != var_result) )\n" 4721 " {\n" 4722 " result = vec4(1, 0, 0, 1);\n" 4723 " }\n"; 4724 4725 static const GLchar* compute_shader_template = 4726 "VERSION\n" 4727 "\n" 4728 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 4729 "\n" 4730 "writeonly uniform image2D uni_image;\n" 4731 " uniform T2 uni_left;\n" 4732 " uniform T2 uni_right;\n" 4733 "\n" 4734 "FUNCTION_DEFINITION" 4735 "\n" 4736 "void main()\n" 4737 "{\n" 4738 " vec4 result = vec4(0, 1, 0, 1);\n" 4739 "\n" 4740 "VERIFICATION" 4741 "\n" 4742 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 4743 "}\n" 4744 "\n"; 4745 4746 static const GLchar* fragment_shader_template = "VERSION\n" 4747 "\n" 4748 "in vec4 gs_fs_result;\n" 4749 "out vec4 fs_out_result;\n" 4750 "uniform T2 uni_left;\n" 4751 "uniform T2 uni_right;\n" 4752 "\n" 4753 "FUNCTION_DEFINITION" 4754 "\n" 4755 "void main()\n" 4756 "{\n" 4757 " vec4 result = vec4(0, 1, 0, 1);\n" 4758 "\n" 4759 "VERIFICATION" 4760 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 4761 " {\n" 4762 " result = vec4(1, 0, 0, 1);\n" 4763 " }\n" 4764 "\n" 4765 " fs_out_result = result;\n" 4766 "}\n" 4767 "\n"; 4768 4769 static const GLchar* geometry_shader_template = "VERSION\n" 4770 "\n" 4771 "layout(points) in;\n" 4772 "layout(triangle_strip, max_vertices = 4) out;\n" 4773 "\n" 4774 "in vec4 tes_gs_result[];\n" 4775 "out vec4 gs_fs_result;\n" 4776 "uniform T2 uni_left;\n" 4777 "uniform T2 uni_right;\n" 4778 "\n" 4779 "FUNCTION_DEFINITION" 4780 "\n" 4781 "void main()\n" 4782 "{\n" 4783 " vec4 result = vec4(0, 1, 0, 1);\n" 4784 "\n" 4785 "VERIFICATION" 4786 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 4787 " {\n" 4788 " result = vec4(1, 0, 0, 1);\n" 4789 " }\n" 4790 "\n" 4791 " gs_fs_result = result;\n" 4792 " gl_Position = vec4(-1, -1, 0, 1);\n" 4793 " EmitVertex();\n" 4794 " gs_fs_result = result;\n" 4795 " gl_Position = vec4(-1, 1, 0, 1);\n" 4796 " EmitVertex();\n" 4797 " gs_fs_result = result;\n" 4798 " gl_Position = vec4(1, -1, 0, 1);\n" 4799 " EmitVertex();\n" 4800 " gs_fs_result = result;\n" 4801 " gl_Position = vec4(1, 1, 0, 1);\n" 4802 " EmitVertex();\n" 4803 "}\n" 4804 "\n"; 4805 4806 static const GLchar* tess_ctrl_shader_template = 4807 "VERSION\n" 4808 "\n" 4809 "layout(vertices = 1) out;\n" 4810 "\n" 4811 "in vec4 vs_tcs_result[];\n" 4812 "out vec4 tcs_tes_result[];\n" 4813 "uniform T2 uni_left;\n" 4814 "uniform T2 uni_right;\n" 4815 "\n" 4816 "FUNCTION_DEFINITION" 4817 "\n" 4818 "void main()\n" 4819 "{\n" 4820 " vec4 result = vec4(0, 1, 0, 1);\n" 4821 "\n" 4822 "VERIFICATION" 4823 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 4824 " {\n" 4825 " result = vec4(1, 0, 0, 1);\n" 4826 " }\n" 4827 "\n" 4828 " tcs_tes_result[gl_InvocationID] = result;\n" 4829 "\n" 4830 " gl_TessLevelOuter[0] = 1.0;\n" 4831 " gl_TessLevelOuter[1] = 1.0;\n" 4832 " gl_TessLevelOuter[2] = 1.0;\n" 4833 " gl_TessLevelOuter[3] = 1.0;\n" 4834 " gl_TessLevelInner[0] = 1.0;\n" 4835 " gl_TessLevelInner[1] = 1.0;\n" 4836 "}\n" 4837 "\n"; 4838 4839 static const GLchar* tess_eval_shader_template = "VERSION\n" 4840 "\n" 4841 "layout(isolines, point_mode) in;\n" 4842 "\n" 4843 "in vec4 tcs_tes_result[];\n" 4844 "out vec4 tes_gs_result;\n" 4845 "uniform T2 uni_left;\n" 4846 "uniform T2 uni_right;\n" 4847 "\n" 4848 "FUNCTION_DEFINITION" 4849 "\n" 4850 "void main()\n" 4851 "{\n" 4852 " vec4 result = vec4(0, 1, 0, 1);\n" 4853 "\n" 4854 "VERIFICATION" 4855 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 4856 " {\n" 4857 " result = vec4(1, 0, 0, 1);\n" 4858 " }\n" 4859 "\n" 4860 " tes_gs_result = result;\n" 4861 "}\n" 4862 "\n"; 4863 4864 static const GLchar* vertex_shader_template = "VERSION\n" 4865 "\n" 4866 "out vec4 vs_tcs_result;\n" 4867 "uniform T2 uni_left;\n" 4868 "uniform T2 uni_right;\n" 4869 "\n" 4870 "FUNCTION_DEFINITION" 4871 "\n" 4872 "void main()\n" 4873 "{\n" 4874 " vec4 result = vec4(0, 1, 0, 1);\n" 4875 "\n" 4876 "VERIFICATION" 4877 "\n" 4878 " vs_tcs_result = result;\n" 4879 "}\n" 4880 "\n"; 4881 4882 GLuint n_rows = m_current_test_case_index + 1; 4883 const GLchar* t1 = Utils::getTypeName(Utils::INT, 1, n_rows); 4884 const GLchar* t2 = Utils::getTypeName(Utils::UINT, 1, n_rows); 4885 const std::string& value_list = getValueList(n_rows); 4886 const GLchar* shader_template = 0; 4887 4888 switch (in_stage) 4889 { 4890 case Utils::COMPUTE_SHADER: 4891 shader_template = compute_shader_template; 4892 break; 4893 case Utils::FRAGMENT_SHADER: 4894 shader_template = fragment_shader_template; 4895 break; 4896 case Utils::GEOMETRY_SHADER: 4897 shader_template = geometry_shader_template; 4898 break; 4899 case Utils::TESS_CTRL_SHADER: 4900 shader_template = tess_ctrl_shader_template; 4901 break; 4902 case Utils::TESS_EVAL_SHADER: 4903 shader_template = tess_eval_shader_template; 4904 break; 4905 case Utils::VERTEX_SHADER: 4906 shader_template = vertex_shader_template; 4907 break; 4908 default: 4909 TCU_FAIL("Invalid enum"); 4910 break; 4911 } 4912 4913 out_source.m_parts[0].m_code = shader_template; 4914 4915 size_t position = 0; 4916 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 4917 out_source.m_parts[0].m_code); 4918 4919 Utils::replaceToken("FUNCTION_DEFINITION", position, function_definition, out_source.m_parts[0].m_code); 4920 4921 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 4922 4923 Utils::replaceAllTokens("VALUE_LIST", value_list.c_str(), out_source.m_parts[0].m_code); 4924 4925 Utils::replaceAllTokens("T1", t1, out_source.m_parts[0].m_code); 4926 4927 Utils::replaceAllTokens("T2", t2, out_source.m_parts[0].m_code); 4928 } 4929 4930 /** Get list of values to for glsl constants 4931 * 4932 * @return String with list of values separated with comma 4933 **/ 4934 std::string ImplicitConversionsInvalidTest::getValueList(glw::GLuint n_rows) 4935 { 4936 std::string result; 4937 4938 for (GLuint i = 0; i < n_rows; ++i) 4939 { 4940 if (i != n_rows - 1) 4941 { 4942 result.append("1, "); 4943 } 4944 else 4945 { 4946 result.append("1"); 4947 } 4948 } 4949 4950 return result; 4951 } 4952 4953 /** Constructor 4954 * 4955 * @param context Test context 4956 **/ 4957 ConstDynamicValueTest::ConstDynamicValueTest(deqp::Context& context) 4958 : GLSLTestBase(context, "const_dynamic_value", "Test if constants can be initialized with dynamic values") 4959 { 4960 /* Nothing to be done here */ 4961 } 4962 4963 /** Prepare source for given shader stage 4964 * 4965 * @param in_stage Shader stage, compute shader will use 430 4966 * @param in_use_version_400 Select if 400 or 420 should be used 4967 * @param out_source Prepared shader source instance 4968 **/ 4969 void ConstDynamicValueTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 4970 Utils::shaderSource& out_source) 4971 { 4972 static const GLchar* struct_definition = "struct S {\n" 4973 " float scalar;\n" 4974 " vec4 vector;\n" 4975 " mat2 matrix;\n" 4976 "};\n"; 4977 4978 static const GLchar* verification_snippet = " const float c1 = uni_scalar;\n" 4979 " const vec4 c2 = uni_vector;\n" 4980 " const mat2 c3 = uni_matrix;\n" 4981 " const S c4 = { uni_scalar, uni_vector, uni_matrix };\n" 4982 " const vec4 c5[15] = { uni_vector,\n" 4983 " uni_vector,\n" 4984 " uni_vector,\n" 4985 " uni_vector,\n" 4986 " uni_vector,\n" 4987 " uni_vector,\n" 4988 " uni_vector,\n" 4989 " uni_vector,\n" 4990 " uni_vector,\n" 4991 " uni_vector,\n" 4992 " uni_vector,\n" 4993 " uni_vector,\n" 4994 " uni_vector,\n" 4995 " uni_vector,\n" 4996 " uni_vector };\n" 4997 " if ((SCALAR != c1) ||\n" 4998 " (VECTOR != c2) ||\n" 4999 " (MATRIX != c3) ||\n" 5000 " (SCALAR != c4.scalar) ||\n" 5001 " (VECTOR != c4.vector) ||\n" 5002 " (MATRIX != c4.matrix) ||\n" 5003 " (VECTOR != c5[0]) ||\n" 5004 " (VECTOR != c5[1]) ||\n" 5005 " (VECTOR != c5[2]) ||\n" 5006 " (VECTOR != c5[3]) ||\n" 5007 " (VECTOR != c5[4]) ||\n" 5008 " (VECTOR != c5[5]) ||\n" 5009 " (VECTOR != c5[6]) ||\n" 5010 " (VECTOR != c5[7]) ||\n" 5011 " (VECTOR != c5[8]) ||\n" 5012 " (VECTOR != c5[9]) ||\n" 5013 " (VECTOR != c5[10]) ||\n" 5014 " (VECTOR != c5[11]) ||\n" 5015 " (VECTOR != c5[12]) ||\n" 5016 " (VECTOR != c5[13]) ||\n" 5017 " (VECTOR != c5[14]) )\n" 5018 " {\n" 5019 " result = vec4(1, 0, 0, 1);\n" 5020 " }\n"; 5021 5022 static const GLchar* compute_shader_template = 5023 "VERSION\n" 5024 "\n" 5025 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 5026 "\n" 5027 "writeonly uniform image2D uni_image;\n" 5028 " uniform float uni_scalar;\n" 5029 " uniform vec4 uni_vector;\n" 5030 " uniform mat2 uni_matrix;\n" 5031 "\n" 5032 "STRUCTURE_DEFINITION" 5033 "\n" 5034 "void main()\n" 5035 "{\n" 5036 " vec4 result = vec4(0, 1, 0, 1);\n" 5037 "\n" 5038 "VERIFICATION" 5039 "\n" 5040 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 5041 "}\n" 5042 "\n"; 5043 5044 static const GLchar* fragment_shader_template = "VERSION\n" 5045 "\n" 5046 "in vec4 gs_fs_result;\n" 5047 "out vec4 fs_out_result;\n" 5048 "uniform float uni_scalar;\n" 5049 "uniform vec4 uni_vector;\n" 5050 "uniform mat2 uni_matrix;\n" 5051 "\n" 5052 "STRUCTURE_DEFINITION" 5053 "\n" 5054 "void main()\n" 5055 "{\n" 5056 " vec4 result = vec4(0, 1, 0, 1);\n" 5057 "\n" 5058 "VERIFICATION" 5059 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 5060 " {\n" 5061 " result = vec4(1, 0, 0, 1);\n" 5062 " }\n" 5063 "\n" 5064 " fs_out_result = result;\n" 5065 "}\n" 5066 "\n"; 5067 5068 static const GLchar* geometry_shader_template = "VERSION\n" 5069 "\n" 5070 "layout(points) in;\n" 5071 "layout(triangle_strip, max_vertices = 4) out;\n" 5072 "\n" 5073 "in vec4 tes_gs_result[];\n" 5074 "out vec4 gs_fs_result;\n" 5075 "uniform float uni_scalar;\n" 5076 "uniform vec4 uni_vector;\n" 5077 "uniform mat2 uni_matrix;\n" 5078 "\n" 5079 "STRUCTURE_DEFINITION" 5080 "\n" 5081 "void main()\n" 5082 "{\n" 5083 " vec4 result = vec4(0, 1, 0, 1);\n" 5084 "\n" 5085 "VERIFICATION" 5086 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 5087 " {\n" 5088 " result = vec4(1, 0, 0, 1);\n" 5089 " }\n" 5090 "\n" 5091 " gs_fs_result = result;\n" 5092 " gl_Position = vec4(-1, -1, 0, 1);\n" 5093 " EmitVertex();\n" 5094 " gs_fs_result = result;\n" 5095 " gl_Position = vec4(-1, 1, 0, 1);\n" 5096 " EmitVertex();\n" 5097 " gs_fs_result = result;\n" 5098 " gl_Position = vec4(1, -1, 0, 1);\n" 5099 " EmitVertex();\n" 5100 " gs_fs_result = result;\n" 5101 " gl_Position = vec4(1, 1, 0, 1);\n" 5102 " EmitVertex();\n" 5103 "}\n" 5104 "\n"; 5105 5106 static const GLchar* tess_ctrl_shader_template = 5107 "VERSION\n" 5108 "\n" 5109 "layout(vertices = 1) out;\n" 5110 "\n" 5111 "in vec4 vs_tcs_result[];\n" 5112 "out vec4 tcs_tes_result[];\n" 5113 "uniform float uni_scalar;\n" 5114 "uniform vec4 uni_vector;\n" 5115 "uniform mat2 uni_matrix;\n" 5116 "\n" 5117 "STRUCTURE_DEFINITION" 5118 "\n" 5119 "void main()\n" 5120 "{\n" 5121 " vec4 result = vec4(0, 1, 0, 1);\n" 5122 "\n" 5123 "VERIFICATION" 5124 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 5125 " {\n" 5126 " result = vec4(1, 0, 0, 1);\n" 5127 " }\n" 5128 "\n" 5129 " tcs_tes_result[gl_InvocationID] = result;\n" 5130 "\n" 5131 " gl_TessLevelOuter[0] = 1.0;\n" 5132 " gl_TessLevelOuter[1] = 1.0;\n" 5133 " gl_TessLevelOuter[2] = 1.0;\n" 5134 " gl_TessLevelOuter[3] = 1.0;\n" 5135 " gl_TessLevelInner[0] = 1.0;\n" 5136 " gl_TessLevelInner[1] = 1.0;\n" 5137 "}\n" 5138 "\n"; 5139 5140 static const GLchar* tess_eval_shader_template = "VERSION\n" 5141 "\n" 5142 "layout(isolines, point_mode) in;\n" 5143 "\n" 5144 "in vec4 tcs_tes_result[];\n" 5145 "out vec4 tes_gs_result;\n" 5146 "uniform float uni_scalar;\n" 5147 "uniform vec4 uni_vector;\n" 5148 "uniform mat2 uni_matrix;\n" 5149 "\n" 5150 "STRUCTURE_DEFINITION" 5151 "\n" 5152 "void main()\n" 5153 "{\n" 5154 " vec4 result = vec4(0, 1, 0, 1);\n" 5155 "\n" 5156 "VERIFICATION" 5157 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 5158 " {\n" 5159 " result = vec4(1, 0, 0, 1);\n" 5160 " }\n" 5161 "\n" 5162 " tes_gs_result = result;\n" 5163 "}\n" 5164 "\n"; 5165 5166 static const GLchar* vertex_shader_template = "VERSION\n" 5167 "\n" 5168 "out vec4 vs_tcs_result;\n" 5169 "uniform float uni_scalar;\n" 5170 "uniform vec4 uni_vector;\n" 5171 "uniform mat2 uni_matrix;\n" 5172 "\n" 5173 "STRUCTURE_DEFINITION" 5174 "\n" 5175 "void main()\n" 5176 "{\n" 5177 " vec4 result = vec4(0, 1, 0, 1);\n" 5178 "\n" 5179 "VERIFICATION" 5180 "\n" 5181 " vs_tcs_result = result;\n" 5182 "}\n" 5183 "\n"; 5184 5185 static const GLchar* scalar = "0.5"; 5186 static const GLchar* vector = "vec4(0.5, 0.125, 0.375, 0)"; 5187 static const GLchar* matrix = "mat2(0.5, 0.125, 0.375, 0)"; 5188 5189 const GLchar* shader_template = 0; 5190 5191 switch (in_stage) 5192 { 5193 case Utils::COMPUTE_SHADER: 5194 shader_template = compute_shader_template; 5195 break; 5196 case Utils::FRAGMENT_SHADER: 5197 shader_template = fragment_shader_template; 5198 break; 5199 case Utils::GEOMETRY_SHADER: 5200 shader_template = geometry_shader_template; 5201 break; 5202 case Utils::TESS_CTRL_SHADER: 5203 shader_template = tess_ctrl_shader_template; 5204 break; 5205 case Utils::TESS_EVAL_SHADER: 5206 shader_template = tess_eval_shader_template; 5207 break; 5208 case Utils::VERTEX_SHADER: 5209 shader_template = vertex_shader_template; 5210 break; 5211 default: 5212 TCU_FAIL("Invalid enum"); 5213 break; 5214 } 5215 5216 out_source.m_parts[0].m_code = shader_template; 5217 5218 size_t position = 0; 5219 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 5220 out_source.m_parts[0].m_code); 5221 5222 Utils::replaceToken("STRUCTURE_DEFINITION", position, struct_definition, out_source.m_parts[0].m_code); 5223 5224 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 5225 5226 Utils::replaceAllTokens("SCALAR", scalar, out_source.m_parts[0].m_code); 5227 5228 Utils::replaceAllTokens("VECTOR", vector, out_source.m_parts[0].m_code); 5229 5230 Utils::replaceAllTokens("MATRIX", matrix, out_source.m_parts[0].m_code); 5231 } 5232 5233 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 5234 * 5235 * @param program Current program 5236 **/ 5237 void ConstDynamicValueTest::prepareUniforms(Utils::program& program) 5238 { 5239 static const GLfloat float_data[4] = { 0.5f, 0.125f, 0.375f, 0.0f }; 5240 static const GLfloat scalar = 0.5f; 5241 5242 program.uniform("uni_scalar", Utils::FLOAT, 1, 1, &scalar); 5243 program.uniform("uni_vector", Utils::FLOAT, 1, 4, float_data); 5244 program.uniform("uni_matrix", Utils::FLOAT, 2, 2, float_data); 5245 } 5246 5247 /** Constructor 5248 * 5249 * @param context Test context 5250 **/ 5251 ConstAssignmentTest::ConstAssignmentTest(deqp::Context& context) 5252 : NegativeTestBase(context, "const_assignment", "Verifies that constants cannot be overwritten") 5253 { 5254 /* Nothing to be done here */ 5255 } 5256 5257 /** Set up next test case 5258 * 5259 * @param test_case_index Index of next test case 5260 * 5261 * @return false if there is no more test cases, true otherwise 5262 **/ 5263 bool ConstAssignmentTest::prepareNextTestCase(glw::GLuint test_case_index) 5264 { 5265 m_current_test_case_index = test_case_index; 5266 5267 if ((glw::GLuint)-1 == test_case_index) 5268 { 5269 return true; 5270 } 5271 else if (2 <= test_case_index) 5272 { 5273 return false; 5274 } 5275 5276 return true; 5277 } 5278 5279 /** Prepare source for given shader stage 5280 * 5281 * @param in_stage Shader stage, compute shader will use 430 5282 * @param in_use_version_400 Select if 400 or 420 should be used 5283 * @param out_source Prepared shader source instance 5284 **/ 5285 void ConstAssignmentTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 5286 Utils::shaderSource& out_source) 5287 { 5288 static const GLchar* verification_snippet = " const float c1 = INIT;\n" 5289 "\n" 5290 " float temp = c1;\n" 5291 "\n" 5292 " for (uint i = 0; i < 4; ++i)" 5293 " {\n" 5294 " temp += c1 + uni_value;\n" 5295 " c1 -= 0.125;\n" 5296 " }\n" 5297 "\n" 5298 " if (0.0 == temp)\n" 5299 " {\n" 5300 " result = vec4(1, 0, 0, 1);\n" 5301 " }\n"; 5302 5303 static const GLchar* compute_shader_template = 5304 "VERSION\n" 5305 "\n" 5306 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 5307 "\n" 5308 "writeonly uniform image2D uni_image;\n" 5309 " uniform float uni_value;\n" 5310 "\n" 5311 "void main()\n" 5312 "{\n" 5313 " vec4 result = vec4(0, 1, 0, 1);\n" 5314 "\n" 5315 "VERIFICATION" 5316 "\n" 5317 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 5318 "}\n" 5319 "\n"; 5320 5321 static const GLchar* fragment_shader_template = "VERSION\n" 5322 "\n" 5323 "in vec4 gs_fs_result;\n" 5324 "out vec4 fs_out_result;\n" 5325 "uniform float uni_value;\n" 5326 "\n" 5327 "void main()\n" 5328 "{\n" 5329 " vec4 result = vec4(0, 1, 0, 1);\n" 5330 "\n" 5331 "VERIFICATION" 5332 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 5333 " {\n" 5334 " result = vec4(1, 0, 0, 1);\n" 5335 " }\n" 5336 "\n" 5337 " fs_out_result = result;\n" 5338 "}\n" 5339 "\n"; 5340 5341 static const GLchar* geometry_shader_template = "VERSION\n" 5342 "\n" 5343 "layout(points) in;\n" 5344 "layout(triangle_strip, max_vertices = 4) out;\n" 5345 "\n" 5346 "in vec4 tes_gs_result[];\n" 5347 "out vec4 gs_fs_result;\n" 5348 "uniform float uni_value;\n" 5349 "\n" 5350 "void main()\n" 5351 "{\n" 5352 " vec4 result = vec4(0, 1, 0, 1);\n" 5353 "\n" 5354 "VERIFICATION" 5355 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 5356 " {\n" 5357 " result = vec4(1, 0, 0, 1);\n" 5358 " }\n" 5359 "\n" 5360 " gs_fs_result = result;\n" 5361 " gl_Position = vec4(-1, -1, 0, 1);\n" 5362 " EmitVertex();\n" 5363 " gs_fs_result = result;\n" 5364 " gl_Position = vec4(-1, 1, 0, 1);\n" 5365 " EmitVertex();\n" 5366 " gs_fs_result = result;\n" 5367 " gl_Position = vec4(1, -1, 0, 1);\n" 5368 " EmitVertex();\n" 5369 " gs_fs_result = result;\n" 5370 " gl_Position = vec4(1, 1, 0, 1);\n" 5371 " EmitVertex();\n" 5372 "}\n" 5373 "\n"; 5374 5375 static const GLchar* tess_ctrl_shader_template = 5376 "VERSION\n" 5377 "\n" 5378 "layout(vertices = 1) out;\n" 5379 "\n" 5380 "in vec4 vs_tcs_result[];\n" 5381 "out vec4 tcs_tes_result[];\n" 5382 "uniform float uni_value;\n" 5383 "\n" 5384 "void main()\n" 5385 "{\n" 5386 " vec4 result = vec4(0, 1, 0, 1);\n" 5387 "\n" 5388 "VERIFICATION" 5389 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 5390 " {\n" 5391 " result = vec4(1, 0, 0, 1);\n" 5392 " }\n" 5393 "\n" 5394 " tcs_tes_result[gl_InvocationID] = result;\n" 5395 "\n" 5396 " gl_TessLevelOuter[0] = 1.0;\n" 5397 " gl_TessLevelOuter[1] = 1.0;\n" 5398 " gl_TessLevelOuter[2] = 1.0;\n" 5399 " gl_TessLevelOuter[3] = 1.0;\n" 5400 " gl_TessLevelInner[0] = 1.0;\n" 5401 " gl_TessLevelInner[1] = 1.0;\n" 5402 "}\n" 5403 "\n"; 5404 5405 static const GLchar* tess_eval_shader_template = "VERSION\n" 5406 "\n" 5407 "layout(isolines, point_mode) in;\n" 5408 "\n" 5409 "in vec4 tcs_tes_result[];\n" 5410 "out vec4 tes_gs_result;\n" 5411 "uniform float uni_value;\n" 5412 "\n" 5413 "void main()\n" 5414 "{\n" 5415 " vec4 result = vec4(0, 1, 0, 1);\n" 5416 "\n" 5417 "VERIFICATION" 5418 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 5419 " {\n" 5420 " result = vec4(1, 0, 0, 1);\n" 5421 " }\n" 5422 "\n" 5423 " tes_gs_result = result;\n" 5424 "}\n" 5425 "\n"; 5426 5427 static const GLchar* vertex_shader_template = "VERSION\n" 5428 "\n" 5429 "out vec4 vs_tcs_result;\n" 5430 "uniform float uni_value;\n" 5431 "\n" 5432 "void main()\n" 5433 "{\n" 5434 " vec4 result = vec4(0, 1, 0, 1);\n" 5435 "\n" 5436 "VERIFICATION" 5437 "\n" 5438 " vs_tcs_result = result;\n" 5439 "}\n" 5440 "\n"; 5441 5442 static const GLchar* dynamic_init = "uni_value"; 5443 static const GLchar* const_init = "0.75"; 5444 5445 const GLchar* shader_template = 0; 5446 const GLchar* l_init = 0; 5447 5448 switch (in_stage) 5449 { 5450 case Utils::COMPUTE_SHADER: 5451 shader_template = compute_shader_template; 5452 break; 5453 case Utils::FRAGMENT_SHADER: 5454 shader_template = fragment_shader_template; 5455 break; 5456 case Utils::GEOMETRY_SHADER: 5457 shader_template = geometry_shader_template; 5458 break; 5459 case Utils::TESS_CTRL_SHADER: 5460 shader_template = tess_ctrl_shader_template; 5461 break; 5462 case Utils::TESS_EVAL_SHADER: 5463 shader_template = tess_eval_shader_template; 5464 break; 5465 case Utils::VERTEX_SHADER: 5466 shader_template = vertex_shader_template; 5467 break; 5468 default: 5469 TCU_FAIL("Invalid enum"); 5470 break; 5471 } 5472 5473 if (0 == m_current_test_case_index) 5474 { 5475 l_init = dynamic_init; 5476 } 5477 else 5478 { 5479 l_init = const_init; 5480 } 5481 5482 out_source.m_parts[0].m_code = shader_template; 5483 5484 size_t position = 0; 5485 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 5486 out_source.m_parts[0].m_code); 5487 5488 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 5489 5490 Utils::replaceAllTokens("INIT", l_init, out_source.m_parts[0].m_code); 5491 } 5492 5493 /** Constructor 5494 * 5495 * @param context Test context 5496 **/ 5497 ConstDynamicValueAsConstExprTest::ConstDynamicValueAsConstExprTest(deqp::Context& context) 5498 : NegativeTestBase(context, "const_dynamic_value_as_const_expr", 5499 "Verifies that dynamic constants cannot be used as constant foldable expressions") 5500 { 5501 /* Nothing to be done here */ 5502 } 5503 5504 /** Prepare source for given shader stage 5505 * 5506 * @param in_stage Shader stage, compute shader will use 430 5507 * @param in_use_version_400 Select if 400 or 420 should be used 5508 * @param out_source Prepared shader source instance 5509 **/ 5510 void ConstDynamicValueAsConstExprTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 5511 Utils::shaderSource& out_source) 5512 { 5513 static const GLchar* verification_snippet = " const uint c1 = INIT;\n" 5514 "\n" 5515 " float temp[c1];\n" 5516 "\n" 5517 " for (uint i = 0; i < c1; ++i)" 5518 " {\n" 5519 " temp[i] += uni_value;\n" 5520 " }\n" 5521 "\n" 5522 " if (0.0 == temp[c1 - 1])\n" 5523 " {\n" 5524 " result = vec4(1, 0, 0, 1);\n" 5525 " }\n"; 5526 5527 static const GLchar* compute_shader_template = 5528 "VERSION\n" 5529 "\n" 5530 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 5531 "\n" 5532 "writeonly uniform image2D uni_image;\n" 5533 " uniform uint uni_value;\n" 5534 "\n" 5535 "void main()\n" 5536 "{\n" 5537 " vec4 result = vec4(0, 1, 0, 1);\n" 5538 "\n" 5539 "VERIFICATION" 5540 "\n" 5541 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 5542 "}\n" 5543 "\n"; 5544 5545 static const GLchar* fragment_shader_template = "VERSION\n" 5546 "\n" 5547 "in vec4 gs_fs_result;\n" 5548 "out vec4 fs_out_result;\n" 5549 "uniform uint uni_value;\n" 5550 "\n" 5551 "void main()\n" 5552 "{\n" 5553 " vec4 result = vec4(0, 1, 0, 1);\n" 5554 "\n" 5555 "VERIFICATION" 5556 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 5557 " {\n" 5558 " result = vec4(1, 0, 0, 1);\n" 5559 " }\n" 5560 "\n" 5561 " fs_out_result = result;\n" 5562 "}\n" 5563 "\n"; 5564 5565 static const GLchar* geometry_shader_template = "VERSION\n" 5566 "\n" 5567 "layout(points) in;\n" 5568 "layout(triangle_strip, max_vertices = 4) out;\n" 5569 "\n" 5570 "in vec4 tes_gs_result[];\n" 5571 "out vec4 gs_fs_result;\n" 5572 "uniform uint uni_value;\n" 5573 "\n" 5574 "void main()\n" 5575 "{\n" 5576 " vec4 result = vec4(0, 1, 0, 1);\n" 5577 "\n" 5578 "VERIFICATION" 5579 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 5580 " {\n" 5581 " result = vec4(1, 0, 0, 1);\n" 5582 " }\n" 5583 "\n" 5584 " gs_fs_result = result;\n" 5585 " gl_Position = vec4(-1, -1, 0, 1);\n" 5586 " EmitVertex();\n" 5587 " gs_fs_result = result;\n" 5588 " gl_Position = vec4(-1, 1, 0, 1);\n" 5589 " EmitVertex();\n" 5590 " gs_fs_result = result;\n" 5591 " gl_Position = vec4(1, -1, 0, 1);\n" 5592 " EmitVertex();\n" 5593 " gs_fs_result = result;\n" 5594 " gl_Position = vec4(1, 1, 0, 1);\n" 5595 " EmitVertex();\n" 5596 "}\n" 5597 "\n"; 5598 5599 static const GLchar* tess_ctrl_shader_template = 5600 "VERSION\n" 5601 "\n" 5602 "layout(vertices = 1) out;\n" 5603 "\n" 5604 "in vec4 vs_tcs_result[];\n" 5605 "out vec4 tcs_tes_result[];\n" 5606 "uniform uint uni_value;\n" 5607 "\n" 5608 "void main()\n" 5609 "{\n" 5610 " vec4 result = vec4(0, 1, 0, 1);\n" 5611 "\n" 5612 "VERIFICATION" 5613 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 5614 " {\n" 5615 " result = vec4(1, 0, 0, 1);\n" 5616 " }\n" 5617 "\n" 5618 " tcs_tes_result[gl_InvocationID] = result;\n" 5619 "\n" 5620 " gl_TessLevelOuter[0] = 1.0;\n" 5621 " gl_TessLevelOuter[1] = 1.0;\n" 5622 " gl_TessLevelOuter[2] = 1.0;\n" 5623 " gl_TessLevelOuter[3] = 1.0;\n" 5624 " gl_TessLevelInner[0] = 1.0;\n" 5625 " gl_TessLevelInner[1] = 1.0;\n" 5626 "}\n" 5627 "\n"; 5628 5629 static const GLchar* tess_eval_shader_template = "VERSION\n" 5630 "\n" 5631 "layout(isolines, point_mode) in;\n" 5632 "\n" 5633 "in vec4 tcs_tes_result[];\n" 5634 "out vec4 tes_gs_result;\n" 5635 "uniform uint uni_value;\n" 5636 "\n" 5637 "void main()\n" 5638 "{\n" 5639 " vec4 result = vec4(0, 1, 0, 1);\n" 5640 "\n" 5641 "VERIFICATION" 5642 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 5643 " {\n" 5644 " result = vec4(1, 0, 0, 1);\n" 5645 " }\n" 5646 "\n" 5647 " tes_gs_result = result;\n" 5648 "}\n" 5649 "\n"; 5650 5651 static const GLchar* vertex_shader_template = "VERSION\n" 5652 "\n" 5653 "out vec4 vs_tcs_result;\n" 5654 "uniform uint uni_value;\n" 5655 "\n" 5656 "void main()\n" 5657 "{\n" 5658 " vec4 result = vec4(0, 1, 0, 1);\n" 5659 "\n" 5660 "VERIFICATION" 5661 "\n" 5662 " vs_tcs_result = result;\n" 5663 "}\n" 5664 "\n"; 5665 5666 static const GLchar* l_init = "uni_value"; 5667 5668 const GLchar* shader_template = 0; 5669 5670 switch (in_stage) 5671 { 5672 case Utils::COMPUTE_SHADER: 5673 shader_template = compute_shader_template; 5674 break; 5675 case Utils::FRAGMENT_SHADER: 5676 shader_template = fragment_shader_template; 5677 break; 5678 case Utils::GEOMETRY_SHADER: 5679 shader_template = geometry_shader_template; 5680 break; 5681 case Utils::TESS_CTRL_SHADER: 5682 shader_template = tess_ctrl_shader_template; 5683 break; 5684 case Utils::TESS_EVAL_SHADER: 5685 shader_template = tess_eval_shader_template; 5686 break; 5687 case Utils::VERTEX_SHADER: 5688 shader_template = vertex_shader_template; 5689 break; 5690 default: 5691 TCU_FAIL("Invalid enum"); 5692 break; 5693 } 5694 5695 out_source.m_parts[0].m_code = shader_template; 5696 5697 size_t position = 0; 5698 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 5699 out_source.m_parts[0].m_code); 5700 5701 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 5702 5703 Utils::replaceAllTokens("INIT", l_init, out_source.m_parts[0].m_code); 5704 } 5705 5706 /** Constructor 5707 * 5708 * @param context Test context 5709 **/ 5710 QualifierOrderTest::QualifierOrderTest(deqp::Context& context) 5711 : GLSLTestBase(context, "qualifier_order", 5712 "Test verifies that valid permutation of input and output qalifiers are accepted") 5713 { 5714 /* Nothing to be done */ 5715 } 5716 5717 /** Set up next test case 5718 * 5719 * @param test_case_index Index of next test case 5720 * 5721 * @return false if there is no more test cases, true otherwise 5722 **/ 5723 bool QualifierOrderTest::prepareNextTestCase(glw::GLuint test_case_index) 5724 { 5725 m_current_test_case_index = test_case_index; 5726 5727 if ((glw::GLuint)-1 == test_case_index) 5728 { 5729 /* Nothing to be done here */; 5730 } 5731 else if (m_test_cases.size() <= test_case_index) 5732 { 5733 return false; 5734 } 5735 5736 const Utils::qualifierSet& set = getCurrentTestCase(); 5737 5738 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 5739 5740 for (GLuint i = 0; i < set.size(); ++i) 5741 { 5742 message << Utils::getQualifierString(set[i]) << " "; 5743 } 5744 5745 message << tcu::TestLog::EndMessage; 5746 5747 return true; 5748 } 5749 5750 /** Prepare source for given shader stage 5751 * 5752 * @param in_stage Shader stage, compute shader will use 430 5753 * @param in_use_version_400 Select if 400 or 420 should be used 5754 * @param out_source Prepared shader source instance 5755 **/ 5756 void QualifierOrderTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 5757 Utils::shaderSource& out_source) 5758 { 5759 static const GLchar* verification_snippet = 5760 " vec4 diff = INPUT_VARIABLE_NAME - vec4(0, 0, 1, 1);\n" 5761 " if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n" 5762 " {\n" 5763 " result = INPUT_VARIABLE_NAME;\n" 5764 " }\n"; 5765 5766 static const GLchar* fragment_shader_template = "VERSION\n" 5767 "\n" 5768 "in vec4 gs_fs_result;\n" 5769 "layout (location = 0) out vec4 fs_out_result;\n" 5770 "\n" 5771 "VARIABLE_DECLARATION;\n" 5772 "VARIABLE_DECLARATION;\n" 5773 "\n" 5774 "void main()\n" 5775 "{\n" 5776 " vec4 result = vec4(0, 1, 0, 1);\n" 5777 "\n" 5778 "VERIFICATION" 5779 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 5780 " {\n" 5781 " result = vec4(1, 0, 0, 1);\n" 5782 " }\n" 5783 "\n" 5784 " fs_out_result = result;\n" 5785 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 5786 "}\n" 5787 "\n"; 5788 5789 static const GLchar* geometry_shader_template = "VERSION\n" 5790 "\n" 5791 "layout(points) in;\n" 5792 "layout(triangle_strip, max_vertices = 4) out;\n" 5793 "\n" 5794 "in vec4 tes_gs_result[];\n" 5795 "out vec4 gs_fs_result;\n" 5796 "\n" 5797 "VARIABLE_DECLARATION;\n" 5798 "VARIABLE_DECLARATION;\n" 5799 "\n" 5800 "void main()\n" 5801 "{\n" 5802 " vec4 result = vec4(0, 1, 0, 1);\n" 5803 "\n" 5804 "VERIFICATION" 5805 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 5806 " {\n" 5807 " result = vec4(1, 0, 0, 1);\n" 5808 " }\n" 5809 "\n" 5810 " gs_fs_result = result;\n" 5811 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 5812 " gl_Position = vec4(-1, -1, 0, 1);\n" 5813 " EmitVertex();\n" 5814 " gs_fs_result = result;\n" 5815 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 5816 " gl_Position = vec4(-1, 1, 0, 1);\n" 5817 " EmitVertex();\n" 5818 " gs_fs_result = result;\n" 5819 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 5820 " gl_Position = vec4(1, -1, 0, 1);\n" 5821 " EmitVertex();\n" 5822 " gs_fs_result = result;\n" 5823 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 5824 " gl_Position = vec4(1, 1, 0, 1);\n" 5825 " EmitVertex();\n" 5826 "}\n" 5827 "\n"; 5828 5829 static const GLchar* tess_ctrl_shader_template = 5830 "VERSION\n" 5831 "\n" 5832 "layout(vertices = 1) out;\n" 5833 "\n" 5834 "in vec4 vs_tcs_result[];\n" 5835 "out vec4 tcs_tes_result[];\n" 5836 "\n" 5837 "VARIABLE_DECLARATION;\n" 5838 "VARIABLE_DECLARATION;\n" 5839 "\n" 5840 "void main()\n" 5841 "{\n" 5842 " vec4 result = vec4(0, 1, 0, 1);\n" 5843 "\n" 5844 "VERIFICATION" 5845 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 5846 " {\n" 5847 " result = vec4(1, 0, 0, 1);\n" 5848 " }\n" 5849 "\n" 5850 " tcs_tes_result[gl_InvocationID] = result;\n" 5851 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 5852 "\n" 5853 " gl_TessLevelOuter[0] = 1.0;\n" 5854 " gl_TessLevelOuter[1] = 1.0;\n" 5855 " gl_TessLevelOuter[2] = 1.0;\n" 5856 " gl_TessLevelOuter[3] = 1.0;\n" 5857 " gl_TessLevelInner[0] = 1.0;\n" 5858 " gl_TessLevelInner[1] = 1.0;\n" 5859 "}\n" 5860 "\n"; 5861 5862 static const GLchar* tess_eval_shader_template = "VERSION\n" 5863 "\n" 5864 "layout(isolines, point_mode) in;\n" 5865 "\n" 5866 "in vec4 tcs_tes_result[];\n" 5867 "out vec4 tes_gs_result;\n" 5868 "\n" 5869 "VARIABLE_DECLARATION;\n" 5870 "VARIABLE_DECLARATION;\n" 5871 "\n" 5872 "void main()\n" 5873 "{\n" 5874 " vec4 result = vec4(0, 1, 0, 1);\n" 5875 "\n" 5876 "VERIFICATION" 5877 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 5878 " {\n" 5879 " result = vec4(1, 0, 0, 1);\n" 5880 " }\n" 5881 "\n" 5882 " tes_gs_result = result;\n" 5883 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 5884 "}\n" 5885 "\n"; 5886 5887 static const GLchar* vertex_shader_template = "VERSION\n" 5888 "\n" 5889 "out vec4 vs_tcs_result;\n" 5890 "\n" 5891 "VARIABLE_DECLARATION;\n" 5892 "VARIABLE_DECLARATION;\n" 5893 "\n" 5894 "void main()\n" 5895 "{\n" 5896 " vec4 result = vec4(0, 1, 0, 1);\n" 5897 "\n" 5898 "VERIFICATION" 5899 "\n" 5900 " vs_tcs_result = result;\n" 5901 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 5902 "}\n" 5903 "\n"; 5904 5905 const GLchar* shader_template = 0; 5906 5907 switch (in_stage) 5908 { 5909 case Utils::COMPUTE_SHADER: 5910 return; 5911 break; 5912 case Utils::FRAGMENT_SHADER: 5913 shader_template = fragment_shader_template; 5914 break; 5915 case Utils::GEOMETRY_SHADER: 5916 shader_template = geometry_shader_template; 5917 break; 5918 case Utils::TESS_CTRL_SHADER: 5919 shader_template = tess_ctrl_shader_template; 5920 break; 5921 case Utils::TESS_EVAL_SHADER: 5922 shader_template = tess_eval_shader_template; 5923 break; 5924 case Utils::VERTEX_SHADER: 5925 shader_template = vertex_shader_template; 5926 break; 5927 default: 5928 TCU_FAIL("Invalid enum"); 5929 break; 5930 } 5931 5932 const Utils::qualifierSet& test_case = getCurrentTestCase(); 5933 5934 std::string in_test_decl; 5935 std::string in_test_ref; 5936 std::string out_test_decl; 5937 std::string out_test_ref; 5938 5939 Utils::prepareVariableStrings(in_stage, Utils::INPUT, test_case, "vec4", "test", in_test_decl, in_test_ref); 5940 Utils::prepareVariableStrings(in_stage, Utils::OUTPUT, test_case, "vec4", "test", out_test_decl, out_test_ref); 5941 5942 // sample storage qualifier is not a valid qualifier for fragment output 5943 if (in_stage == Utils::FRAGMENT_SHADER) 5944 { 5945 if (out_test_decl.find("sample") != std::string::npos) 5946 out_test_decl.erase(out_test_decl.find("sample"), 7); 5947 } 5948 5949 out_source.m_parts[0].m_code = shader_template; 5950 5951 size_t position = 0; 5952 5953 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 5954 out_source.m_parts[0].m_code); 5955 5956 Utils::replaceToken("VARIABLE_DECLARATION", position, in_test_decl.c_str(), out_source.m_parts[0].m_code); 5957 5958 Utils::replaceToken("VARIABLE_DECLARATION", position, out_test_decl.c_str(), out_source.m_parts[0].m_code); 5959 5960 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 5961 5962 position -= strlen(verification_snippet); 5963 5964 Utils::replaceAllTokens("OUTPUT_VARIABLE_NAME", out_test_ref.c_str(), out_source.m_parts[0].m_code); 5965 5966 Utils::replaceAllTokens("INPUT_VARIABLE_NAME", in_test_ref.c_str(), out_source.m_parts[0].m_code); 5967 5968 Utils::replaceAllTokens("LOC_VALUE", "1", out_source.m_parts[0].m_code); 5969 } 5970 5971 /**Prepare vertex buffer and vertex array object. 5972 * 5973 * @param program Program instance 5974 * @param buffer Buffer instance 5975 * @param vao VertexArray instance 5976 * 5977 * @return 0 5978 **/ 5979 void QualifierOrderTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, 5980 Utils::vertexArray& vao) 5981 { 5982 std::string test_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, "test"); 5983 GLint test_loc = program.getAttribLocation(test_name.c_str()); 5984 5985 if (-1 == test_loc) 5986 { 5987 TCU_FAIL("Vertex attribute location is invalid"); 5988 } 5989 5990 vao.generate(); 5991 vao.bind(); 5992 5993 buffer.generate(GL_ARRAY_BUFFER); 5994 5995 GLfloat data[] = { 0.0f, 0.0f, 1.0f, 1.0f }; 5996 GLsizeiptr data_size = sizeof(data); 5997 5998 buffer.update(data_size, data, GL_STATIC_DRAW); 5999 6000 /* GL entry points */ 6001 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 6002 6003 /* Set up vao */ 6004 gl.vertexAttribPointer(test_loc, 4 /* size */, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0 /* stride */, 6005 0 /* offset */); 6006 GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer"); 6007 6008 /* Enable attribute */ 6009 gl.enableVertexAttribArray(test_loc); 6010 GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray"); 6011 } 6012 6013 /** Prepare test cases 6014 * 6015 * @return true 6016 **/ 6017 bool QualifierOrderTest::testInit() 6018 { 6019 m_test_cases.resize(5); 6020 6021 m_test_cases[0].push_back(Utils::QUAL_HIGHP); 6022 m_test_cases[0].push_back(Utils::QUAL_IN); 6023 m_test_cases[0].push_back(Utils::QUAL_LOCATION); 6024 m_test_cases[0].push_back(Utils::QUAL_SMOOTH); 6025 m_test_cases[0].push_back(Utils::QUAL_INVARIANT); 6026 6027 m_test_cases[1].push_back(Utils::QUAL_LOWP); 6028 m_test_cases[1].push_back(Utils::QUAL_IN); 6029 m_test_cases[1].push_back(Utils::QUAL_SAMPLE); 6030 m_test_cases[1].push_back(Utils::QUAL_LOCATION); 6031 m_test_cases[1].push_back(Utils::QUAL_NOPERSPECTIVE); 6032 m_test_cases[1].push_back(Utils::QUAL_INVARIANT); 6033 6034 m_test_cases[2].push_back(Utils::QUAL_HIGHP); 6035 m_test_cases[2].push_back(Utils::QUAL_IN); 6036 m_test_cases[2].push_back(Utils::QUAL_LOCATION); 6037 m_test_cases[2].push_back(Utils::QUAL_SMOOTH); 6038 m_test_cases[2].push_back(Utils::QUAL_INVARIANT); 6039 m_test_cases[2].push_back(Utils::QUAL_LOCATION); 6040 6041 m_test_cases[3].push_back(Utils::QUAL_LOWP); 6042 m_test_cases[3].push_back(Utils::QUAL_IN); 6043 m_test_cases[3].push_back(Utils::QUAL_LOCATION); 6044 m_test_cases[3].push_back(Utils::QUAL_SAMPLE); 6045 m_test_cases[3].push_back(Utils::QUAL_LOCATION); 6046 m_test_cases[3].push_back(Utils::QUAL_NOPERSPECTIVE); 6047 m_test_cases[3].push_back(Utils::QUAL_INVARIANT); 6048 6049 m_test_cases[4].push_back(Utils::QUAL_HIGHP); 6050 m_test_cases[4].push_back(Utils::QUAL_IN); 6051 m_test_cases[4].push_back(Utils::QUAL_PATCH); 6052 m_test_cases[4].push_back(Utils::QUAL_LOCATION); 6053 m_test_cases[4].push_back(Utils::QUAL_INVARIANT); 6054 6055 return true; 6056 } 6057 6058 /** Returns reference to current test case 6059 * 6060 * @return Reference to testCase 6061 **/ 6062 const Utils::qualifierSet& QualifierOrderTest::getCurrentTestCase() 6063 { 6064 if ((glw::GLuint)-1 == m_current_test_case_index) 6065 { 6066 return m_test_cases[0]; 6067 } 6068 else 6069 { 6070 return m_test_cases[m_current_test_case_index]; 6071 } 6072 } 6073 6074 /** Constructor 6075 * 6076 * @param context Test context 6077 **/ 6078 QualifierOrderBlockTest::QualifierOrderBlockTest(deqp::Context& context) 6079 : GLSLTestBase(context, "qualifier_order_block", 6080 "Verifies that qualifiers of members of input block can be arranged in any order") 6081 { 6082 /* Nothing to be done here */ 6083 } 6084 6085 /** Set up next test case 6086 * 6087 * @param test_case_index Index of next test case 6088 * 6089 * @return false if there is no more test cases, true otherwise 6090 **/ 6091 bool QualifierOrderBlockTest::prepareNextTestCase(glw::GLuint test_case_index) 6092 { 6093 m_current_test_case_index = test_case_index; 6094 6095 if ((glw::GLuint)-1 == test_case_index) 6096 { 6097 /* Nothing to be done here */; 6098 } 6099 else if (m_test_cases.size() <= test_case_index) 6100 { 6101 return false; 6102 } 6103 6104 const Utils::qualifierSet& set = getCurrentTestCase(); 6105 6106 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 6107 6108 for (GLuint i = 0; i < set.size(); ++i) 6109 { 6110 message << Utils::getQualifierString(set[i]) << " "; 6111 } 6112 6113 message << tcu::TestLog::EndMessage; 6114 6115 return true; 6116 } 6117 6118 /** Prepare source for given shader stage 6119 * 6120 * @param in_stage Shader stage, compute shader will use 430 6121 * @param in_use_version_400 Select if 400 or 420 should be used 6122 * @param out_source Prepared shader source instance 6123 **/ 6124 void QualifierOrderBlockTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 6125 Utils::shaderSource& out_source) 6126 { 6127 static const GLchar* verification_snippet = 6128 " vec4 diff = INPUT_VARIABLE_NAME - vec4(0, 0, 1, 1);\n" 6129 " if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n" 6130 " {\n" 6131 " result = INPUT_VARIABLE_NAME;\n" 6132 " }\n"; 6133 6134 static const GLchar* fragment_shader_template = "VERSION\n" 6135 "\n" 6136 "in vec4 gs_fs_result;\n" 6137 "layout (location = 0) out vec4 fs_out_result;\n" 6138 "\n" 6139 "in GSOutputBlock {\n" 6140 " VARIABLE_DECLARATION;\n" 6141 "} input_block;\n" 6142 "out VARIABLE_DECLARATION;\n" 6143 "\n" 6144 "void main()\n" 6145 "{\n" 6146 " vec4 result = vec4(0, 1, 0, 1);\n" 6147 "\n" 6148 "VERIFICATION" 6149 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 6150 " {\n" 6151 " result = vec4(1, 0, 0, 1);\n" 6152 " }\n" 6153 "\n" 6154 " fs_out_result = result;\n" 6155 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 6156 "}\n" 6157 "\n"; 6158 6159 static const GLchar* geometry_shader_template = "VERSION\n" 6160 "\n" 6161 "layout(points) in;\n" 6162 "layout(triangle_strip, max_vertices = 4) out;\n" 6163 "\n" 6164 "in vec4 tes_gs_result[];\n" 6165 "out vec4 gs_fs_result;\n" 6166 "\n" 6167 "in TCSOutputBlock {\n" 6168 " VARIABLE_DECLARATION;\n" 6169 "} input_block [];\n" 6170 "out GSOutputBlock {\n" 6171 " VARIABLE_DECLARATION;\n" 6172 "} output_block;\n" 6173 "\n" 6174 "void main()\n" 6175 "{\n" 6176 " vec4 result = vec4(0, 1, 0, 1);\n" 6177 "\n" 6178 "VERIFICATION" 6179 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 6180 " {\n" 6181 " result = vec4(1, 0, 0, 1);\n" 6182 " }\n" 6183 "\n" 6184 " gs_fs_result = result;\n" 6185 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 6186 " gl_Position = vec4(-1, -1, 0, 1);\n" 6187 " EmitVertex();\n" 6188 " gs_fs_result = result;\n" 6189 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 6190 " gl_Position = vec4(-1, 1, 0, 1);\n" 6191 " EmitVertex();\n" 6192 " gs_fs_result = result;\n" 6193 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 6194 " gl_Position = vec4(1, -1, 0, 1);\n" 6195 " EmitVertex();\n" 6196 " gs_fs_result = result;\n" 6197 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 6198 " gl_Position = vec4(1, 1, 0, 1);\n" 6199 " EmitVertex();\n" 6200 "}\n" 6201 "\n"; 6202 6203 static const GLchar* tess_ctrl_shader_template = 6204 "VERSION\n" 6205 "\n" 6206 "layout(vertices = 1) out;\n" 6207 "\n" 6208 "in vec4 vs_tcs_result[];\n" 6209 "out vec4 tcs_tes_result[];\n" 6210 "\n" 6211 "in VSOutputBlock {\n" 6212 " VARIABLE_DECLARATION;\n" 6213 "} input_block [];\n" 6214 "out TCSOutputBlock {\n" 6215 " VARIABLE_DECLARATION;\n" 6216 "} output_block [];\n" 6217 "\n" 6218 "void main()\n" 6219 "{\n" 6220 " vec4 result = vec4(0, 1, 0, 1);\n" 6221 "\n" 6222 "VERIFICATION" 6223 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 6224 " {\n" 6225 " result = vec4(1, 0, 0, 1);\n" 6226 " }\n" 6227 "\n" 6228 " tcs_tes_result[gl_InvocationID] = result;\n" 6229 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 6230 "\n" 6231 " gl_TessLevelOuter[0] = 1.0;\n" 6232 " gl_TessLevelOuter[1] = 1.0;\n" 6233 " gl_TessLevelOuter[2] = 1.0;\n" 6234 " gl_TessLevelOuter[3] = 1.0;\n" 6235 " gl_TessLevelInner[0] = 1.0;\n" 6236 " gl_TessLevelInner[1] = 1.0;\n" 6237 "}\n" 6238 "\n"; 6239 6240 static const GLchar* tess_eval_shader_template = "VERSION\n" 6241 "\n" 6242 "layout(isolines, point_mode) in;\n" 6243 "\n" 6244 "in vec4 tcs_tes_result[];\n" 6245 "out vec4 tes_gs_result;\n" 6246 "\n" 6247 "in TCSOutputBlock {\n" 6248 " VARIABLE_DECLARATION;\n" 6249 "} input_block [];\n" 6250 "out TCSOutputBlock {\n" 6251 " VARIABLE_DECLARATION;\n" 6252 "} output_block;\n" 6253 "\n" 6254 "void main()\n" 6255 "{\n" 6256 " vec4 result = vec4(0, 1, 0, 1);\n" 6257 "\n" 6258 "VERIFICATION" 6259 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 6260 " {\n" 6261 " result = vec4(1, 0, 0, 1);\n" 6262 " }\n" 6263 "\n" 6264 " tes_gs_result = result;\n" 6265 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 6266 "}\n" 6267 "\n"; 6268 6269 static const GLchar* vertex_shader_template = "VERSION\n" 6270 "\n" 6271 "out vec4 vs_tcs_result;\n" 6272 "\n" 6273 "in VARIABLE_DECLARATION;\n" 6274 "out VSOutputBlock {\n" 6275 " VARIABLE_DECLARATION;\n" 6276 "} output_block;\n" 6277 "\n" 6278 "void main()\n" 6279 "{\n" 6280 " vec4 result = vec4(0, 1, 0, 1);\n" 6281 "\n" 6282 "VERIFICATION" 6283 "\n" 6284 " vs_tcs_result = result;\n" 6285 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 6286 "}\n" 6287 "\n"; 6288 6289 const GLchar* shader_template = 0; 6290 6291 switch (in_stage) 6292 { 6293 case Utils::COMPUTE_SHADER: 6294 return; 6295 break; 6296 case Utils::FRAGMENT_SHADER: 6297 shader_template = fragment_shader_template; 6298 break; 6299 case Utils::GEOMETRY_SHADER: 6300 shader_template = geometry_shader_template; 6301 break; 6302 case Utils::TESS_CTRL_SHADER: 6303 shader_template = tess_ctrl_shader_template; 6304 break; 6305 case Utils::TESS_EVAL_SHADER: 6306 shader_template = tess_eval_shader_template; 6307 break; 6308 case Utils::VERTEX_SHADER: 6309 shader_template = vertex_shader_template; 6310 break; 6311 default: 6312 TCU_FAIL("Invalid enum"); 6313 break; 6314 } 6315 6316 const Utils::qualifierSet& test_case = getCurrentTestCase(); 6317 6318 std::string in_test_decl; 6319 std::string in_test_ref; 6320 std::string out_test_decl; 6321 std::string out_test_ref; 6322 6323 switch (in_stage) 6324 { 6325 case Utils::VERTEX_SHADER: 6326 Utils::prepareVariableStrings(in_stage, Utils::INPUT, test_case, "vec4", "test", in_test_decl, in_test_ref); 6327 break; 6328 default: 6329 Utils::prepareBlockVariableStrings(in_stage, Utils::INPUT, test_case, "vec4", "test", "input_block", 6330 in_test_decl, in_test_ref); 6331 break; 6332 } 6333 6334 switch (in_stage) 6335 { 6336 case Utils::FRAGMENT_SHADER: 6337 Utils::prepareVariableStrings(in_stage, Utils::OUTPUT, test_case, "vec4", "test", out_test_decl, out_test_ref); 6338 break; 6339 default: 6340 Utils::prepareBlockVariableStrings(in_stage, Utils::OUTPUT, test_case, "vec4", "test", "output_block", 6341 out_test_decl, out_test_ref); 6342 break; 6343 } 6344 6345 // sample storage qualifier is not a valid qualifier for fragment output 6346 if (in_stage == Utils::FRAGMENT_SHADER) 6347 { 6348 if (out_test_decl.find("sample") != std::string::npos) 6349 out_test_decl.erase(out_test_decl.find("sample"), 7); 6350 } 6351 out_source.m_parts[0].m_code = shader_template; 6352 6353 size_t position = 0; 6354 6355 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 6356 out_source.m_parts[0].m_code); 6357 6358 Utils::replaceToken("VARIABLE_DECLARATION", position, in_test_decl.c_str(), out_source.m_parts[0].m_code); 6359 6360 Utils::replaceToken("VARIABLE_DECLARATION", position, out_test_decl.c_str(), out_source.m_parts[0].m_code); 6361 6362 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 6363 6364 position -= strlen(verification_snippet); 6365 6366 Utils::replaceAllTokens("OUTPUT_VARIABLE_NAME", out_test_ref.c_str(), out_source.m_parts[0].m_code); 6367 6368 Utils::replaceAllTokens("INPUT_VARIABLE_NAME", in_test_ref.c_str(), out_source.m_parts[0].m_code); 6369 6370 Utils::replaceAllTokens("LOC_VALUE", "1", out_source.m_parts[0].m_code); 6371 } 6372 6373 /**Prepare vertex buffer and vertex array object. 6374 * 6375 * @param program Program instance 6376 * @param buffer Buffer instance 6377 * @param vao VertexArray instance 6378 * 6379 * @return 0 6380 **/ 6381 void QualifierOrderBlockTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, 6382 Utils::vertexArray& vao) 6383 { 6384 std::string test_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, "test"); 6385 GLint test_loc = program.getAttribLocation(test_name.c_str()); 6386 6387 if (-1 == test_loc) 6388 { 6389 TCU_FAIL("Vertex attribute location is invalid"); 6390 } 6391 6392 vao.generate(); 6393 vao.bind(); 6394 6395 buffer.generate(GL_ARRAY_BUFFER); 6396 6397 GLfloat data[] = { 0.0f, 0.0f, 1.0f, 1.0f }; 6398 GLsizeiptr data_size = sizeof(data); 6399 6400 buffer.update(data_size, data, GL_STATIC_DRAW); 6401 6402 /* GL entry points */ 6403 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 6404 6405 /* Set up vao */ 6406 gl.vertexAttribPointer(test_loc, 4 /* size */, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0 /* stride */, 6407 0 /* offset */); 6408 GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer"); 6409 6410 /* Enable attribute */ 6411 gl.enableVertexAttribArray(test_loc); 6412 GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray"); 6413 } 6414 6415 /** Prepare test cases 6416 * 6417 * @return true 6418 **/ 6419 bool QualifierOrderBlockTest::testInit() 6420 { 6421 m_test_cases.resize(4); 6422 6423 m_test_cases[0].push_back(Utils::QUAL_HIGHP); 6424 m_test_cases[0].push_back(Utils::QUAL_FLAT); 6425 m_test_cases[0].push_back(Utils::QUAL_INVARIANT); 6426 6427 m_test_cases[1].push_back(Utils::QUAL_LOWP); 6428 m_test_cases[1].push_back(Utils::QUAL_SAMPLE); 6429 m_test_cases[1].push_back(Utils::QUAL_NOPERSPECTIVE); 6430 m_test_cases[1].push_back(Utils::QUAL_INVARIANT); 6431 6432 m_test_cases[2].push_back(Utils::QUAL_HIGHP); 6433 m_test_cases[2].push_back(Utils::QUAL_SMOOTH); 6434 m_test_cases[2].push_back(Utils::QUAL_INVARIANT); 6435 6436 m_test_cases[3].push_back(Utils::QUAL_LOWP); 6437 m_test_cases[3].push_back(Utils::QUAL_SAMPLE); 6438 m_test_cases[3].push_back(Utils::QUAL_NOPERSPECTIVE); 6439 m_test_cases[3].push_back(Utils::QUAL_INVARIANT); 6440 6441 return true; 6442 } 6443 6444 /** Returns reference to current test case 6445 * 6446 * @return Reference to testCase 6447 **/ 6448 const Utils::qualifierSet& QualifierOrderBlockTest::getCurrentTestCase() 6449 { 6450 if ((glw::GLuint)-1 == m_current_test_case_index) 6451 { 6452 return m_test_cases[0]; 6453 } 6454 else 6455 { 6456 return m_test_cases[m_current_test_case_index]; 6457 } 6458 } 6459 6460 /** Constructor 6461 * 6462 * @param context Test context 6463 **/ 6464 QualifierOrderUniformTest::QualifierOrderUniformTest(deqp::Context& context) 6465 : GLSLTestBase(context, "qualifier_order_uniform", 6466 "Test verifies that all valid permutation of input qalifiers are accepted") 6467 { 6468 /* Nothing to be done here */ 6469 } 6470 6471 /** Set up next test case 6472 * 6473 * @param test_case_index Index of next test case 6474 * 6475 * @return false if there is no more test cases, true otherwise 6476 **/ 6477 bool QualifierOrderUniformTest::prepareNextTestCase(glw::GLuint test_case_index) 6478 { 6479 m_current_test_case_index = test_case_index; 6480 6481 if ((glw::GLuint)-1 == test_case_index) 6482 { 6483 /* Nothing to be done here */; 6484 } 6485 else if (m_test_cases.size() <= test_case_index) 6486 { 6487 return false; 6488 } 6489 6490 const Utils::qualifierSet& set = getCurrentTestCase(); 6491 6492 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 6493 6494 for (GLuint i = 0; i < set.size(); ++i) 6495 { 6496 message << Utils::getQualifierString(set[i]) << " "; 6497 } 6498 6499 message << tcu::TestLog::EndMessage; 6500 6501 return true; 6502 } 6503 6504 /** Prepare source for given shader stage 6505 * 6506 * @param in_stage Shader stage, compute shader will use 430 6507 * @param in_use_version_400 Select if 400 or 420 should be used 6508 * @param out_source Prepared shader source instance 6509 **/ 6510 void QualifierOrderUniformTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 6511 Utils::shaderSource& out_source) 6512 { 6513 static const GLchar* verification_snippet = 6514 " vec4 diff = VARIABLE_NAME - vec4(0, 0, 1, 1);\n" 6515 " if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n" 6516 " {\n" 6517 " result = VARIABLE_NAME;\n" 6518 " }\n"; 6519 6520 static const GLchar* variable_declaration = " QUALIFIERS VARIABLE_NAME"; 6521 6522 static const GLchar* fragment_shader_template = "VERSION\n" 6523 "#extension GL_ARB_explicit_uniform_location : enable\n" 6524 "\n" 6525 "in vec4 gs_fs_result;\n" 6526 "out vec4 fs_out_result;\n" 6527 "\n" 6528 "VARIABLE_DECLARATION;\n" 6529 "\n" 6530 "void main()\n" 6531 "{\n" 6532 " vec4 result = vec4(0, 1, 0, 1);\n" 6533 "\n" 6534 "VERIFICATION" 6535 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 6536 " {\n" 6537 " result = vec4(1, 0, 0, 1);\n" 6538 " }\n" 6539 "\n" 6540 " fs_out_result = result;\n" 6541 "}\n" 6542 "\n"; 6543 6544 static const GLchar* geometry_shader_template = "VERSION\n" 6545 "#extension GL_ARB_explicit_uniform_location : enable\n" 6546 "\n" 6547 "layout(points) in;\n" 6548 "layout(triangle_strip, max_vertices = 4) out;\n" 6549 "\n" 6550 "in vec4 tes_gs_result[];\n" 6551 "out vec4 gs_fs_result;\n" 6552 "\n" 6553 "VARIABLE_DECLARATION;\n" 6554 "\n" 6555 "void main()\n" 6556 "{\n" 6557 " vec4 result = vec4(0, 1, 0, 1);\n" 6558 "\n" 6559 "VERIFICATION" 6560 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 6561 " {\n" 6562 " result = vec4(1, 0, 0, 1);\n" 6563 " }\n" 6564 "\n" 6565 " gs_fs_result = result;\n" 6566 " gl_Position = vec4(-1, -1, 0, 1);\n" 6567 " EmitVertex();\n" 6568 " gs_fs_result = result;\n" 6569 " gl_Position = vec4(-1, 1, 0, 1);\n" 6570 " EmitVertex();\n" 6571 " gs_fs_result = result;\n" 6572 " gl_Position = vec4(1, -1, 0, 1);\n" 6573 " EmitVertex();\n" 6574 " gs_fs_result = result;\n" 6575 " gl_Position = vec4(1, 1, 0, 1);\n" 6576 " EmitVertex();\n" 6577 "}\n" 6578 "\n"; 6579 6580 static const GLchar* tess_ctrl_shader_template = 6581 "VERSION\n" 6582 "#extension GL_ARB_explicit_uniform_location : enable\n" 6583 "\n" 6584 "layout(vertices = 1) out;\n" 6585 "\n" 6586 "in vec4 vs_tcs_result[];\n" 6587 "out vec4 tcs_tes_result[];\n" 6588 "\n" 6589 "VARIABLE_DECLARATION;\n" 6590 "\n" 6591 "void main()\n" 6592 "{\n" 6593 " vec4 result = vec4(0, 1, 0, 1);\n" 6594 "\n" 6595 "VERIFICATION" 6596 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 6597 " {\n" 6598 " result = vec4(1, 0, 0, 1);\n" 6599 " }\n" 6600 "\n" 6601 " tcs_tes_result[gl_InvocationID] = result;\n" 6602 "\n" 6603 " gl_TessLevelOuter[0] = 1.0;\n" 6604 " gl_TessLevelOuter[1] = 1.0;\n" 6605 " gl_TessLevelOuter[2] = 1.0;\n" 6606 " gl_TessLevelOuter[3] = 1.0;\n" 6607 " gl_TessLevelInner[0] = 1.0;\n" 6608 " gl_TessLevelInner[1] = 1.0;\n" 6609 "}\n" 6610 "\n"; 6611 6612 static const GLchar* tess_eval_shader_template = "VERSION\n" 6613 "#extension GL_ARB_explicit_uniform_location : enable\n" 6614 "\n" 6615 "layout(isolines, point_mode) in;\n" 6616 "\n" 6617 "in vec4 tcs_tes_result[];\n" 6618 "out vec4 tes_gs_result;\n" 6619 "\n" 6620 "VARIABLE_DECLARATION;\n" 6621 "\n" 6622 "void main()\n" 6623 "{\n" 6624 " vec4 result = vec4(0, 1, 0, 1);\n" 6625 "\n" 6626 "VERIFICATION" 6627 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 6628 " {\n" 6629 " result = vec4(1, 0, 0, 1);\n" 6630 " }\n" 6631 "\n" 6632 " tes_gs_result = result;\n" 6633 "}\n" 6634 "\n"; 6635 6636 static const GLchar* vertex_shader_template = "VERSION\n" 6637 "#extension GL_ARB_explicit_uniform_location : enable\n" 6638 "\n" 6639 "out vec4 vs_tcs_result;\n" 6640 "\n" 6641 "VARIABLE_DECLARATION;\n" 6642 "\n" 6643 "void main()\n" 6644 "{\n" 6645 " vec4 result = vec4(0, 1, 0, 1);\n" 6646 "\n" 6647 "VERIFICATION" 6648 "\n" 6649 " vs_tcs_result = result;\n" 6650 "}\n" 6651 "\n"; 6652 6653 const GLchar* shader_template = 0; 6654 const GLchar* location_string = 0; 6655 6656 switch (in_stage) 6657 { 6658 case Utils::COMPUTE_SHADER: 6659 return; 6660 break; 6661 case Utils::FRAGMENT_SHADER: 6662 shader_template = fragment_shader_template; 6663 location_string = "0"; 6664 break; 6665 case Utils::GEOMETRY_SHADER: 6666 shader_template = geometry_shader_template; 6667 location_string = "1"; 6668 break; 6669 case Utils::TESS_CTRL_SHADER: 6670 shader_template = tess_ctrl_shader_template; 6671 location_string = "4"; 6672 break; 6673 case Utils::TESS_EVAL_SHADER: 6674 shader_template = tess_eval_shader_template; 6675 location_string = "3"; 6676 break; 6677 case Utils::VERTEX_SHADER: 6678 shader_template = vertex_shader_template; 6679 location_string = "2"; 6680 break; 6681 default: 6682 TCU_FAIL("Invalid enum"); 6683 break; 6684 } 6685 6686 const Utils::qualifierSet& test_case = getCurrentTestCase(); 6687 6688 std::string uni_declaration; 6689 std::string uni_reference; 6690 Utils::prepareVariableStrings(in_stage, Utils::UNIFORM, test_case, "vec4", "test", uni_declaration, uni_reference); 6691 6692 out_source.m_parts[0].m_code = shader_template; 6693 6694 size_t position = 0; 6695 6696 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 6697 out_source.m_parts[0].m_code); 6698 6699 Utils::replaceToken("VARIABLE_DECLARATION", position, uni_declaration.c_str(), out_source.m_parts[0].m_code); 6700 6701 position -= strlen(variable_declaration); 6702 6703 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 6704 6705 Utils::replaceAllTokens("VARIABLE_NAME", uni_reference.c_str(), out_source.m_parts[0].m_code); 6706 6707 Utils::replaceAllTokens("LOC_VALUE", location_string, out_source.m_parts[0].m_code); 6708 } 6709 6710 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 6711 * 6712 * @param program Current program 6713 **/ 6714 void QualifierOrderUniformTest::prepareUniforms(Utils::program& program) 6715 { 6716 static const GLfloat float_data[4] = { 0.0f, 0.0f, 1.0f, 1.0f }; 6717 6718 program.uniform("uni_fs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 6719 program.uniform("uni_gs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 6720 program.uniform("uni_tcs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 6721 program.uniform("uni_tes_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 6722 program.uniform("uni_vs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 6723 } 6724 6725 /** Prepare test cases 6726 * 6727 * @return false if ARB_explicit_uniform_location is not supported, true otherwise 6728 **/ 6729 bool QualifierOrderUniformTest::testInit() 6730 { 6731 if (false == m_is_explicit_uniform_location) 6732 { 6733 return false; 6734 } 6735 6736 m_test_cases.resize(4); 6737 6738 m_test_cases[0].push_back(Utils::QUAL_HIGHP); 6739 m_test_cases[0].push_back(Utils::QUAL_UNIFORM); 6740 m_test_cases[0].push_back(Utils::QUAL_LOCATION); 6741 6742 m_test_cases[1].push_back(Utils::QUAL_LOWP); 6743 m_test_cases[1].push_back(Utils::QUAL_UNIFORM); 6744 m_test_cases[1].push_back(Utils::QUAL_LOCATION); 6745 6746 m_test_cases[2].push_back(Utils::QUAL_HIGHP); 6747 m_test_cases[2].push_back(Utils::QUAL_LOCATION); 6748 m_test_cases[2].push_back(Utils::QUAL_UNIFORM); 6749 m_test_cases[2].push_back(Utils::QUAL_LOCATION); 6750 6751 m_test_cases[3].push_back(Utils::QUAL_LOCATION); 6752 m_test_cases[3].push_back(Utils::QUAL_LOWP); 6753 m_test_cases[3].push_back(Utils::QUAL_UNIFORM); 6754 m_test_cases[3].push_back(Utils::QUAL_LOCATION); 6755 6756 return true; 6757 } 6758 6759 /** Returns reference to current test case 6760 * 6761 * @return Reference to testCase 6762 **/ 6763 const Utils::qualifierSet& QualifierOrderUniformTest::getCurrentTestCase() 6764 { 6765 if ((glw::GLuint)-1 == m_current_test_case_index) 6766 { 6767 return m_test_cases[0]; 6768 } 6769 else 6770 { 6771 return m_test_cases[m_current_test_case_index]; 6772 } 6773 } 6774 6775 /** Constructor 6776 * 6777 * @param context Test context 6778 **/ 6779 QualifierOrderFunctionInoutTest::QualifierOrderFunctionInoutTest(deqp::Context& context) 6780 : GLSLTestBase(context, "qualifier_order_function_inout", "Verify order of qualifiers of inout function parameters") 6781 { 6782 /* Nothing to be done here */ 6783 } 6784 6785 /** Set up next test case 6786 * 6787 * @param test_case_index Index of next test case 6788 * 6789 * @return false if there is no more test cases, true otherwise 6790 **/ 6791 bool QualifierOrderFunctionInoutTest::prepareNextTestCase(glw::GLuint test_case_index) 6792 { 6793 m_current_test_case_index = test_case_index; 6794 6795 if ((glw::GLuint)-1 == test_case_index) 6796 { 6797 /* Nothing to be done here */; 6798 } 6799 else if (m_test_cases.size() <= test_case_index) 6800 { 6801 return false; 6802 } 6803 6804 const Utils::qualifierSet& set = getCurrentTestCase(); 6805 6806 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 6807 6808 for (GLuint i = 0; i < set.size(); ++i) 6809 { 6810 message << Utils::getQualifierString(set[i]) << " "; 6811 } 6812 6813 message << tcu::TestLog::EndMessage; 6814 6815 return true; 6816 } 6817 6818 /** Prepare source for given shader stage 6819 * 6820 * @param in_stage Shader stage, compute shader will use 430 6821 * @param in_use_version_400 Select if 400 or 420 should be used 6822 * @param out_source Prepared shader source instance 6823 **/ 6824 void QualifierOrderFunctionInoutTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 6825 Utils::shaderSource& out_source) 6826 { 6827 static const GLchar* verification_snippet = 6828 " vec4 temp = VARIABLE_NAME;\n" 6829 "\n" 6830 " function(temp);\n" 6831 "\n" 6832 " vec4 diff = temp - vec4(0, 0, 1, 1);\n" 6833 " if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n" 6834 " {\n" 6835 " result = VARIABLE_NAME;\n" 6836 " }\n"; 6837 6838 static const GLchar* function_declaration = "void function(QUALIFIERS_LIST vec4 param)\n" 6839 "{\n" 6840 " param = param.wzyx;\n" 6841 "}\n"; 6842 6843 static const GLchar* fragment_shader_template = "VERSION\n" 6844 "\n" 6845 "in vec4 gs_fs_result;\n" 6846 "out vec4 fs_out_result;\n" 6847 "\n" 6848 "uniform vec4 VARIABLE_NAME;\n" 6849 "\n" 6850 "FUNCTION_DECLARATION\n" 6851 "\n" 6852 "void main()\n" 6853 "{\n" 6854 " vec4 result = vec4(0, 1, 0, 1);\n" 6855 "\n" 6856 "VERIFICATION" 6857 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 6858 " {\n" 6859 " result = vec4(1, 0, 0, 1);\n" 6860 " }\n" 6861 "\n" 6862 " fs_out_result = result;\n" 6863 "}\n" 6864 "\n"; 6865 6866 static const GLchar* geometry_shader_template = "VERSION\n" 6867 "\n" 6868 "layout(points) in;\n" 6869 "layout(triangle_strip, max_vertices = 4) out;\n" 6870 "\n" 6871 "in vec4 tes_gs_result[];\n" 6872 "out vec4 gs_fs_result;\n" 6873 "\n" 6874 "uniform vec4 VARIABLE_NAME;\n" 6875 "\n" 6876 "FUNCTION_DECLARATION\n" 6877 "\n" 6878 "void main()\n" 6879 "{\n" 6880 " vec4 result = vec4(0, 1, 0, 1);\n" 6881 "\n" 6882 "VERIFICATION" 6883 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 6884 " {\n" 6885 " result = vec4(1, 0, 0, 1);\n" 6886 " }\n" 6887 "\n" 6888 " gs_fs_result = result;\n" 6889 " gl_Position = vec4(-1, -1, 0, 1);\n" 6890 " EmitVertex();\n" 6891 " gs_fs_result = result;\n" 6892 " gl_Position = vec4(-1, 1, 0, 1);\n" 6893 " EmitVertex();\n" 6894 " gs_fs_result = result;\n" 6895 " gl_Position = vec4(1, -1, 0, 1);\n" 6896 " EmitVertex();\n" 6897 " gs_fs_result = result;\n" 6898 " gl_Position = vec4(1, 1, 0, 1);\n" 6899 " EmitVertex();\n" 6900 "}\n" 6901 "\n"; 6902 6903 static const GLchar* tess_ctrl_shader_template = 6904 "VERSION\n" 6905 "\n" 6906 "layout(vertices = 1) out;\n" 6907 "\n" 6908 "in vec4 vs_tcs_result[];\n" 6909 "out vec4 tcs_tes_result[];\n" 6910 "\n" 6911 "uniform vec4 VARIABLE_NAME;\n" 6912 "\n" 6913 "FUNCTION_DECLARATION\n" 6914 "\n" 6915 "void main()\n" 6916 "{\n" 6917 " vec4 result = vec4(0, 1, 0, 1);\n" 6918 "\n" 6919 "VERIFICATION" 6920 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 6921 " {\n" 6922 " result = vec4(1, 0, 0, 1);\n" 6923 " }\n" 6924 "\n" 6925 " tcs_tes_result[gl_InvocationID] = result;\n" 6926 "\n" 6927 " gl_TessLevelOuter[0] = 1.0;\n" 6928 " gl_TessLevelOuter[1] = 1.0;\n" 6929 " gl_TessLevelOuter[2] = 1.0;\n" 6930 " gl_TessLevelOuter[3] = 1.0;\n" 6931 " gl_TessLevelInner[0] = 1.0;\n" 6932 " gl_TessLevelInner[1] = 1.0;\n" 6933 "}\n" 6934 "\n"; 6935 6936 static const GLchar* tess_eval_shader_template = "VERSION\n" 6937 "\n" 6938 "layout(isolines, point_mode) in;\n" 6939 "\n" 6940 "in vec4 tcs_tes_result[];\n" 6941 "out vec4 tes_gs_result;\n" 6942 "\n" 6943 "uniform vec4 VARIABLE_NAME;\n" 6944 "\n" 6945 "FUNCTION_DECLARATION\n" 6946 "\n" 6947 "void main()\n" 6948 "{\n" 6949 " vec4 result = vec4(0, 1, 0, 1);\n" 6950 "\n" 6951 "VERIFICATION" 6952 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 6953 " {\n" 6954 " result = vec4(1, 0, 0, 1);\n" 6955 " }\n" 6956 "\n" 6957 " tes_gs_result = result;\n" 6958 "}\n" 6959 "\n"; 6960 6961 static const GLchar* vertex_shader_template = "VERSION\n" 6962 "\n" 6963 "out vec4 vs_tcs_result;\n" 6964 "\n" 6965 "uniform vec4 VARIABLE_NAME;\n" 6966 "\n" 6967 "FUNCTION_DECLARATION\n" 6968 "\n" 6969 "void main()\n" 6970 "{\n" 6971 " vec4 result = vec4(0, 1, 0, 1);\n" 6972 "\n" 6973 "VERIFICATION" 6974 "\n" 6975 " vs_tcs_result = result;\n" 6976 "}\n" 6977 "\n"; 6978 6979 const GLchar* shader_template = 0; 6980 6981 switch (in_stage) 6982 { 6983 case Utils::COMPUTE_SHADER: 6984 return; 6985 break; 6986 case Utils::FRAGMENT_SHADER: 6987 shader_template = fragment_shader_template; 6988 break; 6989 case Utils::GEOMETRY_SHADER: 6990 shader_template = geometry_shader_template; 6991 break; 6992 case Utils::TESS_CTRL_SHADER: 6993 shader_template = tess_ctrl_shader_template; 6994 break; 6995 case Utils::TESS_EVAL_SHADER: 6996 shader_template = tess_eval_shader_template; 6997 break; 6998 case Utils::VERTEX_SHADER: 6999 shader_template = vertex_shader_template; 7000 break; 7001 default: 7002 TCU_FAIL("Invalid enum"); 7003 break; 7004 } 7005 7006 const std::string& uni_reference = Utils::getVariableName(in_stage, Utils::UNIFORM, "test"); 7007 const std::string& qualifier_list = Utils::getQualifiersListString(getCurrentTestCase()); 7008 7009 out_source.m_parts[0].m_code = shader_template; 7010 7011 size_t position = 0; 7012 7013 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 7014 out_source.m_parts[0].m_code); 7015 7016 Utils::replaceToken("FUNCTION_DECLARATION", position, function_declaration, out_source.m_parts[0].m_code); 7017 7018 position -= strlen(function_declaration); 7019 7020 Utils::replaceToken("QUALIFIERS_LIST", position, qualifier_list.c_str(), out_source.m_parts[0].m_code); 7021 7022 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 7023 7024 Utils::replaceAllTokens("VARIABLE_NAME", uni_reference.c_str(), out_source.m_parts[0].m_code); 7025 } 7026 7027 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 7028 * 7029 * @param program Current program 7030 **/ 7031 void QualifierOrderFunctionInoutTest::prepareUniforms(Utils::program& program) 7032 { 7033 static const GLfloat float_data[4] = { 1.0f, 1.0f, 0.0f, 0.0f }; 7034 7035 program.uniform("uni_fs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7036 program.uniform("uni_gs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7037 program.uniform("uni_tcs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7038 program.uniform("uni_tes_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7039 program.uniform("uni_vs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7040 } 7041 7042 /** Prepare test cases 7043 * 7044 * @return false if ARB_explicit_uniform_location is not supported, true otherwise 7045 **/ 7046 bool QualifierOrderFunctionInoutTest::testInit() 7047 { 7048 m_test_cases.resize(6); 7049 7050 m_test_cases[0].push_back(Utils::QUAL_HIGHP); 7051 m_test_cases[0].push_back(Utils::QUAL_PRECISE); 7052 m_test_cases[0].push_back(Utils::QUAL_INOUT); 7053 7054 m_test_cases[1].push_back(Utils::QUAL_INOUT); 7055 m_test_cases[1].push_back(Utils::QUAL_PRECISE); 7056 m_test_cases[1].push_back(Utils::QUAL_HIGHP); 7057 7058 m_test_cases[2].push_back(Utils::QUAL_MEDIUMP); 7059 m_test_cases[2].push_back(Utils::QUAL_PRECISE); 7060 m_test_cases[2].push_back(Utils::QUAL_INOUT); 7061 7062 m_test_cases[3].push_back(Utils::QUAL_INOUT); 7063 m_test_cases[3].push_back(Utils::QUAL_PRECISE); 7064 m_test_cases[3].push_back(Utils::QUAL_MEDIUMP); 7065 7066 m_test_cases[4].push_back(Utils::QUAL_LOWP); 7067 m_test_cases[4].push_back(Utils::QUAL_PRECISE); 7068 m_test_cases[4].push_back(Utils::QUAL_INOUT); 7069 7070 m_test_cases[5].push_back(Utils::QUAL_INOUT); 7071 m_test_cases[5].push_back(Utils::QUAL_PRECISE); 7072 m_test_cases[5].push_back(Utils::QUAL_LOWP); 7073 7074 return true; 7075 } 7076 7077 /** Returns reference to current test case 7078 * 7079 * @return Reference to testCase 7080 **/ 7081 const Utils::qualifierSet& QualifierOrderFunctionInoutTest::getCurrentTestCase() 7082 { 7083 if ((glw::GLuint)-1 == m_current_test_case_index) 7084 { 7085 return m_test_cases[0]; 7086 } 7087 else 7088 { 7089 return m_test_cases[m_current_test_case_index]; 7090 } 7091 } 7092 7093 /** Constructor 7094 * 7095 * @param context Test context 7096 **/ 7097 QualifierOrderFunctionInputTest::QualifierOrderFunctionInputTest(deqp::Context& context) 7098 : GLSLTestBase(context, "qualifier_order_function_input", "Verify order of qualifiers of function input parameters") 7099 { 7100 /* Nothing to be done here */ 7101 } 7102 7103 /** Set up next test case 7104 * 7105 * @param test_case_index Index of next test case 7106 * 7107 * @return false if there is no more test cases, true otherwise 7108 **/ 7109 bool QualifierOrderFunctionInputTest::prepareNextTestCase(glw::GLuint test_case_index) 7110 { 7111 m_current_test_case_index = test_case_index; 7112 7113 if ((glw::GLuint)-1 == test_case_index) 7114 { 7115 /* Nothing to be done here */; 7116 } 7117 else if (m_test_cases.size() <= test_case_index) 7118 { 7119 return false; 7120 } 7121 7122 const Utils::qualifierSet& set = getCurrentTestCase(); 7123 7124 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 7125 7126 for (GLuint i = 0; i < set.size(); ++i) 7127 { 7128 message << Utils::getQualifierString(set[i]) << " "; 7129 } 7130 7131 message << tcu::TestLog::EndMessage; 7132 7133 return true; 7134 } 7135 7136 /** Prepare source for given shader stage 7137 * 7138 * @param in_stage Shader stage, compute shader will use 430 7139 * @param in_use_version_400 Select if 400 or 420 should be used 7140 * @param out_source Prepared shader source instance 7141 **/ 7142 void QualifierOrderFunctionInputTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 7143 Utils::shaderSource& out_source) 7144 { 7145 static const GLchar* verification_snippet = 7146 " vec4 temp = function(VARIABLE_NAME);\n" 7147 "\n" 7148 " vec4 diff = temp - vec4(0, 0, 1, 1);\n" 7149 " if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n" 7150 " {\n" 7151 " result = VARIABLE_NAME;\n" 7152 " }\n"; 7153 7154 static const GLchar* function_declaration = "vec4 function(QUALIFIERS_LIST vec4 param)\n" 7155 "{\n" 7156 " return param.wzyx;\n" 7157 "}\n"; 7158 7159 static const GLchar* fragment_shader_template = "VERSION\n" 7160 "\n" 7161 "in vec4 gs_fs_result;\n" 7162 "out vec4 fs_out_result;\n" 7163 "\n" 7164 "uniform vec4 VARIABLE_NAME;\n" 7165 "\n" 7166 "FUNCTION_DECLARATION\n" 7167 "\n" 7168 "void main()\n" 7169 "{\n" 7170 " vec4 result = vec4(0, 1, 0, 1);\n" 7171 "\n" 7172 "VERIFICATION" 7173 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 7174 " {\n" 7175 " result = vec4(1, 0, 0, 1);\n" 7176 " }\n" 7177 "\n" 7178 " fs_out_result = result;\n" 7179 "}\n" 7180 "\n"; 7181 7182 static const GLchar* geometry_shader_template = "VERSION\n" 7183 "\n" 7184 "layout(points) in;\n" 7185 "layout(triangle_strip, max_vertices = 4) out;\n" 7186 "\n" 7187 "in vec4 tes_gs_result[];\n" 7188 "out vec4 gs_fs_result;\n" 7189 "\n" 7190 "uniform vec4 VARIABLE_NAME;\n" 7191 "\n" 7192 "FUNCTION_DECLARATION\n" 7193 "\n" 7194 "void main()\n" 7195 "{\n" 7196 " vec4 result = vec4(0, 1, 0, 1);\n" 7197 "\n" 7198 "VERIFICATION" 7199 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 7200 " {\n" 7201 " result = vec4(1, 0, 0, 1);\n" 7202 " }\n" 7203 "\n" 7204 " gs_fs_result = result;\n" 7205 " gl_Position = vec4(-1, -1, 0, 1);\n" 7206 " EmitVertex();\n" 7207 " gs_fs_result = result;\n" 7208 " gl_Position = vec4(-1, 1, 0, 1);\n" 7209 " EmitVertex();\n" 7210 " gs_fs_result = result;\n" 7211 " gl_Position = vec4(1, -1, 0, 1);\n" 7212 " EmitVertex();\n" 7213 " gs_fs_result = result;\n" 7214 " gl_Position = vec4(1, 1, 0, 1);\n" 7215 " EmitVertex();\n" 7216 "}\n" 7217 "\n"; 7218 7219 static const GLchar* tess_ctrl_shader_template = 7220 "VERSION\n" 7221 "\n" 7222 "layout(vertices = 1) out;\n" 7223 "\n" 7224 "in vec4 vs_tcs_result[];\n" 7225 "out vec4 tcs_tes_result[];\n" 7226 "\n" 7227 "uniform vec4 VARIABLE_NAME;\n" 7228 "\n" 7229 "FUNCTION_DECLARATION\n" 7230 "\n" 7231 "void main()\n" 7232 "{\n" 7233 " vec4 result = vec4(0, 1, 0, 1);\n" 7234 "\n" 7235 "VERIFICATION" 7236 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 7237 " {\n" 7238 " result = vec4(1, 0, 0, 1);\n" 7239 " }\n" 7240 "\n" 7241 " tcs_tes_result[gl_InvocationID] = result;\n" 7242 "\n" 7243 " gl_TessLevelOuter[0] = 1.0;\n" 7244 " gl_TessLevelOuter[1] = 1.0;\n" 7245 " gl_TessLevelOuter[2] = 1.0;\n" 7246 " gl_TessLevelOuter[3] = 1.0;\n" 7247 " gl_TessLevelInner[0] = 1.0;\n" 7248 " gl_TessLevelInner[1] = 1.0;\n" 7249 "}\n" 7250 "\n"; 7251 7252 static const GLchar* tess_eval_shader_template = "VERSION\n" 7253 "\n" 7254 "layout(isolines, point_mode) in;\n" 7255 "\n" 7256 "in vec4 tcs_tes_result[];\n" 7257 "out vec4 tes_gs_result;\n" 7258 "\n" 7259 "uniform vec4 VARIABLE_NAME;\n" 7260 "\n" 7261 "FUNCTION_DECLARATION\n" 7262 "\n" 7263 "void main()\n" 7264 "{\n" 7265 " vec4 result = vec4(0, 1, 0, 1);\n" 7266 "\n" 7267 "VERIFICATION" 7268 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 7269 " {\n" 7270 " result = vec4(1, 0, 0, 1);\n" 7271 " }\n" 7272 "\n" 7273 " tes_gs_result = result;\n" 7274 "}\n" 7275 "\n"; 7276 7277 static const GLchar* vertex_shader_template = "VERSION\n" 7278 "\n" 7279 "out vec4 vs_tcs_result;\n" 7280 "\n" 7281 "uniform vec4 VARIABLE_NAME;\n" 7282 "\n" 7283 "FUNCTION_DECLARATION\n" 7284 "\n" 7285 "void main()\n" 7286 "{\n" 7287 " vec4 result = vec4(0, 1, 0, 1);\n" 7288 "\n" 7289 "VERIFICATION" 7290 "\n" 7291 " vs_tcs_result = result;\n" 7292 "}\n" 7293 "\n"; 7294 7295 const GLchar* shader_template = 0; 7296 7297 switch (in_stage) 7298 { 7299 case Utils::COMPUTE_SHADER: 7300 return; 7301 break; 7302 case Utils::FRAGMENT_SHADER: 7303 shader_template = fragment_shader_template; 7304 break; 7305 case Utils::GEOMETRY_SHADER: 7306 shader_template = geometry_shader_template; 7307 break; 7308 case Utils::TESS_CTRL_SHADER: 7309 shader_template = tess_ctrl_shader_template; 7310 break; 7311 case Utils::TESS_EVAL_SHADER: 7312 shader_template = tess_eval_shader_template; 7313 break; 7314 case Utils::VERTEX_SHADER: 7315 shader_template = vertex_shader_template; 7316 break; 7317 default: 7318 TCU_FAIL("Invalid enum"); 7319 break; 7320 } 7321 7322 const std::string& uni_reference = Utils::getVariableName(in_stage, Utils::UNIFORM, "test"); 7323 const std::string& qualifier_list = Utils::getQualifiersListString(getCurrentTestCase()); 7324 7325 out_source.m_parts[0].m_code = shader_template; 7326 7327 size_t position = 0; 7328 7329 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 7330 out_source.m_parts[0].m_code); 7331 7332 Utils::replaceToken("FUNCTION_DECLARATION", position, function_declaration, out_source.m_parts[0].m_code); 7333 7334 position -= strlen(function_declaration); 7335 7336 Utils::replaceToken("QUALIFIERS_LIST", position, qualifier_list.c_str(), out_source.m_parts[0].m_code); 7337 7338 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 7339 7340 Utils::replaceAllTokens("VARIABLE_NAME", uni_reference.c_str(), out_source.m_parts[0].m_code); 7341 } 7342 7343 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 7344 * 7345 * @param program Current program 7346 **/ 7347 void QualifierOrderFunctionInputTest::prepareUniforms(Utils::program& program) 7348 { 7349 static const GLfloat float_data[4] = { 1.0f, 1.0f, 0.0f, 0.0f }; 7350 7351 program.uniform("uni_fs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7352 program.uniform("uni_gs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7353 program.uniform("uni_tcs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7354 program.uniform("uni_tes_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7355 program.uniform("uni_vs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7356 } 7357 7358 /** Prepare test cases 7359 * 7360 * @return false if ARB_explicit_uniform_location is not supported, true otherwise 7361 **/ 7362 bool QualifierOrderFunctionInputTest::testInit() 7363 { 7364 m_test_cases.resize(6); 7365 7366 m_test_cases[0].push_back(Utils::QUAL_CONST); 7367 m_test_cases[0].push_back(Utils::QUAL_HIGHP); 7368 m_test_cases[0].push_back(Utils::QUAL_PRECISE); 7369 m_test_cases[0].push_back(Utils::QUAL_IN); 7370 7371 m_test_cases[1].push_back(Utils::QUAL_IN); 7372 m_test_cases[1].push_back(Utils::QUAL_CONST); 7373 m_test_cases[1].push_back(Utils::QUAL_PRECISE); 7374 m_test_cases[1].push_back(Utils::QUAL_HIGHP); 7375 7376 m_test_cases[2].push_back(Utils::QUAL_PRECISE); 7377 m_test_cases[2].push_back(Utils::QUAL_MEDIUMP); 7378 m_test_cases[2].push_back(Utils::QUAL_CONST); 7379 m_test_cases[2].push_back(Utils::QUAL_IN); 7380 7381 m_test_cases[3].push_back(Utils::QUAL_IN); 7382 m_test_cases[3].push_back(Utils::QUAL_PRECISE); 7383 m_test_cases[3].push_back(Utils::QUAL_MEDIUMP); 7384 m_test_cases[3].push_back(Utils::QUAL_CONST); 7385 7386 m_test_cases[4].push_back(Utils::QUAL_LOWP); 7387 m_test_cases[4].push_back(Utils::QUAL_CONST); 7388 m_test_cases[4].push_back(Utils::QUAL_IN); 7389 m_test_cases[4].push_back(Utils::QUAL_PRECISE); 7390 7391 m_test_cases[5].push_back(Utils::QUAL_IN); 7392 m_test_cases[5].push_back(Utils::QUAL_PRECISE); 7393 m_test_cases[5].push_back(Utils::QUAL_CONST); 7394 m_test_cases[5].push_back(Utils::QUAL_LOWP); 7395 7396 return true; 7397 } 7398 7399 /** Returns reference to current test case 7400 * 7401 * @return Reference to testCase 7402 **/ 7403 const Utils::qualifierSet& QualifierOrderFunctionInputTest::getCurrentTestCase() 7404 { 7405 if ((glw::GLuint)-1 == m_current_test_case_index) 7406 { 7407 return m_test_cases[0]; 7408 } 7409 else 7410 { 7411 return m_test_cases[m_current_test_case_index]; 7412 } 7413 } 7414 7415 /** Constructor 7416 * 7417 * @param context Test context 7418 **/ 7419 QualifierOrderFunctionOutputTest::QualifierOrderFunctionOutputTest(deqp::Context& context) 7420 : GLSLTestBase(context, "qualifier_order_function_output", 7421 "Verify order of qualifiers of output function parameters") 7422 { 7423 /* Nothing to be done here */ 7424 } 7425 7426 /** Set up next test case 7427 * 7428 * @param test_case_index Index of next test case 7429 * 7430 * @return false if there is no more test cases, true otherwise 7431 **/ 7432 bool QualifierOrderFunctionOutputTest::prepareNextTestCase(glw::GLuint test_case_index) 7433 { 7434 m_current_test_case_index = test_case_index; 7435 7436 if ((glw::GLuint)-1 == test_case_index) 7437 { 7438 /* Nothing to be done here */; 7439 } 7440 else if (m_test_cases.size() <= test_case_index) 7441 { 7442 return false; 7443 } 7444 7445 const Utils::qualifierSet& set = getCurrentTestCase(); 7446 7447 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 7448 7449 for (GLuint i = 0; i < set.size(); ++i) 7450 { 7451 message << Utils::getQualifierString(set[i]) << " "; 7452 } 7453 7454 message << tcu::TestLog::EndMessage; 7455 7456 return true; 7457 } 7458 7459 /** Prepare source for given shader stage 7460 * 7461 * @param in_stage Shader stage, compute shader will use 430 7462 * @param in_use_version_400 Select if 400 or 420 should be used 7463 * @param out_source Prepared shader source instance 7464 **/ 7465 void QualifierOrderFunctionOutputTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 7466 Utils::shaderSource& out_source) 7467 { 7468 static const GLchar* verification_snippet = 7469 " vec4 temp;\n" 7470 "\n" 7471 " function(temp);\n" 7472 "\n" 7473 " vec4 diff = temp - vec4(0, 0, 1, 1);\n" 7474 " if (false == all(lessThan(diff, vec4(0.001, 0.001, 0.001, 0.001))))\n" 7475 " {\n" 7476 " result = VARIABLE_NAME;\n" 7477 " }\n"; 7478 7479 static const GLchar* function_declaration = "void function(QUALIFIERS_LIST vec4 param)\n" 7480 "{\n" 7481 " param = VARIABLE_NAME.wzyx;\n" 7482 "}\n"; 7483 7484 static const GLchar* fragment_shader_template = "VERSION\n" 7485 "\n" 7486 "in vec4 gs_fs_result;\n" 7487 "out vec4 fs_out_result;\n" 7488 "\n" 7489 "uniform vec4 VARIABLE_NAME;\n" 7490 "\n" 7491 "FUNCTION_DECLARATION\n" 7492 "\n" 7493 "void main()\n" 7494 "{\n" 7495 " vec4 result = vec4(0, 1, 0, 1);\n" 7496 "\n" 7497 "VERIFICATION" 7498 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 7499 " {\n" 7500 " result = vec4(1, 0, 0, 1);\n" 7501 " }\n" 7502 "\n" 7503 " fs_out_result = result;\n" 7504 "}\n" 7505 "\n"; 7506 7507 static const GLchar* geometry_shader_template = "VERSION\n" 7508 "\n" 7509 "layout(points) in;\n" 7510 "layout(triangle_strip, max_vertices = 4) out;\n" 7511 "\n" 7512 "in vec4 tes_gs_result[];\n" 7513 "out vec4 gs_fs_result;\n" 7514 "\n" 7515 "uniform vec4 VARIABLE_NAME;\n" 7516 "\n" 7517 "FUNCTION_DECLARATION\n" 7518 "\n" 7519 "void main()\n" 7520 "{\n" 7521 " vec4 result = vec4(0, 1, 0, 1);\n" 7522 "\n" 7523 "VERIFICATION" 7524 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 7525 " {\n" 7526 " result = vec4(1, 0, 0, 1);\n" 7527 " }\n" 7528 "\n" 7529 " gs_fs_result = result;\n" 7530 " gl_Position = vec4(-1, -1, 0, 1);\n" 7531 " EmitVertex();\n" 7532 " gs_fs_result = result;\n" 7533 " gl_Position = vec4(-1, 1, 0, 1);\n" 7534 " EmitVertex();\n" 7535 " gs_fs_result = result;\n" 7536 " gl_Position = vec4(1, -1, 0, 1);\n" 7537 " EmitVertex();\n" 7538 " gs_fs_result = result;\n" 7539 " gl_Position = vec4(1, 1, 0, 1);\n" 7540 " EmitVertex();\n" 7541 "}\n" 7542 "\n"; 7543 7544 static const GLchar* tess_ctrl_shader_template = 7545 "VERSION\n" 7546 "\n" 7547 "layout(vertices = 1) out;\n" 7548 "\n" 7549 "in vec4 vs_tcs_result[];\n" 7550 "out vec4 tcs_tes_result[];\n" 7551 "\n" 7552 "uniform vec4 VARIABLE_NAME;\n" 7553 "\n" 7554 "FUNCTION_DECLARATION\n" 7555 "\n" 7556 "void main()\n" 7557 "{\n" 7558 " vec4 result = vec4(0, 1, 0, 1);\n" 7559 "\n" 7560 "VERIFICATION" 7561 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 7562 " {\n" 7563 " result = vec4(1, 0, 0, 1);\n" 7564 " }\n" 7565 "\n" 7566 " tcs_tes_result[gl_InvocationID] = result;\n" 7567 "\n" 7568 " gl_TessLevelOuter[0] = 1.0;\n" 7569 " gl_TessLevelOuter[1] = 1.0;\n" 7570 " gl_TessLevelOuter[2] = 1.0;\n" 7571 " gl_TessLevelOuter[3] = 1.0;\n" 7572 " gl_TessLevelInner[0] = 1.0;\n" 7573 " gl_TessLevelInner[1] = 1.0;\n" 7574 "}\n" 7575 "\n"; 7576 7577 static const GLchar* tess_eval_shader_template = "VERSION\n" 7578 "\n" 7579 "layout(isolines, point_mode) in;\n" 7580 "\n" 7581 "in vec4 tcs_tes_result[];\n" 7582 "out vec4 tes_gs_result;\n" 7583 "\n" 7584 "uniform vec4 VARIABLE_NAME;\n" 7585 "\n" 7586 "FUNCTION_DECLARATION\n" 7587 "\n" 7588 "void main()\n" 7589 "{\n" 7590 " vec4 result = vec4(0, 1, 0, 1);\n" 7591 "\n" 7592 "VERIFICATION" 7593 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 7594 " {\n" 7595 " result = vec4(1, 0, 0, 1);\n" 7596 " }\n" 7597 "\n" 7598 " tes_gs_result = result;\n" 7599 "}\n" 7600 "\n"; 7601 7602 static const GLchar* vertex_shader_template = "VERSION\n" 7603 "\n" 7604 "out vec4 vs_tcs_result;\n" 7605 "\n" 7606 "uniform vec4 VARIABLE_NAME;\n" 7607 "\n" 7608 "FUNCTION_DECLARATION\n" 7609 "\n" 7610 "void main()\n" 7611 "{\n" 7612 " vec4 result = vec4(0, 1, 0, 1);\n" 7613 "\n" 7614 "VERIFICATION" 7615 "\n" 7616 " vs_tcs_result = result;\n" 7617 "}\n" 7618 "\n"; 7619 7620 const GLchar* shader_template = 0; 7621 7622 switch (in_stage) 7623 { 7624 case Utils::COMPUTE_SHADER: 7625 return; 7626 break; 7627 case Utils::FRAGMENT_SHADER: 7628 shader_template = fragment_shader_template; 7629 break; 7630 case Utils::GEOMETRY_SHADER: 7631 shader_template = geometry_shader_template; 7632 break; 7633 case Utils::TESS_CTRL_SHADER: 7634 shader_template = tess_ctrl_shader_template; 7635 break; 7636 case Utils::TESS_EVAL_SHADER: 7637 shader_template = tess_eval_shader_template; 7638 break; 7639 case Utils::VERTEX_SHADER: 7640 shader_template = vertex_shader_template; 7641 break; 7642 default: 7643 TCU_FAIL("Invalid enum"); 7644 break; 7645 } 7646 7647 const std::string& uni_reference = Utils::getVariableName(in_stage, Utils::UNIFORM, "test"); 7648 const std::string& qualifier_list = Utils::getQualifiersListString(getCurrentTestCase()); 7649 7650 out_source.m_parts[0].m_code = shader_template; 7651 7652 size_t position = 0; 7653 7654 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 7655 out_source.m_parts[0].m_code); 7656 7657 Utils::replaceToken("FUNCTION_DECLARATION", position, function_declaration, out_source.m_parts[0].m_code); 7658 7659 position -= strlen(function_declaration); 7660 7661 Utils::replaceToken("QUALIFIERS_LIST", position, qualifier_list.c_str(), out_source.m_parts[0].m_code); 7662 7663 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 7664 7665 Utils::replaceAllTokens("VARIABLE_NAME", uni_reference.c_str(), out_source.m_parts[0].m_code); 7666 } 7667 7668 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 7669 * 7670 * @param program Current program 7671 **/ 7672 void QualifierOrderFunctionOutputTest::prepareUniforms(Utils::program& program) 7673 { 7674 static const GLfloat float_data[4] = { 1.0f, 1.0f, 0.0f, 0.0f }; 7675 7676 program.uniform("uni_fs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7677 program.uniform("uni_gs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7678 program.uniform("uni_tcs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7679 program.uniform("uni_tes_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7680 program.uniform("uni_vs_test", Utils::FLOAT, 1 /* n_cols */, 4 /* n_rows */, float_data); 7681 } 7682 7683 /** Prepare test cases 7684 * 7685 * @return false if ARB_explicit_uniform_location is not supported, true otherwise 7686 **/ 7687 bool QualifierOrderFunctionOutputTest::testInit() 7688 { 7689 m_test_cases.resize(6); 7690 7691 m_test_cases[0].push_back(Utils::QUAL_HIGHP); 7692 m_test_cases[0].push_back(Utils::QUAL_PRECISE); 7693 m_test_cases[0].push_back(Utils::QUAL_OUT); 7694 7695 m_test_cases[1].push_back(Utils::QUAL_OUT); 7696 m_test_cases[1].push_back(Utils::QUAL_PRECISE); 7697 m_test_cases[1].push_back(Utils::QUAL_HIGHP); 7698 7699 m_test_cases[2].push_back(Utils::QUAL_PRECISE); 7700 m_test_cases[2].push_back(Utils::QUAL_MEDIUMP); 7701 m_test_cases[2].push_back(Utils::QUAL_OUT); 7702 7703 m_test_cases[3].push_back(Utils::QUAL_OUT); 7704 m_test_cases[3].push_back(Utils::QUAL_PRECISE); 7705 m_test_cases[3].push_back(Utils::QUAL_MEDIUMP); 7706 7707 m_test_cases[4].push_back(Utils::QUAL_LOWP); 7708 m_test_cases[4].push_back(Utils::QUAL_OUT); 7709 m_test_cases[4].push_back(Utils::QUAL_PRECISE); 7710 7711 m_test_cases[5].push_back(Utils::QUAL_OUT); 7712 m_test_cases[5].push_back(Utils::QUAL_PRECISE); 7713 m_test_cases[5].push_back(Utils::QUAL_LOWP); 7714 7715 return true; 7716 } 7717 7718 /** Returns reference to current test case 7719 * 7720 * @return Reference to testCase 7721 **/ 7722 const Utils::qualifierSet& QualifierOrderFunctionOutputTest::getCurrentTestCase() 7723 { 7724 if ((glw::GLuint)-1 == m_current_test_case_index) 7725 { 7726 return m_test_cases[0]; 7727 } 7728 else 7729 { 7730 return m_test_cases[m_current_test_case_index]; 7731 } 7732 } 7733 7734 /** Constructor 7735 * 7736 * @param context Test context 7737 **/ 7738 QualifierOverrideLayoutTest::QualifierOverrideLayoutTest(deqp::Context& context) 7739 : GLSLTestBase(context, "qualifier_override_layout", "Verifies overriding layout qualifiers") 7740 { 7741 /* Nothing to be done here */ 7742 } 7743 7744 /** Prepare source for given shader stage 7745 * 7746 * @param in_stage Shader stage, compute shader will use 430 7747 * @param in_use_version_400 Select if 400 or 420 should be used 7748 * @param out_source Prepared shader source instance 7749 **/ 7750 void QualifierOverrideLayoutTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 7751 Utils::shaderSource& out_source) 7752 { 7753 static const GLchar* fragment_shader_template = "VERSION\n" 7754 "\n" 7755 "in layout(location = 3) layout(location = 2) vec4 gs_fs_result;\n" 7756 "out vec4 fs_out_result;\n" 7757 "\n" 7758 "void main()\n" 7759 "{\n" 7760 " vec4 result = vec4(0, 1, 0, 1);\n" 7761 "\n" 7762 " if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 7763 " {\n" 7764 " result = vec4(1, 0, 0, 1);\n" 7765 " }\n" 7766 "\n" 7767 " fs_out_result = result;\n" 7768 "}\n" 7769 "\n"; 7770 7771 static const GLchar* geometry_shader_template = 7772 "VERSION\n" 7773 "\n" 7774 "layout(points) in;\n" 7775 "layout(triangle_strip, max_vertices = 2) layout(max_vertices = 4) out;\n" 7776 "\n" 7777 "in layout(location = 3) layout(location = 2) vec4 tes_gs_result[];\n" 7778 "out layout(location = 3) layout(location = 2) vec4 gs_fs_result;\n" 7779 "\n" 7780 "void main()\n" 7781 "{\n" 7782 " vec4 result = vec4(0, 1, 0, 1);\n" 7783 "\n" 7784 " if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 7785 " {\n" 7786 " result = vec4(1, 0, 0, 1);\n" 7787 " }\n" 7788 "\n" 7789 " gs_fs_result = result;\n" 7790 " gl_Position = vec4(-1, -1, 0, 1);\n" 7791 " EmitVertex();\n" 7792 " gs_fs_result = result;\n" 7793 " gl_Position = vec4(-1, 1, 0, 1);\n" 7794 " EmitVertex();\n" 7795 " gs_fs_result = result;\n" 7796 " gl_Position = vec4(1, -1, 0, 1);\n" 7797 " EmitVertex();\n" 7798 " gs_fs_result = result;\n" 7799 " gl_Position = vec4(1, 1, 0, 1);\n" 7800 " EmitVertex();\n" 7801 "}\n" 7802 "\n"; 7803 7804 static const GLchar* tess_ctrl_shader_template = 7805 "VERSION\n" 7806 "\n" 7807 "layout(vertices = 4) layout(vertices = 1) out;\n" 7808 "\n" 7809 "in layout(location = 3) layout(location = 2) vec4 vs_tcs_result[];\n" 7810 "out layout(location = 3) layout(location = 2) vec4 tcs_tes_result[];\n" 7811 "\n" 7812 "void main()\n" 7813 "{\n" 7814 " vec4 result = vec4(0, 1, 0, 1);\n" 7815 "\n" 7816 " if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 7817 " {\n" 7818 " result = vec4(1, 0, 0, 1);\n" 7819 " }\n" 7820 "\n" 7821 " tcs_tes_result[gl_InvocationID] = result;\n" 7822 "\n" 7823 " gl_TessLevelOuter[0] = 1.0;\n" 7824 " gl_TessLevelOuter[1] = 1.0;\n" 7825 " gl_TessLevelOuter[2] = 1.0;\n" 7826 " gl_TessLevelOuter[3] = 1.0;\n" 7827 " gl_TessLevelInner[0] = 1.0;\n" 7828 " gl_TessLevelInner[1] = 1.0;\n" 7829 "}\n" 7830 "\n"; 7831 7832 static const GLchar* tess_eval_shader_template = 7833 "VERSION\n" 7834 "\n" 7835 "layout(isolines, point_mode) in;\n" 7836 "\n" 7837 "in layout(location = 3) layout(location = 2) vec4 tcs_tes_result[];\n" 7838 "out layout(location = 3) layout(location = 2) vec4 tes_gs_result;\n" 7839 "\n" 7840 "void main()\n" 7841 "{\n" 7842 " vec4 result = vec4(0, 1, 0, 1);\n" 7843 "\n" 7844 " if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 7845 " {\n" 7846 " result = vec4(1, 0, 0, 1);\n" 7847 " }\n" 7848 "\n" 7849 " tes_gs_result = result;\n" 7850 "}\n" 7851 "\n"; 7852 7853 static const GLchar* vertex_shader_template = "VERSION\n" 7854 "\n" 7855 "in layout(location = 3) layout(location = 2) vec4 in_vs_test;\n" 7856 "out layout(location = 3) layout(location = 2) vec4 vs_tcs_result;\n" 7857 "\n" 7858 "void main()\n" 7859 "{\n" 7860 " vec4 result = in_vs_test;\n" 7861 "\n" 7862 " vs_tcs_result = result;\n" 7863 "}\n" 7864 "\n"; 7865 7866 const GLchar* shader_template = 0; 7867 7868 switch (in_stage) 7869 { 7870 case Utils::COMPUTE_SHADER: 7871 return; 7872 break; 7873 case Utils::FRAGMENT_SHADER: 7874 shader_template = fragment_shader_template; 7875 break; 7876 case Utils::GEOMETRY_SHADER: 7877 shader_template = geometry_shader_template; 7878 break; 7879 case Utils::TESS_CTRL_SHADER: 7880 shader_template = tess_ctrl_shader_template; 7881 break; 7882 case Utils::TESS_EVAL_SHADER: 7883 shader_template = tess_eval_shader_template; 7884 break; 7885 case Utils::VERTEX_SHADER: 7886 shader_template = vertex_shader_template; 7887 break; 7888 default: 7889 TCU_FAIL("Invalid enum"); 7890 break; 7891 } 7892 7893 out_source.m_parts[0].m_code = shader_template; 7894 7895 size_t position = 0; 7896 7897 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 7898 out_source.m_parts[0].m_code); 7899 } 7900 7901 /**Prepare vertex buffer and vertex array object. 7902 * 7903 * @param program Program instance 7904 * @param buffer Buffer instance 7905 * @param vao VertexArray instance 7906 * 7907 * @return 0 7908 **/ 7909 void QualifierOverrideLayoutTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, 7910 Utils::vertexArray& vao) 7911 { 7912 static const GLint expected_location = 2; 7913 7914 std::string test_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, "test"); 7915 GLint test_loc = program.getAttribLocation(test_name.c_str()); 7916 7917 if (expected_location != test_loc) 7918 { 7919 TCU_FAIL("Vertex attribute location is invalid"); 7920 } 7921 7922 vao.generate(); 7923 vao.bind(); 7924 7925 buffer.generate(GL_ARRAY_BUFFER); 7926 7927 GLfloat data[] = { 0.0f, 1.0f, 0.0f, 1.0f }; 7928 GLsizeiptr data_size = sizeof(data); 7929 7930 buffer.update(data_size, data, GL_STATIC_DRAW); 7931 7932 /* GL entry points */ 7933 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 7934 7935 /* Set up vao */ 7936 gl.vertexAttribPointer(test_loc, 4 /* size */, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0 /* stride */, 7937 0 /* offset */); 7938 GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer"); 7939 7940 /* Enable attribute */ 7941 gl.enableVertexAttribArray(test_loc); 7942 GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray"); 7943 } 7944 7945 /** Constructor 7946 * 7947 * @param context Test context 7948 **/ 7949 BindingUniformBlocksTest::BindingUniformBlocksTest(deqp::Context& context) 7950 : GLSLTestBase(context, "binding_uniform_blocks", "Test verifies uniform block binding") 7951 , m_goku_buffer(context) 7952 , m_vegeta_buffer(context) 7953 , m_children_buffer(context) 7954 { 7955 /* Nothing to be done here */ 7956 } 7957 7958 /** Prepare source for given shader stage 7959 * 7960 * @param in_stage Shader stage, compute shader will use 430 7961 * @param in_use_version_400 Select if 400 or 420 should be used 7962 * @param out_source Prepared shader source instance 7963 **/ 7964 void BindingUniformBlocksTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 7965 Utils::shaderSource& out_source) 7966 { 7967 static const GLchar* uni_goku = "layout(std140, binding = 0) uniform GOKU {\n" 7968 " vec4 chichi;\n" 7969 "} goku;\n"; 7970 7971 static const GLchar* uni_vegeta = "layout(std140, binding = 1) uniform VEGETA {\n" 7972 " vec3 bulma;\n" 7973 "} vegeta;\n"; 7974 7975 static const GLchar* uni_children = "layout(std140, binding = 3) uniform CHILDREN {\n" 7976 " vec4 gohan;\n" 7977 " vec4 trunks;\n" 7978 "} children;\n\n"; 7979 7980 static const GLchar* verification_snippet = " if ((vec4(1, 0, 0, 0) != goku.chichi) ||\n" 7981 " (vec3(0, 1, 0) != vegeta.bulma) ||\n" 7982 " (vec4(0, 0, 1, 0) != children.gohan) ||\n" 7983 " (vec4(0, 0, 0, 1) != children.trunks) )\n" 7984 " {\n" 7985 " result = vec4(1, 0, 0, 1);\n" 7986 " }\n"; 7987 7988 static const GLchar* compute_shader_template = 7989 "VERSION\n" 7990 "\n" 7991 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 7992 "\n" 7993 "writeonly uniform image2D uni_image;\n" 7994 "\n" 7995 "UNI_GOKU\n" 7996 "UNI_VEGETA\n" 7997 "UNI_CHILDREN\n" 7998 "\n" 7999 "void main()\n" 8000 "{\n" 8001 " vec4 result = vec4(0, 1, 0, 1);\n" 8002 "\n" 8003 "VERIFICATION" 8004 "\n" 8005 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 8006 "}\n" 8007 "\n"; 8008 8009 static const GLchar* fragment_shader_template = "VERSION\n" 8010 "\n" 8011 "in vec4 gs_fs_result;\n" 8012 "out vec4 fs_out_result;\n" 8013 "\n" 8014 "UNI_GOKU\n" 8015 "UNI_VEGETA\n" 8016 "UNI_CHILDREN\n" 8017 "\n" 8018 "void main()\n" 8019 "{\n" 8020 " vec4 result = vec4(0, 1, 0, 1);\n" 8021 "\n" 8022 "VERIFICATION" 8023 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 8024 " {\n" 8025 " result = vec4(1, 0, 0, 1);\n" 8026 " }\n" 8027 "\n" 8028 " fs_out_result = result;\n" 8029 "}\n" 8030 "\n"; 8031 8032 static const GLchar* geometry_shader_template = "VERSION\n" 8033 "\n" 8034 "layout(points) in;\n" 8035 "layout(triangle_strip, max_vertices = 4) out;\n" 8036 "\n" 8037 "in vec4 tes_gs_result[];\n" 8038 "out vec4 gs_fs_result;\n" 8039 "\n" 8040 "UNI_CHILDREN\n" 8041 "UNI_GOKU\n" 8042 "UNI_VEGETA\n" 8043 "\n" 8044 "void main()\n" 8045 "{\n" 8046 " vec4 result = vec4(0, 1, 0, 1);\n" 8047 "\n" 8048 "VERIFICATION" 8049 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 8050 " {\n" 8051 " result = vec4(1, 0, 0, 1);\n" 8052 " }\n" 8053 "\n" 8054 " gs_fs_result = result;\n" 8055 " gl_Position = vec4(-1, -1, 0, 1);\n" 8056 " EmitVertex();\n" 8057 " gs_fs_result = result;\n" 8058 " gl_Position = vec4(-1, 1, 0, 1);\n" 8059 " EmitVertex();\n" 8060 " gs_fs_result = result;\n" 8061 " gl_Position = vec4(1, -1, 0, 1);\n" 8062 " EmitVertex();\n" 8063 " gs_fs_result = result;\n" 8064 " gl_Position = vec4(1, 1, 0, 1);\n" 8065 " EmitVertex();\n" 8066 "}\n" 8067 "\n"; 8068 8069 static const GLchar* tess_ctrl_shader_template = 8070 "VERSION\n" 8071 "\n" 8072 "layout(vertices = 1) out;\n" 8073 "\n" 8074 "in vec4 vs_tcs_result[];\n" 8075 "out vec4 tcs_tes_result[];\n" 8076 "\n" 8077 "UNI_VEGETA\n" 8078 "UNI_CHILDREN\n" 8079 "UNI_GOKU\n" 8080 "\n" 8081 "void main()\n" 8082 "{\n" 8083 " vec4 result = vec4(0, 1, 0, 1);\n" 8084 "\n" 8085 "VERIFICATION" 8086 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 8087 " {\n" 8088 " result = vec4(1, 0, 0, 1);\n" 8089 " }\n" 8090 "\n" 8091 " tcs_tes_result[gl_InvocationID] = result;\n" 8092 "\n" 8093 " gl_TessLevelOuter[0] = 1.0;\n" 8094 " gl_TessLevelOuter[1] = 1.0;\n" 8095 " gl_TessLevelOuter[2] = 1.0;\n" 8096 " gl_TessLevelOuter[3] = 1.0;\n" 8097 " gl_TessLevelInner[0] = 1.0;\n" 8098 " gl_TessLevelInner[1] = 1.0;\n" 8099 "}\n" 8100 "\n"; 8101 8102 static const GLchar* tess_eval_shader_template = "VERSION\n" 8103 "\n" 8104 "layout(isolines, point_mode) in;\n" 8105 "\n" 8106 "in vec4 tcs_tes_result[];\n" 8107 "out vec4 tes_gs_result;\n" 8108 "\n" 8109 "UNI_GOKU\n" 8110 "UNI_CHILDREN\n" 8111 "UNI_VEGETA\n" 8112 "\n" 8113 "void main()\n" 8114 "{\n" 8115 " vec4 result = vec4(0, 1, 0, 1);\n" 8116 "\n" 8117 "VERIFICATION" 8118 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 8119 " {\n" 8120 " result = vec4(1, 0, 0, 1);\n" 8121 " }\n" 8122 "\n" 8123 " tes_gs_result = result;\n" 8124 "}\n" 8125 "\n"; 8126 8127 static const GLchar* vertex_shader_template = "VERSION\n" 8128 "\n" 8129 "out vec4 vs_tcs_result;\n" 8130 "\n" 8131 "UNI_CHILDREN\n" 8132 "UNI_VEGETA\n" 8133 "UNI_GOKU\n" 8134 "\n" 8135 "void main()\n" 8136 "{\n" 8137 " vec4 result = vec4(0, 1, 0, 1);\n" 8138 "\n" 8139 "VERIFICATION" 8140 "\n" 8141 " vs_tcs_result = result;\n" 8142 "}\n" 8143 "\n"; 8144 8145 const GLchar* shader_template = 0; 8146 8147 switch (in_stage) 8148 { 8149 case Utils::COMPUTE_SHADER: 8150 shader_template = compute_shader_template; 8151 break; 8152 case Utils::FRAGMENT_SHADER: 8153 shader_template = fragment_shader_template; 8154 break; 8155 case Utils::GEOMETRY_SHADER: 8156 shader_template = geometry_shader_template; 8157 break; 8158 case Utils::TESS_CTRL_SHADER: 8159 shader_template = tess_ctrl_shader_template; 8160 break; 8161 case Utils::TESS_EVAL_SHADER: 8162 shader_template = tess_eval_shader_template; 8163 break; 8164 case Utils::VERTEX_SHADER: 8165 shader_template = vertex_shader_template; 8166 break; 8167 default: 8168 TCU_FAIL("Invalid enum"); 8169 break; 8170 } 8171 8172 out_source.m_parts[0].m_code = shader_template; 8173 8174 size_t position = 0; 8175 8176 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 8177 out_source.m_parts[0].m_code); 8178 8179 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 8180 8181 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 8182 8183 Utils::replaceAllTokens("UNI_VEGETA", uni_vegeta, out_source.m_parts[0].m_code); 8184 8185 Utils::replaceAllTokens("UNI_CHILDREN", uni_children, out_source.m_parts[0].m_code); 8186 } 8187 8188 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 8189 * 8190 * @param program Current program 8191 **/ 8192 void BindingUniformBlocksTest::prepareUniforms(Utils::program& program) 8193 { 8194 (void)program; 8195 static const GLfloat goku_data[4] = { 1.0f, 0.0f, 0.0f, 0.0f }; 8196 static const GLfloat vegeta_data[3] = { 0.0f, 1.0f, 0.0f }; 8197 static const GLfloat children_data[8] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; 8198 8199 m_goku_buffer.generate(GL_UNIFORM_BUFFER); 8200 m_vegeta_buffer.generate(GL_UNIFORM_BUFFER); 8201 m_children_buffer.generate(GL_UNIFORM_BUFFER); 8202 8203 m_goku_buffer.update(sizeof(goku_data), (GLvoid*)goku_data, GL_STATIC_DRAW); 8204 m_vegeta_buffer.update(sizeof(vegeta_data), (GLvoid*)vegeta_data, GL_STATIC_DRAW); 8205 m_children_buffer.update(sizeof(children_data), (GLvoid*)children_data, GL_STATIC_DRAW); 8206 8207 m_goku_buffer.bindRange(0 /* index */, 0 /* offset */, sizeof(goku_data)); 8208 m_vegeta_buffer.bindRange(1 /* index */, 0 /* offset */, sizeof(vegeta_data)); 8209 m_children_buffer.bindRange(3 /* index */, 0 /* offset */, sizeof(children_data)); 8210 } 8211 8212 /** Overwrite of releaseResource method, release extra uniform buffer 8213 * 8214 * @param ignored 8215 **/ 8216 void BindingUniformBlocksTest::releaseResource() 8217 { 8218 m_goku_buffer.release(); 8219 m_vegeta_buffer.release(); 8220 m_children_buffer.release(); 8221 } 8222 8223 /** Constructor 8224 * 8225 * @param context Test context 8226 **/ 8227 BindingUniformSingleBlockTest::BindingUniformSingleBlockTest(deqp::Context& context) 8228 : GLSLTestBase(context, "binding_uniform_single_block", "Test verifies uniform block binding") 8229 , m_goku_buffer(context) 8230 { 8231 /* Nothing to be done here */ 8232 } 8233 8234 /** Set up next test case 8235 * 8236 * @param test_case_index Index of next test case 8237 * 8238 * @return false if there is no more test cases, true otherwise 8239 **/ 8240 bool BindingUniformSingleBlockTest::prepareNextTestCase(glw::GLuint test_case_index) 8241 { 8242 switch (test_case_index) 8243 { 8244 case (glw::GLuint)-1: 8245 case 0: 8246 m_test_stage = Utils::VERTEX_SHADER; 8247 break; 8248 case 1: 8249 m_test_stage = Utils::TESS_CTRL_SHADER; 8250 break; 8251 case 2: 8252 m_test_stage = Utils::TESS_EVAL_SHADER; 8253 break; 8254 case 3: 8255 m_test_stage = Utils::GEOMETRY_SHADER; 8256 break; 8257 case 4: 8258 m_test_stage = Utils::FRAGMENT_SHADER; 8259 break; 8260 default: 8261 return false; 8262 break; 8263 } 8264 8265 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Tested stage: " 8266 << Utils::getShaderStageName((Utils::SHADER_STAGES)m_test_stage) 8267 << tcu::TestLog::EndMessage; 8268 8269 return true; 8270 } 8271 8272 /** Prepare source for given shader stage 8273 * 8274 * @param in_stage Shader stage, compute shader will use 430 8275 * @param in_use_version_400 Select if 400 or 420 should be used 8276 * @param out_source Prepared shader source instance 8277 **/ 8278 void BindingUniformSingleBlockTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 8279 Utils::shaderSource& out_source) 8280 { 8281 static const GLchar* uni_goku_with_binding = "layout(std140, binding = 0) uniform GOKU {\n" 8282 " vec4 gohan;\n" 8283 " vec4 goten;\n" 8284 "} goku;\n"; 8285 8286 static const GLchar* uni_goku_no_binding = "layout(std140) uniform GOKU {\n" 8287 " vec4 gohan;\n" 8288 " vec4 goten;\n" 8289 "} goku;\n"; 8290 8291 static const GLchar* verification_snippet = " if ((vec4(1, 0, 0, 0) != goku.gohan) ||\n" 8292 " (vec4(0, 1, 0, 0) != goku.goten) )\n" 8293 " {\n" 8294 " result = vec4(1, 0, 0, 1);\n" 8295 " }\n"; 8296 8297 static const GLchar* compute_shader_template = 8298 "VERSION\n" 8299 "\n" 8300 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 8301 "\n" 8302 "writeonly uniform image2D uni_image;\n" 8303 "\n" 8304 "UNI_GOKU\n" 8305 "\n" 8306 "void main()\n" 8307 "{\n" 8308 " vec4 result = vec4(0, 1, 0, 1);\n" 8309 "\n" 8310 "VERIFICATION" 8311 "\n" 8312 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 8313 "}\n" 8314 "\n"; 8315 8316 static const GLchar* fragment_shader_template = "VERSION\n" 8317 "\n" 8318 "in vec4 gs_fs_result;\n" 8319 "out vec4 fs_out_result;\n" 8320 "\n" 8321 "UNI_GOKU\n" 8322 "\n" 8323 "void main()\n" 8324 "{\n" 8325 " vec4 result = vec4(0, 1, 0, 1);\n" 8326 "\n" 8327 "VERIFICATION" 8328 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 8329 " {\n" 8330 " result = vec4(1, 0, 0, 1);\n" 8331 " }\n" 8332 "\n" 8333 " fs_out_result = result;\n" 8334 "}\n" 8335 "\n"; 8336 8337 static const GLchar* geometry_shader_template = "VERSION\n" 8338 "\n" 8339 "layout(points) in;\n" 8340 "layout(triangle_strip, max_vertices = 4) out;\n" 8341 "\n" 8342 "in vec4 tes_gs_result[];\n" 8343 "out vec4 gs_fs_result;\n" 8344 "\n" 8345 "UNI_GOKU\n" 8346 "\n" 8347 "void main()\n" 8348 "{\n" 8349 " vec4 result = vec4(0, 1, 0, 1);\n" 8350 "\n" 8351 "VERIFICATION" 8352 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 8353 " {\n" 8354 " result = vec4(1, 0, 0, 1);\n" 8355 " }\n" 8356 "\n" 8357 " gs_fs_result = result;\n" 8358 " gl_Position = vec4(-1, -1, 0, 1);\n" 8359 " EmitVertex();\n" 8360 " gs_fs_result = result;\n" 8361 " gl_Position = vec4(-1, 1, 0, 1);\n" 8362 " EmitVertex();\n" 8363 " gs_fs_result = result;\n" 8364 " gl_Position = vec4(1, -1, 0, 1);\n" 8365 " EmitVertex();\n" 8366 " gs_fs_result = result;\n" 8367 " gl_Position = vec4(1, 1, 0, 1);\n" 8368 " EmitVertex();\n" 8369 "}\n" 8370 "\n"; 8371 8372 static const GLchar* tess_ctrl_shader_template = 8373 "VERSION\n" 8374 "\n" 8375 "layout(vertices = 1) out;\n" 8376 "\n" 8377 "in vec4 vs_tcs_result[];\n" 8378 "out vec4 tcs_tes_result[];\n" 8379 "\n" 8380 "UNI_GOKU\n" 8381 "\n" 8382 "void main()\n" 8383 "{\n" 8384 " vec4 result = vec4(0, 1, 0, 1);\n" 8385 "\n" 8386 "VERIFICATION" 8387 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 8388 " {\n" 8389 " result = vec4(1, 0, 0, 1);\n" 8390 " }\n" 8391 "\n" 8392 " tcs_tes_result[gl_InvocationID] = result;\n" 8393 "\n" 8394 " gl_TessLevelOuter[0] = 1.0;\n" 8395 " gl_TessLevelOuter[1] = 1.0;\n" 8396 " gl_TessLevelOuter[2] = 1.0;\n" 8397 " gl_TessLevelOuter[3] = 1.0;\n" 8398 " gl_TessLevelInner[0] = 1.0;\n" 8399 " gl_TessLevelInner[1] = 1.0;\n" 8400 "}\n" 8401 "\n"; 8402 8403 static const GLchar* tess_eval_shader_template = "VERSION\n" 8404 "\n" 8405 "layout(isolines, point_mode) in;\n" 8406 "\n" 8407 "in vec4 tcs_tes_result[];\n" 8408 "out vec4 tes_gs_result;\n" 8409 "\n" 8410 "UNI_GOKU\n" 8411 "\n" 8412 "void main()\n" 8413 "{\n" 8414 " vec4 result = vec4(0, 1, 0, 1);\n" 8415 "\n" 8416 "VERIFICATION" 8417 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 8418 " {\n" 8419 " result = vec4(1, 0, 0, 1);\n" 8420 " }\n" 8421 "\n" 8422 " tes_gs_result = result;\n" 8423 "}\n" 8424 "\n"; 8425 8426 static const GLchar* vertex_shader_template = "VERSION\n" 8427 "\n" 8428 "out vec4 vs_tcs_result;\n" 8429 "\n" 8430 "UNI_GOKU\n" 8431 "\n" 8432 "void main()\n" 8433 "{\n" 8434 " vec4 result = vec4(0, 1, 0, 1);\n" 8435 "\n" 8436 "VERIFICATION" 8437 "\n" 8438 " vs_tcs_result = result;\n" 8439 "}\n" 8440 "\n"; 8441 8442 const GLchar* shader_template = 0; 8443 const GLchar* uniform_definition = uni_goku_no_binding; 8444 8445 switch (in_stage) 8446 { 8447 case Utils::COMPUTE_SHADER: 8448 shader_template = compute_shader_template; 8449 uniform_definition = uni_goku_with_binding; 8450 break; 8451 case Utils::FRAGMENT_SHADER: 8452 shader_template = fragment_shader_template; 8453 break; 8454 case Utils::GEOMETRY_SHADER: 8455 shader_template = geometry_shader_template; 8456 break; 8457 case Utils::TESS_CTRL_SHADER: 8458 shader_template = tess_ctrl_shader_template; 8459 break; 8460 case Utils::TESS_EVAL_SHADER: 8461 shader_template = tess_eval_shader_template; 8462 break; 8463 case Utils::VERTEX_SHADER: 8464 shader_template = vertex_shader_template; 8465 break; 8466 default: 8467 TCU_FAIL("Invalid enum"); 8468 break; 8469 } 8470 8471 if (in_stage == m_test_stage) 8472 { 8473 uniform_definition = uni_goku_with_binding; 8474 } 8475 8476 out_source.m_parts[0].m_code = shader_template; 8477 8478 size_t position = 0; 8479 8480 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 8481 out_source.m_parts[0].m_code); 8482 8483 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 8484 8485 Utils::replaceAllTokens("UNI_GOKU", uniform_definition, out_source.m_parts[0].m_code); 8486 } 8487 8488 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 8489 * 8490 * @param program Current program 8491 **/ 8492 void BindingUniformSingleBlockTest::prepareUniforms(Utils::program& program) 8493 { 8494 (void)program; 8495 static const GLfloat goku_data[8] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; 8496 8497 m_goku_buffer.generate(GL_UNIFORM_BUFFER); 8498 8499 m_goku_buffer.update(sizeof(goku_data), (GLvoid*)goku_data, GL_STATIC_DRAW); 8500 8501 m_goku_buffer.bindRange(0 /* index */, 0 /* offset */, sizeof(goku_data)); 8502 } 8503 8504 /** Overwrite of releaseResource method, release extra uniform buffer 8505 * 8506 * @param ignored 8507 **/ 8508 void BindingUniformSingleBlockTest::releaseResource() 8509 { 8510 m_goku_buffer.release(); 8511 } 8512 8513 /** Constructor 8514 * 8515 * @param context Test context 8516 **/ 8517 BindingUniformBlockArrayTest::BindingUniformBlockArrayTest(deqp::Context& context) 8518 : GLSLTestBase(context, "binding_uniform_block_array", "Test verifies binding of uniform block arrays") 8519 , m_goku_00_buffer(context) 8520 , m_goku_01_buffer(context) 8521 , m_goku_02_buffer(context) 8522 , m_goku_03_buffer(context) 8523 , m_goku_04_buffer(context) 8524 , m_goku_05_buffer(context) 8525 , m_goku_06_buffer(context) 8526 , m_goku_07_buffer(context) 8527 , m_goku_08_buffer(context) 8528 , m_goku_09_buffer(context) 8529 , m_goku_10_buffer(context) 8530 , m_goku_11_buffer(context) 8531 , m_goku_12_buffer(context) 8532 , m_goku_13_buffer(context) 8533 { 8534 /* Nothing to be done here */ 8535 } 8536 8537 /** Prepare source for given shader stage 8538 * 8539 * @param in_stage Shader stage, compute shader will use 430 8540 * @param in_use_version_400 Select if 400 or 420 should be used 8541 * @param out_source Prepared shader source instance 8542 **/ 8543 void BindingUniformBlockArrayTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 8544 Utils::shaderSource& out_source) 8545 { 8546 static const GLchar* uni_goku = "layout(std140, binding = 2) uniform GOKU {\n" 8547 " vec4 gohan;\n" 8548 " vec4 goten;\n" 8549 "} goku[14];\n"; 8550 8551 static const GLchar* verification_snippet = " if ((vec4(0, 0, 0, 0) != goku[0].gohan) ||\n" 8552 " (vec4(0, 0, 0, 1) != goku[0].goten) ||\n" 8553 " (vec4(0, 0, 1, 0) != goku[1].gohan) ||\n" 8554 " (vec4(0, 0, 1, 1) != goku[1].goten) ||\n" 8555 " (vec4(0, 1, 0, 0) != goku[2].gohan) ||\n" 8556 " (vec4(0, 1, 0, 1) != goku[2].goten) ||\n" 8557 " (vec4(0, 1, 1, 0) != goku[3].gohan) ||\n" 8558 " (vec4(0, 1, 1, 1) != goku[3].goten) ||\n" 8559 " (vec4(1, 0, 0, 0) != goku[4].gohan) ||\n" 8560 " (vec4(1, 0, 0, 1) != goku[4].goten) ||\n" 8561 " (vec4(1, 0, 1, 0) != goku[5].gohan) ||\n" 8562 " (vec4(1, 0, 1, 1) != goku[5].goten) ||\n" 8563 " (vec4(1, 1, 0, 0) != goku[6].gohan) ||\n" 8564 " (vec4(1, 1, 0, 1) != goku[6].goten) ||\n" 8565 " (vec4(1, 1, 1, 0) != goku[7].gohan) ||\n" 8566 " (vec4(1, 1, 1, 1) != goku[7].goten) ||\n" 8567 " (vec4(0, 0, 0, 0) != goku[8].gohan) ||\n" 8568 " (vec4(0, 0, 0, 1) != goku[8].goten) ||\n" 8569 " (vec4(0, 0, 1, 0) != goku[9].gohan) ||\n" 8570 " (vec4(0, 0, 1, 1) != goku[9].goten) ||\n" 8571 " (vec4(0, 1, 0, 0) != goku[10].gohan) ||\n" 8572 " (vec4(0, 1, 0, 1) != goku[10].goten) ||\n" 8573 " (vec4(0, 1, 1, 0) != goku[11].gohan) ||\n" 8574 " (vec4(0, 1, 1, 1) != goku[11].goten) ||\n" 8575 " (vec4(1, 0, 0, 0) != goku[12].gohan) ||\n" 8576 " (vec4(1, 0, 0, 1) != goku[12].goten) ||\n" 8577 " (vec4(1, 0, 1, 0) != goku[13].gohan) ||\n" 8578 " (vec4(1, 0, 1, 1) != goku[13].goten) )\n" 8579 " {\n" 8580 " result = vec4(1, 0, 0, 1);\n" 8581 " }\n"; 8582 8583 static const GLchar* compute_shader_template = 8584 "VERSION\n" 8585 "\n" 8586 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 8587 "\n" 8588 "writeonly uniform image2D uni_image;\n" 8589 "\n" 8590 "UNI_GOKU\n" 8591 "\n" 8592 "void main()\n" 8593 "{\n" 8594 " vec4 result = vec4(0, 1, 0, 1);\n" 8595 "\n" 8596 "VERIFICATION" 8597 "\n" 8598 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 8599 "}\n" 8600 "\n"; 8601 8602 static const GLchar* fragment_shader_template = "VERSION\n" 8603 "\n" 8604 "in vec4 gs_fs_result;\n" 8605 "out vec4 fs_out_result;\n" 8606 "\n" 8607 "UNI_GOKU\n" 8608 "\n" 8609 "void main()\n" 8610 "{\n" 8611 " vec4 result = vec4(0, 1, 0, 1);\n" 8612 "\n" 8613 "VERIFICATION" 8614 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 8615 " {\n" 8616 " result = vec4(1, 0, 0, 1);\n" 8617 " }\n" 8618 "\n" 8619 " fs_out_result = result;\n" 8620 "}\n" 8621 "\n"; 8622 8623 static const GLchar* geometry_shader_template = "VERSION\n" 8624 "\n" 8625 "layout(points) in;\n" 8626 "layout(triangle_strip, max_vertices = 4) out;\n" 8627 "\n" 8628 "in vec4 tes_gs_result[];\n" 8629 "out vec4 gs_fs_result;\n" 8630 "\n" 8631 "UNI_GOKU\n" 8632 "\n" 8633 "void main()\n" 8634 "{\n" 8635 " vec4 result = vec4(0, 1, 0, 1);\n" 8636 "\n" 8637 "VERIFICATION" 8638 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 8639 " {\n" 8640 " result = vec4(1, 0, 0, 1);\n" 8641 " }\n" 8642 "\n" 8643 " gs_fs_result = result;\n" 8644 " gl_Position = vec4(-1, -1, 0, 1);\n" 8645 " EmitVertex();\n" 8646 " gs_fs_result = result;\n" 8647 " gl_Position = vec4(-1, 1, 0, 1);\n" 8648 " EmitVertex();\n" 8649 " gs_fs_result = result;\n" 8650 " gl_Position = vec4(1, -1, 0, 1);\n" 8651 " EmitVertex();\n" 8652 " gs_fs_result = result;\n" 8653 " gl_Position = vec4(1, 1, 0, 1);\n" 8654 " EmitVertex();\n" 8655 "}\n" 8656 "\n"; 8657 8658 static const GLchar* tess_ctrl_shader_template = 8659 "VERSION\n" 8660 "\n" 8661 "layout(vertices = 1) out;\n" 8662 "\n" 8663 "in vec4 vs_tcs_result[];\n" 8664 "out vec4 tcs_tes_result[];\n" 8665 "\n" 8666 "UNI_GOKU\n" 8667 "\n" 8668 "void main()\n" 8669 "{\n" 8670 " vec4 result = vec4(0, 1, 0, 1);\n" 8671 "\n" 8672 "VERIFICATION" 8673 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 8674 " {\n" 8675 " result = vec4(1, 0, 0, 1);\n" 8676 " }\n" 8677 "\n" 8678 " tcs_tes_result[gl_InvocationID] = result;\n" 8679 "\n" 8680 " gl_TessLevelOuter[0] = 1.0;\n" 8681 " gl_TessLevelOuter[1] = 1.0;\n" 8682 " gl_TessLevelOuter[2] = 1.0;\n" 8683 " gl_TessLevelOuter[3] = 1.0;\n" 8684 " gl_TessLevelInner[0] = 1.0;\n" 8685 " gl_TessLevelInner[1] = 1.0;\n" 8686 "}\n" 8687 "\n"; 8688 8689 static const GLchar* tess_eval_shader_template = "VERSION\n" 8690 "\n" 8691 "layout(isolines, point_mode) in;\n" 8692 "\n" 8693 "in vec4 tcs_tes_result[];\n" 8694 "out vec4 tes_gs_result;\n" 8695 "\n" 8696 "UNI_GOKU\n" 8697 "\n" 8698 "void main()\n" 8699 "{\n" 8700 " vec4 result = vec4(0, 1, 0, 1);\n" 8701 "\n" 8702 "VERIFICATION" 8703 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 8704 " {\n" 8705 " result = vec4(1, 0, 0, 1);\n" 8706 " }\n" 8707 "\n" 8708 " tes_gs_result = result;\n" 8709 "}\n" 8710 "\n"; 8711 8712 static const GLchar* vertex_shader_template = "VERSION\n" 8713 "\n" 8714 "out vec4 vs_tcs_result;\n" 8715 "\n" 8716 "UNI_GOKU\n" 8717 "\n" 8718 "void main()\n" 8719 "{\n" 8720 " vec4 result = vec4(0, 1, 0, 1);\n" 8721 "\n" 8722 "VERIFICATION" 8723 "\n" 8724 " vs_tcs_result = result;\n" 8725 "}\n" 8726 "\n"; 8727 8728 const GLchar* shader_template = 0; 8729 8730 switch (in_stage) 8731 { 8732 case Utils::COMPUTE_SHADER: 8733 shader_template = compute_shader_template; 8734 break; 8735 case Utils::FRAGMENT_SHADER: 8736 shader_template = fragment_shader_template; 8737 break; 8738 case Utils::GEOMETRY_SHADER: 8739 shader_template = geometry_shader_template; 8740 break; 8741 case Utils::TESS_CTRL_SHADER: 8742 shader_template = tess_ctrl_shader_template; 8743 break; 8744 case Utils::TESS_EVAL_SHADER: 8745 shader_template = tess_eval_shader_template; 8746 break; 8747 case Utils::VERTEX_SHADER: 8748 shader_template = vertex_shader_template; 8749 break; 8750 default: 8751 TCU_FAIL("Invalid enum"); 8752 break; 8753 } 8754 8755 out_source.m_parts[0].m_code = shader_template; 8756 8757 size_t position = 0; 8758 8759 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 8760 out_source.m_parts[0].m_code); 8761 8762 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 8763 8764 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 8765 } 8766 8767 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 8768 * 8769 * @param program Current program 8770 **/ 8771 void BindingUniformBlockArrayTest::prepareUniforms(Utils::program& program) 8772 { 8773 static const GLfloat goku_data[][8] = { 8774 { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f }, 8775 { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, 8776 { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f }, 8777 { 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f }, 8778 { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f }, 8779 { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }, 8780 { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f } 8781 }; 8782 8783 Utils::buffer* buffers[14] = { &m_goku_00_buffer, &m_goku_01_buffer, &m_goku_02_buffer, &m_goku_03_buffer, 8784 &m_goku_04_buffer, &m_goku_05_buffer, &m_goku_06_buffer, &m_goku_07_buffer, 8785 &m_goku_08_buffer, &m_goku_09_buffer, &m_goku_10_buffer, &m_goku_11_buffer, 8786 &m_goku_12_buffer, &m_goku_13_buffer }; 8787 8788 for (GLuint i = 0; i < 14; ++i) 8789 { 8790 checkBinding(program, i, i + 2); 8791 8792 buffers[i]->generate(GL_UNIFORM_BUFFER); 8793 buffers[i]->update(sizeof(GLfloat) * 8, (GLvoid*)goku_data[i], GL_STATIC_DRAW); 8794 buffers[i]->bindRange(i + 2 /* index */, 0 /* offset */, sizeof(GLfloat) * 8); 8795 } 8796 } 8797 8798 /** Overwrite of releaseResource method, release extra uniform buffer 8799 * 8800 * @param ignored 8801 **/ 8802 void BindingUniformBlockArrayTest::releaseResource() 8803 { 8804 Utils::buffer* buffers[14] = { &m_goku_00_buffer, &m_goku_01_buffer, &m_goku_02_buffer, &m_goku_03_buffer, 8805 &m_goku_04_buffer, &m_goku_05_buffer, &m_goku_06_buffer, &m_goku_07_buffer, 8806 &m_goku_08_buffer, &m_goku_09_buffer, &m_goku_10_buffer, &m_goku_11_buffer, 8807 &m_goku_12_buffer, &m_goku_13_buffer }; 8808 8809 for (GLuint i = 0; i < 14; ++i) 8810 { 8811 buffers[i]->release(); 8812 } 8813 } 8814 8815 /** Verifies that API reports correct uniform binding 8816 * 8817 * @param program Program 8818 * @param index Index of array element 8819 * @param expected_binding Expected binding 8820 **/ 8821 void BindingUniformBlockArrayTest::checkBinding(Utils::program& program, glw::GLuint index, glw::GLint expected_binding) 8822 { 8823 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 8824 8825 GLchar buffer[64]; 8826 sprintf(buffer, "GOKU[%d]", index); 8827 8828 const GLuint uniform_index = gl.getUniformBlockIndex(program.m_program_object_id, buffer); 8829 GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformBlockIndex"); 8830 if (GL_INVALID_INDEX == uniform_index) 8831 { 8832 TCU_FAIL("Uniform block is inactive"); 8833 } 8834 8835 GLint binding = -1; 8836 8837 gl.getActiveUniformBlockiv(program.m_program_object_id, uniform_index, GL_UNIFORM_BLOCK_BINDING, &binding); 8838 GLU_EXPECT_NO_ERROR(gl.getError(), "GetActiveUniformBlockiv"); 8839 8840 if (expected_binding != binding) 8841 { 8842 TCU_FAIL("Wrong binding reported by API"); 8843 } 8844 } 8845 8846 /** Constructor 8847 * 8848 * @param context Test context 8849 **/ 8850 BindingUniformDefaultTest::BindingUniformDefaultTest(deqp::Context& context) 8851 : APITestBase(context, "binding_uniform_default", "Test verifies default binding of uniform block") 8852 { 8853 /* Nothing to be done here */ 8854 } 8855 8856 /** Execute API call and verifies results 8857 * 8858 * @return true when results are positive, false otherwise 8859 **/ 8860 bool BindingUniformDefaultTest::checkResults(Utils::program& program) 8861 { 8862 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 8863 8864 const GLuint index = gl.getUniformBlockIndex(program.m_program_object_id, "GOKU"); 8865 GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformBlockIndex"); 8866 if (GL_INVALID_INDEX == index) 8867 { 8868 TCU_FAIL("Uniform block is inactive"); 8869 return false; 8870 } 8871 8872 GLint binding = -1; 8873 8874 gl.getActiveUniformBlockiv(program.m_program_object_id, index, GL_UNIFORM_BLOCK_BINDING, &binding); 8875 GLU_EXPECT_NO_ERROR(gl.getError(), "GetActiveUniformBlockiv"); 8876 8877 if (0 != binding) 8878 { 8879 return false; 8880 } 8881 8882 return true; 8883 } 8884 8885 /** Prepare source for given shader stage 8886 * 8887 * @param in_stage Shader stage, compute shader will use 430 8888 * @param in_use_version_400 Select if 400 or 420 should be used 8889 * @param out_source Prepared shader source instance 8890 **/ 8891 void BindingUniformDefaultTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 8892 Utils::shaderSource& out_source) 8893 { 8894 static const GLchar* uni_goku = "layout(std140) uniform GOKU {\n" 8895 " vec4 gohan;\n" 8896 " vec4 goten;\n" 8897 "} goku;\n"; 8898 8899 static const GLchar* verification_snippet = " if ((vec4(0, 0, 0, 0) != goku.gohan) ||\n" 8900 " (vec4(0, 0, 0, 1) != goku.goten) )\n" 8901 " {\n" 8902 " result = vec4(1, 0, 0, 1);\n" 8903 " }\n"; 8904 8905 static const GLchar* compute_shader_template = 8906 "VERSION\n" 8907 "\n" 8908 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 8909 "\n" 8910 "writeonly uniform image2D uni_image;\n" 8911 "\n" 8912 "UNI_GOKU\n" 8913 "\n" 8914 "void main()\n" 8915 "{\n" 8916 " vec4 result = vec4(0, 1, 0, 1);\n" 8917 "\n" 8918 "VERIFICATION" 8919 "\n" 8920 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 8921 "}\n" 8922 "\n"; 8923 8924 static const GLchar* fragment_shader_template = "VERSION\n" 8925 "\n" 8926 "in vec4 gs_fs_result;\n" 8927 "out vec4 fs_out_result;\n" 8928 "\n" 8929 "UNI_GOKU\n" 8930 "\n" 8931 "void main()\n" 8932 "{\n" 8933 " vec4 result = vec4(0, 1, 0, 1);\n" 8934 "\n" 8935 "VERIFICATION" 8936 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 8937 " {\n" 8938 " result = vec4(1, 0, 0, 1);\n" 8939 " }\n" 8940 "\n" 8941 " fs_out_result = result;\n" 8942 "}\n" 8943 "\n"; 8944 8945 static const GLchar* geometry_shader_template = "VERSION\n" 8946 "\n" 8947 "layout(points) in;\n" 8948 "layout(triangle_strip, max_vertices = 4) out;\n" 8949 "\n" 8950 "in vec4 tes_gs_result[];\n" 8951 "out vec4 gs_fs_result;\n" 8952 "\n" 8953 "UNI_GOKU\n" 8954 "\n" 8955 "void main()\n" 8956 "{\n" 8957 " vec4 result = vec4(0, 1, 0, 1);\n" 8958 "\n" 8959 "VERIFICATION" 8960 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 8961 " {\n" 8962 " result = vec4(1, 0, 0, 1);\n" 8963 " }\n" 8964 "\n" 8965 " gs_fs_result = result;\n" 8966 " gl_Position = vec4(-1, -1, 0, 1);\n" 8967 " EmitVertex();\n" 8968 " gs_fs_result = result;\n" 8969 " gl_Position = vec4(-1, 1, 0, 1);\n" 8970 " EmitVertex();\n" 8971 " gs_fs_result = result;\n" 8972 " gl_Position = vec4(1, -1, 0, 1);\n" 8973 " EmitVertex();\n" 8974 " gs_fs_result = result;\n" 8975 " gl_Position = vec4(1, 1, 0, 1);\n" 8976 " EmitVertex();\n" 8977 "}\n" 8978 "\n"; 8979 8980 static const GLchar* tess_ctrl_shader_template = 8981 "VERSION\n" 8982 "\n" 8983 "layout(vertices = 1) out;\n" 8984 "\n" 8985 "in vec4 vs_tcs_result[];\n" 8986 "out vec4 tcs_tes_result[];\n" 8987 "\n" 8988 "UNI_GOKU\n" 8989 "\n" 8990 "void main()\n" 8991 "{\n" 8992 " vec4 result = vec4(0, 1, 0, 1);\n" 8993 "\n" 8994 "VERIFICATION" 8995 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 8996 " {\n" 8997 " result = vec4(1, 0, 0, 1);\n" 8998 " }\n" 8999 "\n" 9000 " tcs_tes_result[gl_InvocationID] = result;\n" 9001 "\n" 9002 " gl_TessLevelOuter[0] = 1.0;\n" 9003 " gl_TessLevelOuter[1] = 1.0;\n" 9004 " gl_TessLevelOuter[2] = 1.0;\n" 9005 " gl_TessLevelOuter[3] = 1.0;\n" 9006 " gl_TessLevelInner[0] = 1.0;\n" 9007 " gl_TessLevelInner[1] = 1.0;\n" 9008 "}\n" 9009 "\n"; 9010 9011 static const GLchar* tess_eval_shader_template = "VERSION\n" 9012 "\n" 9013 "layout(isolines, point_mode) in;\n" 9014 "\n" 9015 "in vec4 tcs_tes_result[];\n" 9016 "out vec4 tes_gs_result;\n" 9017 "\n" 9018 "UNI_GOKU\n" 9019 "\n" 9020 "void main()\n" 9021 "{\n" 9022 " vec4 result = vec4(0, 1, 0, 1);\n" 9023 "\n" 9024 "VERIFICATION" 9025 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 9026 " {\n" 9027 " result = vec4(1, 0, 0, 1);\n" 9028 " }\n" 9029 "\n" 9030 " tes_gs_result = result;\n" 9031 "}\n" 9032 "\n"; 9033 9034 static const GLchar* vertex_shader_template = "VERSION\n" 9035 "\n" 9036 "out vec4 vs_tcs_result;\n" 9037 "\n" 9038 "UNI_GOKU\n" 9039 "\n" 9040 "void main()\n" 9041 "{\n" 9042 " vec4 result = vec4(0, 1, 0, 1);\n" 9043 "\n" 9044 "VERIFICATION" 9045 "\n" 9046 " vs_tcs_result = result;\n" 9047 "}\n" 9048 "\n"; 9049 9050 const GLchar* shader_template = 0; 9051 9052 switch (in_stage) 9053 { 9054 case Utils::COMPUTE_SHADER: 9055 shader_template = compute_shader_template; 9056 break; 9057 case Utils::FRAGMENT_SHADER: 9058 shader_template = fragment_shader_template; 9059 break; 9060 case Utils::GEOMETRY_SHADER: 9061 shader_template = geometry_shader_template; 9062 break; 9063 case Utils::TESS_CTRL_SHADER: 9064 shader_template = tess_ctrl_shader_template; 9065 break; 9066 case Utils::TESS_EVAL_SHADER: 9067 shader_template = tess_eval_shader_template; 9068 break; 9069 case Utils::VERTEX_SHADER: 9070 shader_template = vertex_shader_template; 9071 break; 9072 default: 9073 TCU_FAIL("Invalid enum"); 9074 break; 9075 } 9076 9077 out_source.m_parts[0].m_code = shader_template; 9078 9079 size_t position = 0; 9080 9081 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 9082 out_source.m_parts[0].m_code); 9083 9084 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 9085 9086 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 9087 } 9088 9089 /** Constructor 9090 * 9091 * @param context Test context 9092 **/ 9093 BindingUniformAPIOverirdeTest::BindingUniformAPIOverirdeTest(deqp::Context& context) 9094 : GLSLTestBase(context, "binding_uniform_api_overirde", "Test verifies if binding can be overriden with API") 9095 , m_goku_buffer(context) 9096 { 9097 /* Nothing to be done here */ 9098 } 9099 9100 /** Prepare source for given shader stage 9101 * 9102 * @param in_stage Shader stage, compute shader will use 430 9103 * @param in_use_version_400 Select if 400 or 420 should be used 9104 * @param out_source Prepared shader source instance 9105 **/ 9106 void BindingUniformAPIOverirdeTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 9107 Utils::shaderSource& out_source) 9108 { 9109 static const GLchar* uni_goku = "layout(std140, binding = 2) uniform GOKU {\n" 9110 " vec4 gohan;\n" 9111 " vec4 goten;\n" 9112 "} goku;\n"; 9113 9114 static const GLchar* verification_snippet = " if ((vec4(1, 0, 0, 0) != goku.gohan) ||\n" 9115 " (vec4(0, 1, 0, 0) != goku.goten) )\n" 9116 " {\n" 9117 " result = vec4(1, 0, 0, 1);\n" 9118 " }\n"; 9119 9120 static const GLchar* compute_shader_template = 9121 "VERSION\n" 9122 "\n" 9123 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 9124 "\n" 9125 "writeonly uniform image2D uni_image;\n" 9126 "\n" 9127 "UNI_GOKU\n" 9128 "\n" 9129 "void main()\n" 9130 "{\n" 9131 " vec4 result = vec4(0, 1, 0, 1);\n" 9132 "\n" 9133 "VERIFICATION" 9134 "\n" 9135 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 9136 "}\n" 9137 "\n"; 9138 9139 static const GLchar* fragment_shader_template = "VERSION\n" 9140 "\n" 9141 "in vec4 gs_fs_result;\n" 9142 "out vec4 fs_out_result;\n" 9143 "\n" 9144 "UNI_GOKU\n" 9145 "\n" 9146 "void main()\n" 9147 "{\n" 9148 " vec4 result = vec4(0, 1, 0, 1);\n" 9149 "\n" 9150 "VERIFICATION" 9151 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 9152 " {\n" 9153 " result = vec4(1, 0, 0, 1);\n" 9154 " }\n" 9155 "\n" 9156 " fs_out_result = result;\n" 9157 "}\n" 9158 "\n"; 9159 9160 static const GLchar* geometry_shader_template = "VERSION\n" 9161 "\n" 9162 "layout(points) in;\n" 9163 "layout(triangle_strip, max_vertices = 4) out;\n" 9164 "\n" 9165 "in vec4 tes_gs_result[];\n" 9166 "out vec4 gs_fs_result;\n" 9167 "\n" 9168 "UNI_GOKU\n" 9169 "\n" 9170 "void main()\n" 9171 "{\n" 9172 " vec4 result = vec4(0, 1, 0, 1);\n" 9173 "\n" 9174 "VERIFICATION" 9175 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 9176 " {\n" 9177 " result = vec4(1, 0, 0, 1);\n" 9178 " }\n" 9179 "\n" 9180 " gs_fs_result = result;\n" 9181 " gl_Position = vec4(-1, -1, 0, 1);\n" 9182 " EmitVertex();\n" 9183 " gs_fs_result = result;\n" 9184 " gl_Position = vec4(-1, 1, 0, 1);\n" 9185 " EmitVertex();\n" 9186 " gs_fs_result = result;\n" 9187 " gl_Position = vec4(1, -1, 0, 1);\n" 9188 " EmitVertex();\n" 9189 " gs_fs_result = result;\n" 9190 " gl_Position = vec4(1, 1, 0, 1);\n" 9191 " EmitVertex();\n" 9192 "}\n" 9193 "\n"; 9194 9195 static const GLchar* tess_ctrl_shader_template = 9196 "VERSION\n" 9197 "\n" 9198 "layout(vertices = 1) out;\n" 9199 "\n" 9200 "in vec4 vs_tcs_result[];\n" 9201 "out vec4 tcs_tes_result[];\n" 9202 "\n" 9203 "UNI_GOKU\n" 9204 "\n" 9205 "void main()\n" 9206 "{\n" 9207 " vec4 result = vec4(0, 1, 0, 1);\n" 9208 "\n" 9209 "VERIFICATION" 9210 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 9211 " {\n" 9212 " result = vec4(1, 0, 0, 1);\n" 9213 " }\n" 9214 "\n" 9215 " tcs_tes_result[gl_InvocationID] = result;\n" 9216 "\n" 9217 " gl_TessLevelOuter[0] = 1.0;\n" 9218 " gl_TessLevelOuter[1] = 1.0;\n" 9219 " gl_TessLevelOuter[2] = 1.0;\n" 9220 " gl_TessLevelOuter[3] = 1.0;\n" 9221 " gl_TessLevelInner[0] = 1.0;\n" 9222 " gl_TessLevelInner[1] = 1.0;\n" 9223 "}\n" 9224 "\n"; 9225 9226 static const GLchar* tess_eval_shader_template = "VERSION\n" 9227 "\n" 9228 "layout(isolines, point_mode) in;\n" 9229 "\n" 9230 "in vec4 tcs_tes_result[];\n" 9231 "out vec4 tes_gs_result;\n" 9232 "\n" 9233 "UNI_GOKU\n" 9234 "\n" 9235 "void main()\n" 9236 "{\n" 9237 " vec4 result = vec4(0, 1, 0, 1);\n" 9238 "\n" 9239 "VERIFICATION" 9240 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 9241 " {\n" 9242 " result = vec4(1, 0, 0, 1);\n" 9243 " }\n" 9244 "\n" 9245 " tes_gs_result = result;\n" 9246 "}\n" 9247 "\n"; 9248 9249 static const GLchar* vertex_shader_template = "VERSION\n" 9250 "\n" 9251 "out vec4 vs_tcs_result;\n" 9252 "\n" 9253 "UNI_GOKU\n" 9254 "\n" 9255 "void main()\n" 9256 "{\n" 9257 " vec4 result = vec4(0, 1, 0, 1);\n" 9258 "\n" 9259 "VERIFICATION" 9260 "\n" 9261 " vs_tcs_result = result;\n" 9262 "}\n" 9263 "\n"; 9264 9265 const GLchar* shader_template = 0; 9266 9267 switch (in_stage) 9268 { 9269 case Utils::COMPUTE_SHADER: 9270 shader_template = compute_shader_template; 9271 break; 9272 case Utils::FRAGMENT_SHADER: 9273 shader_template = fragment_shader_template; 9274 break; 9275 case Utils::GEOMETRY_SHADER: 9276 shader_template = geometry_shader_template; 9277 break; 9278 case Utils::TESS_CTRL_SHADER: 9279 shader_template = tess_ctrl_shader_template; 9280 break; 9281 case Utils::TESS_EVAL_SHADER: 9282 shader_template = tess_eval_shader_template; 9283 break; 9284 case Utils::VERTEX_SHADER: 9285 shader_template = vertex_shader_template; 9286 break; 9287 default: 9288 TCU_FAIL("Invalid enum"); 9289 break; 9290 } 9291 9292 out_source.m_parts[0].m_code = shader_template; 9293 9294 size_t position = 0; 9295 9296 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 9297 out_source.m_parts[0].m_code); 9298 9299 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 9300 9301 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 9302 } 9303 9304 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 9305 * 9306 * @param program Current program 9307 **/ 9308 void BindingUniformAPIOverirdeTest::prepareUniforms(Utils::program& program) 9309 { 9310 static const GLfloat goku_data[8] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }; 9311 9312 static const GLuint new_binding = 11; 9313 9314 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 9315 9316 const GLuint index = gl.getUniformBlockIndex(program.m_program_object_id, "GOKU"); 9317 GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformBlockIndex"); 9318 if (GL_INVALID_INDEX == index) 9319 { 9320 TCU_FAIL("Uniform block is inactive"); 9321 return; 9322 } 9323 9324 gl.uniformBlockBinding(program.m_program_object_id, index, new_binding); 9325 GLU_EXPECT_NO_ERROR(gl.getError(), "UniformBlockBinding"); 9326 9327 GLint binding = -1; 9328 9329 gl.getActiveUniformBlockiv(program.m_program_object_id, index, GL_UNIFORM_BLOCK_BINDING, &binding); 9330 GLU_EXPECT_NO_ERROR(gl.getError(), "GetActiveUniformBlockiv"); 9331 9332 if (new_binding != binding) 9333 { 9334 TCU_FAIL("GetActiveUniformBlockiv returned wrong binding"); 9335 return; 9336 } 9337 9338 m_goku_buffer.generate(GL_UNIFORM_BUFFER); 9339 m_goku_buffer.update(sizeof(GLfloat) * 8, (GLvoid*)goku_data, GL_STATIC_DRAW); 9340 m_goku_buffer.bindRange(new_binding /* index */, 0 /* offset */, sizeof(GLfloat) * 8); 9341 } 9342 9343 /** Overwrite of releaseResource method, release extra uniform buffer 9344 * 9345 * @param ignored 9346 **/ 9347 void BindingUniformAPIOverirdeTest::releaseResource() 9348 { 9349 m_goku_buffer.release(); 9350 } 9351 9352 /** Constructor 9353 * 9354 * @param context Test context 9355 **/ 9356 BindingUniformGlobalBlockTest::BindingUniformGlobalBlockTest(deqp::Context& context) 9357 : NegativeTestBase(context, "binding_uniform_global_block", 9358 "Test verifies that global uniform cannot be qualified with binding") 9359 { 9360 /* Nothing to be done here */ 9361 } 9362 9363 /** Prepare source for given shader stage 9364 * 9365 * @param in_stage Shader stage, compute shader will use 430 9366 * @param in_use_version_400 Select if 400 or 420 should be used 9367 * @param out_source Prepared shader source instance 9368 **/ 9369 void BindingUniformGlobalBlockTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 9370 Utils::shaderSource& out_source) 9371 { 9372 static const GLchar* verification_snippet = " if (vec4(0, 0, 1, 1) != uni_test)\n" 9373 " {\n" 9374 " result = vec4(1, 0, 0, 1);\n" 9375 " }\n"; 9376 9377 static const GLchar* uniform_definition = "layout(binding = 0) uniform vec4 uni_test;\n"; 9378 9379 static const GLchar* compute_shader_template = 9380 "VERSION\n" 9381 "\n" 9382 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 9383 "\n" 9384 "writeonly uniform image2D uni_image;\n" 9385 "\n" 9386 "UNIFORM_DEFINITION\n" 9387 "\n" 9388 "void main()\n" 9389 "{\n" 9390 " vec4 result = vec4(0, 1, 0, 1);\n" 9391 "\n" 9392 "VERIFICATION" 9393 "\n" 9394 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 9395 "}\n" 9396 "\n"; 9397 9398 static const GLchar* fragment_shader_template = "VERSION\n" 9399 "\n" 9400 "in vec4 gs_fs_result;\n" 9401 "out vec4 fs_out_result;\n" 9402 "\n" 9403 "UNIFORM_DEFINITION\n" 9404 "\n" 9405 "void main()\n" 9406 "{\n" 9407 " vec4 result = vec4(0, 1, 0, 1);\n" 9408 "\n" 9409 "VERIFICATION" 9410 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 9411 " {\n" 9412 " result = vec4(1, 0, 0, 1);\n" 9413 " }\n" 9414 "\n" 9415 " fs_out_result = result;\n" 9416 "}\n" 9417 "\n"; 9418 9419 static const GLchar* geometry_shader_template = "VERSION\n" 9420 "\n" 9421 "layout(points) in;\n" 9422 "layout(triangle_strip, max_vertices = 4) out;\n" 9423 "\n" 9424 "in vec4 tes_gs_result[];\n" 9425 "out vec4 gs_fs_result;\n" 9426 "\n" 9427 "UNIFORM_DEFINITION\n" 9428 "\n" 9429 "void main()\n" 9430 "{\n" 9431 " vec4 result = vec4(0, 1, 0, 1);\n" 9432 "\n" 9433 "VERIFICATION" 9434 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 9435 " {\n" 9436 " result = vec4(1, 0, 0, 1);\n" 9437 " }\n" 9438 "\n" 9439 " gs_fs_result = result;\n" 9440 " gl_Position = vec4(-1, -1, 0, 1);\n" 9441 " EmitVertex();\n" 9442 " gs_fs_result = result;\n" 9443 " gl_Position = vec4(-1, 1, 0, 1);\n" 9444 " EmitVertex();\n" 9445 " gs_fs_result = result;\n" 9446 " gl_Position = vec4(1, -1, 0, 1);\n" 9447 " EmitVertex();\n" 9448 " gs_fs_result = result;\n" 9449 " gl_Position = vec4(1, 1, 0, 1);\n" 9450 " EmitVertex();\n" 9451 "}\n" 9452 "\n"; 9453 9454 static const GLchar* tess_ctrl_shader_template = 9455 "VERSION\n" 9456 "\n" 9457 "layout(vertices = 1) out;\n" 9458 "\n" 9459 "in vec4 vs_tcs_result[];\n" 9460 "out vec4 tcs_tes_result[];\n" 9461 "\n" 9462 "UNIFORM_DEFINITION\n" 9463 "\n" 9464 "void main()\n" 9465 "{\n" 9466 " vec4 result = vec4(0, 1, 0, 1);\n" 9467 "\n" 9468 "VERIFICATION" 9469 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 9470 " {\n" 9471 " result = vec4(1, 0, 0, 1);\n" 9472 " }\n" 9473 "\n" 9474 " tcs_tes_result[gl_InvocationID] = result;\n" 9475 "\n" 9476 " gl_TessLevelOuter[0] = 1.0;\n" 9477 " gl_TessLevelOuter[1] = 1.0;\n" 9478 " gl_TessLevelOuter[2] = 1.0;\n" 9479 " gl_TessLevelOuter[3] = 1.0;\n" 9480 " gl_TessLevelInner[0] = 1.0;\n" 9481 " gl_TessLevelInner[1] = 1.0;\n" 9482 "}\n" 9483 "\n"; 9484 9485 static const GLchar* tess_eval_shader_template = "VERSION\n" 9486 "\n" 9487 "layout(isolines, point_mode) in;\n" 9488 "\n" 9489 "in vec4 tcs_tes_result[];\n" 9490 "out vec4 tes_gs_result;\n" 9491 "\n" 9492 "UNIFORM_DEFINITION\n" 9493 "\n" 9494 "void main()\n" 9495 "{\n" 9496 " vec4 result = vec4(0, 1, 0, 1);\n" 9497 "\n" 9498 "VERIFICATION" 9499 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 9500 " {\n" 9501 " result = vec4(1, 0, 0, 1);\n" 9502 " }\n" 9503 "\n" 9504 " tes_gs_result = result;\n" 9505 "}\n" 9506 "\n"; 9507 9508 static const GLchar* vertex_shader_template = "VERSION\n" 9509 "\n" 9510 "out vec4 vs_tcs_result;\n" 9511 "\n" 9512 "UNIFORM_DEFINITION\n" 9513 "\n" 9514 "void main()\n" 9515 "{\n" 9516 " vec4 result = vec4(0, 1, 0, 1);\n" 9517 "\n" 9518 "VERIFICATION" 9519 "\n" 9520 " vs_tcs_result = result;\n" 9521 "}\n" 9522 "\n"; 9523 9524 const GLchar* shader_template = 0; 9525 9526 switch (in_stage) 9527 { 9528 case Utils::COMPUTE_SHADER: 9529 shader_template = compute_shader_template; 9530 break; 9531 case Utils::FRAGMENT_SHADER: 9532 shader_template = fragment_shader_template; 9533 break; 9534 case Utils::GEOMETRY_SHADER: 9535 shader_template = geometry_shader_template; 9536 break; 9537 case Utils::TESS_CTRL_SHADER: 9538 shader_template = tess_ctrl_shader_template; 9539 break; 9540 case Utils::TESS_EVAL_SHADER: 9541 shader_template = tess_eval_shader_template; 9542 break; 9543 case Utils::VERTEX_SHADER: 9544 shader_template = vertex_shader_template; 9545 break; 9546 default: 9547 TCU_FAIL("Invalid enum"); 9548 break; 9549 } 9550 9551 out_source.m_parts[0].m_code = shader_template; 9552 9553 size_t position = 0; 9554 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 9555 out_source.m_parts[0].m_code); 9556 9557 Utils::replaceToken("UNIFORM_DEFINITION", position, uniform_definition, out_source.m_parts[0].m_code); 9558 9559 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 9560 } 9561 9562 /** Constructor 9563 * 9564 * @param context Test context 9565 **/ 9566 BindingUniformInvalidTest::BindingUniformInvalidTest(deqp::Context& context) 9567 : NegativeTestBase(context, "binding_uniform_invalid", "Test verifies invalid binding values") 9568 { 9569 /* Nothing to be done here */ 9570 } 9571 9572 /** Set up next test case 9573 * 9574 * @param test_case_index Index of next test case 9575 * 9576 * @return false if there is no more test cases, true otherwise 9577 **/ 9578 bool BindingUniformInvalidTest::prepareNextTestCase(glw::GLuint test_case_index) 9579 { 9580 switch (test_case_index) 9581 { 9582 case (glw::GLuint)-1: 9583 m_case = TEST_CASES_MAX; 9584 break; 9585 case NEGATIVE_VALUE: 9586 case VARIABLE_NAME: 9587 case STD140: 9588 case MISSING: 9589 m_case = (TESTCASES)test_case_index; 9590 break; 9591 default: 9592 return false; 9593 } 9594 9595 return true; 9596 } 9597 9598 /** Prepare source for given shader stage 9599 * 9600 * @param in_stage Shader stage, compute shader will use 430 9601 * @param in_use_version_400 Select if 400 or 420 should be used 9602 * @param out_source Prepared shader source instance 9603 **/ 9604 void BindingUniformInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 9605 Utils::shaderSource& out_source) 9606 { 9607 static const GLchar* verification_snippet = " if (vec4(0, 0, 1, 1) != goku.gohan)\n" 9608 " {\n" 9609 " result = vec4(1, 0, 0, 1);\n" 9610 " }\n"; 9611 9612 static const GLchar* uniform_definition = "layout(std140, binding BINDING) uniform GOKU {\n" 9613 " vec4 gohan;\n" 9614 " vec4 goten;\n" 9615 "} goku;\n"; 9616 9617 static const GLchar* compute_shader_template = 9618 "VERSION\n" 9619 "\n" 9620 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 9621 "\n" 9622 "writeonly uniform image2D uni_image;\n" 9623 "\n" 9624 "UNIFORM_DEFINITION\n" 9625 "\n" 9626 "void main()\n" 9627 "{\n" 9628 " vec4 result = vec4(0, 1, 0, 1);\n" 9629 "\n" 9630 "VERIFICATION" 9631 "\n" 9632 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 9633 "}\n" 9634 "\n"; 9635 9636 static const GLchar* fragment_shader_template = "VERSION\n" 9637 "\n" 9638 "in vec4 gs_fs_result;\n" 9639 "out vec4 fs_out_result;\n" 9640 "\n" 9641 "UNIFORM_DEFINITION\n" 9642 "\n" 9643 "void main()\n" 9644 "{\n" 9645 " vec4 result = vec4(0, 1, 0, 1);\n" 9646 "\n" 9647 "VERIFICATION" 9648 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 9649 " {\n" 9650 " result = vec4(1, 0, 0, 1);\n" 9651 " }\n" 9652 "\n" 9653 " fs_out_result = result;\n" 9654 "}\n" 9655 "\n"; 9656 9657 static const GLchar* geometry_shader_template = "VERSION\n" 9658 "\n" 9659 "layout(points) in;\n" 9660 "layout(triangle_strip, max_vertices = 4) out;\n" 9661 "\n" 9662 "in vec4 tes_gs_result[];\n" 9663 "out vec4 gs_fs_result;\n" 9664 "\n" 9665 "UNIFORM_DEFINITION\n" 9666 "\n" 9667 "void main()\n" 9668 "{\n" 9669 " vec4 result = vec4(0, 1, 0, 1);\n" 9670 "\n" 9671 "VERIFICATION" 9672 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 9673 " {\n" 9674 " result = vec4(1, 0, 0, 1);\n" 9675 " }\n" 9676 "\n" 9677 " gs_fs_result = result;\n" 9678 " gl_Position = vec4(-1, -1, 0, 1);\n" 9679 " EmitVertex();\n" 9680 " gs_fs_result = result;\n" 9681 " gl_Position = vec4(-1, 1, 0, 1);\n" 9682 " EmitVertex();\n" 9683 " gs_fs_result = result;\n" 9684 " gl_Position = vec4(1, -1, 0, 1);\n" 9685 " EmitVertex();\n" 9686 " gs_fs_result = result;\n" 9687 " gl_Position = vec4(1, 1, 0, 1);\n" 9688 " EmitVertex();\n" 9689 "}\n" 9690 "\n"; 9691 9692 static const GLchar* tess_ctrl_shader_template = 9693 "VERSION\n" 9694 "\n" 9695 "layout(vertices = 1) out;\n" 9696 "\n" 9697 "in vec4 vs_tcs_result[];\n" 9698 "out vec4 tcs_tes_result[];\n" 9699 "\n" 9700 "UNIFORM_DEFINITION\n" 9701 "\n" 9702 "void main()\n" 9703 "{\n" 9704 " vec4 result = vec4(0, 1, 0, 1);\n" 9705 "\n" 9706 "VERIFICATION" 9707 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 9708 " {\n" 9709 " result = vec4(1, 0, 0, 1);\n" 9710 " }\n" 9711 "\n" 9712 " tcs_tes_result[gl_InvocationID] = result;\n" 9713 "\n" 9714 " gl_TessLevelOuter[0] = 1.0;\n" 9715 " gl_TessLevelOuter[1] = 1.0;\n" 9716 " gl_TessLevelOuter[2] = 1.0;\n" 9717 " gl_TessLevelOuter[3] = 1.0;\n" 9718 " gl_TessLevelInner[0] = 1.0;\n" 9719 " gl_TessLevelInner[1] = 1.0;\n" 9720 "}\n" 9721 "\n"; 9722 9723 static const GLchar* tess_eval_shader_template = "VERSION\n" 9724 "\n" 9725 "layout(isolines, point_mode) in;\n" 9726 "\n" 9727 "in vec4 tcs_tes_result[];\n" 9728 "out vec4 tes_gs_result;\n" 9729 "\n" 9730 "UNIFORM_DEFINITION\n" 9731 "\n" 9732 "void main()\n" 9733 "{\n" 9734 " vec4 result = vec4(0, 1, 0, 1);\n" 9735 "\n" 9736 "VERIFICATION" 9737 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 9738 " {\n" 9739 " result = vec4(1, 0, 0, 1);\n" 9740 " }\n" 9741 "\n" 9742 " tes_gs_result = result;\n" 9743 "}\n" 9744 "\n"; 9745 9746 static const GLchar* vertex_shader_template = "VERSION\n" 9747 "\n" 9748 "out vec4 vs_tcs_result;\n" 9749 "\n" 9750 "UNIFORM_DEFINITION\n" 9751 "\n" 9752 "void main()\n" 9753 "{\n" 9754 " vec4 result = vec4(0, 1, 0, 1);\n" 9755 "\n" 9756 "VERIFICATION" 9757 "\n" 9758 " vs_tcs_result = result;\n" 9759 "}\n" 9760 "\n"; 9761 9762 const GLchar* shader_template = 0; 9763 9764 switch (in_stage) 9765 { 9766 case Utils::COMPUTE_SHADER: 9767 shader_template = compute_shader_template; 9768 break; 9769 case Utils::FRAGMENT_SHADER: 9770 shader_template = fragment_shader_template; 9771 break; 9772 case Utils::GEOMETRY_SHADER: 9773 shader_template = geometry_shader_template; 9774 break; 9775 case Utils::TESS_CTRL_SHADER: 9776 shader_template = tess_ctrl_shader_template; 9777 break; 9778 case Utils::TESS_EVAL_SHADER: 9779 shader_template = tess_eval_shader_template; 9780 break; 9781 case Utils::VERTEX_SHADER: 9782 shader_template = vertex_shader_template; 9783 break; 9784 default: 9785 TCU_FAIL("Invalid enum"); 9786 break; 9787 } 9788 9789 out_source.m_parts[0].m_code = shader_template; 9790 9791 size_t position = 0; 9792 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 9793 out_source.m_parts[0].m_code); 9794 9795 Utils::replaceToken("UNIFORM_DEFINITION", position, uniform_definition, out_source.m_parts[0].m_code); 9796 9797 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 9798 9799 Utils::replaceAllTokens("BINDING", getCaseString(m_case), out_source.m_parts[0].m_code); 9800 } 9801 9802 const GLchar* BindingUniformInvalidTest::getCaseString(TESTCASES test_case) 9803 { 9804 (void)test_case; 9805 const GLchar* binding = 0; 9806 9807 switch (m_case) 9808 { 9809 case NEGATIVE_VALUE: 9810 binding = "= -1"; 9811 break; 9812 case VARIABLE_NAME: 9813 binding = "= goku"; 9814 break; 9815 case STD140: 9816 binding = "= std140"; 9817 break; 9818 case MISSING: 9819 binding = ""; 9820 break; 9821 case TEST_CASES_MAX: 9822 binding = "= 0"; 9823 break; 9824 default: 9825 TCU_FAIL("Invalid enum"); 9826 } 9827 9828 return binding; 9829 } 9830 9831 /** Constructor 9832 * 9833 * @param context Test context 9834 **/ 9835 BindingSamplersTest::BindingSamplersTest(deqp::Context& context) 9836 : GLSLTestBase(context, "binding_samplers", "Test verifies smaplers binding") 9837 , m_goku_texture(context) 9838 , m_vegeta_texture(context) 9839 , m_trunks_texture(context) 9840 , m_buffer(context) 9841 { 9842 /* Nothing to be done here */ 9843 } 9844 9845 /** Set up next test case 9846 * 9847 * @param test_case_index Index of next test case 9848 * 9849 * @return false if there is no more test cases, true otherwise 9850 **/ 9851 bool BindingSamplersTest::prepareNextTestCase(glw::GLuint test_case_index) 9852 { 9853 switch (test_case_index) 9854 { 9855 case (glw::GLuint)-1: 9856 case 0: 9857 m_test_case = Utils::TEX_2D; 9858 break; 9859 case 1: 9860 m_test_case = Utils::TEX_BUFFER; 9861 break; 9862 case 2: 9863 m_test_case = Utils::TEX_2D_RECT; 9864 break; 9865 case 3: 9866 m_test_case = Utils::TEX_2D_ARRAY; 9867 break; 9868 case 4: 9869 m_test_case = Utils::TEX_3D; 9870 break; 9871 case 5: 9872 m_test_case = Utils::TEX_CUBE; 9873 break; 9874 case 6: 9875 m_test_case = Utils::TEX_1D; 9876 break; 9877 case 7: 9878 m_test_case = Utils::TEX_1D_ARRAY; 9879 break; 9880 default: 9881 return false; 9882 break; 9883 } 9884 9885 m_context.getTestContext().getLog() << tcu::TestLog::Message 9886 << "Tested texture type: " << Utils::getTextureTypeName(m_test_case) 9887 << tcu::TestLog::EndMessage; 9888 9889 return true; 9890 } 9891 9892 /** Prepare source for given shader stage 9893 * 9894 * @param in_stage Shader stage, compute shader will use 430 9895 * @param in_use_version_400 Select if 400 or 420 should be used 9896 * @param out_source Prepared shader source instance 9897 **/ 9898 void BindingSamplersTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 9899 Utils::shaderSource& out_source) 9900 { 9901 static const GLchar* uni_goku = "layout(binding = 0) uniform TYPE goku;\n"; 9902 9903 static const GLchar* uni_vegeta = "layout(binding = 1) uniform TYPE vegeta;\n"; 9904 9905 static const GLchar* uni_trunks = "layout(binding = 3) uniform TYPE trunks;\n\n"; 9906 9907 static const GLchar* verification_snippet = " TEX_COORD_TYPE tex_coord = TEX_COORD_TYPE(COORDINATES);\n" 9908 " vec4 goku_color = SAMPLING_FUNCTION(goku, tex_coord);\n" 9909 " vec4 vegeta_color = SAMPLING_FUNCTION(vegeta, tex_coord);\n" 9910 " vec4 trunks_color = SAMPLING_FUNCTION(trunks, tex_coord);\n" 9911 "\n" 9912 " if ((vec4(1, 0, 0, 0) != goku_color) ||\n" 9913 " (vec4(0, 1, 0, 0) != vegeta_color) ||\n" 9914 " (vec4(0, 0, 1, 0) != trunks_color) )\n" 9915 " {\n" 9916 " result = vec4(1, 0, 0, 1);\n" 9917 " }\n"; 9918 9919 static const GLchar* compute_shader_template = 9920 "VERSION\n" 9921 "\n" 9922 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 9923 "\n" 9924 "writeonly uniform image2D uni_image;\n" 9925 "\n" 9926 "UNI_GOKU\n" 9927 "UNI_VEGETA\n" 9928 "UNI_TRUNKS\n" 9929 "\n" 9930 "void main()\n" 9931 "{\n" 9932 " vec4 result = vec4(0, 1, 0, 1);\n" 9933 "\n" 9934 "VERIFICATION" 9935 "\n" 9936 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 9937 "}\n" 9938 "\n"; 9939 9940 static const GLchar* fragment_shader_template = "VERSION\n" 9941 "\n" 9942 "in vec4 gs_fs_result;\n" 9943 "out vec4 fs_out_result;\n" 9944 "\n" 9945 "UNI_GOKU\n" 9946 "UNI_VEGETA\n" 9947 "UNI_TRUNKS\n" 9948 "\n" 9949 "void main()\n" 9950 "{\n" 9951 " vec4 result = vec4(0, 1, 0, 1);\n" 9952 "\n" 9953 "VERIFICATION" 9954 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 9955 " {\n" 9956 " result = vec4(1, 0, 0, 1);\n" 9957 " }\n" 9958 "\n" 9959 " fs_out_result = result;\n" 9960 "}\n" 9961 "\n"; 9962 9963 static const GLchar* geometry_shader_template = "VERSION\n" 9964 "\n" 9965 "layout(points) in;\n" 9966 "layout(triangle_strip, max_vertices = 4) out;\n" 9967 "\n" 9968 "in vec4 tes_gs_result[];\n" 9969 "out vec4 gs_fs_result;\n" 9970 "\n" 9971 "UNI_TRUNKS\n" 9972 "UNI_GOKU\n" 9973 "UNI_VEGETA\n" 9974 "\n" 9975 "void main()\n" 9976 "{\n" 9977 " vec4 result = vec4(0, 1, 0, 1);\n" 9978 "\n" 9979 "VERIFICATION" 9980 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 9981 " {\n" 9982 " result = vec4(1, 0, 0, 1);\n" 9983 " }\n" 9984 "\n" 9985 " gs_fs_result = result;\n" 9986 " gl_Position = vec4(-1, -1, 0, 1);\n" 9987 " EmitVertex();\n" 9988 " gs_fs_result = result;\n" 9989 " gl_Position = vec4(-1, 1, 0, 1);\n" 9990 " EmitVertex();\n" 9991 " gs_fs_result = result;\n" 9992 " gl_Position = vec4(1, -1, 0, 1);\n" 9993 " EmitVertex();\n" 9994 " gs_fs_result = result;\n" 9995 " gl_Position = vec4(1, 1, 0, 1);\n" 9996 " EmitVertex();\n" 9997 "}\n" 9998 "\n"; 9999 10000 static const GLchar* tess_ctrl_shader_template = 10001 "VERSION\n" 10002 "\n" 10003 "layout(vertices = 1) out;\n" 10004 "\n" 10005 "in vec4 vs_tcs_result[];\n" 10006 "out vec4 tcs_tes_result[];\n" 10007 "\n" 10008 "UNI_VEGETA\n" 10009 "UNI_TRUNKS\n" 10010 "UNI_GOKU\n" 10011 "\n" 10012 "void main()\n" 10013 "{\n" 10014 " vec4 result = vec4(0, 1, 0, 1);\n" 10015 "\n" 10016 "VERIFICATION" 10017 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 10018 " {\n" 10019 " result = vec4(1, 0, 0, 1);\n" 10020 " }\n" 10021 "\n" 10022 " tcs_tes_result[gl_InvocationID] = result;\n" 10023 "\n" 10024 " gl_TessLevelOuter[0] = 1.0;\n" 10025 " gl_TessLevelOuter[1] = 1.0;\n" 10026 " gl_TessLevelOuter[2] = 1.0;\n" 10027 " gl_TessLevelOuter[3] = 1.0;\n" 10028 " gl_TessLevelInner[0] = 1.0;\n" 10029 " gl_TessLevelInner[1] = 1.0;\n" 10030 "}\n" 10031 "\n"; 10032 10033 static const GLchar* tess_eval_shader_template = "VERSION\n" 10034 "\n" 10035 "layout(isolines, point_mode) in;\n" 10036 "\n" 10037 "in vec4 tcs_tes_result[];\n" 10038 "out vec4 tes_gs_result;\n" 10039 "\n" 10040 "UNI_GOKU\n" 10041 "UNI_TRUNKS\n" 10042 "UNI_VEGETA\n" 10043 "\n" 10044 "void main()\n" 10045 "{\n" 10046 " vec4 result = vec4(0, 1, 0, 1);\n" 10047 "\n" 10048 "VERIFICATION" 10049 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 10050 " {\n" 10051 " result = vec4(1, 0, 0, 1);\n" 10052 " }\n" 10053 "\n" 10054 " tes_gs_result = result;\n" 10055 "}\n" 10056 "\n"; 10057 10058 static const GLchar* vertex_shader_template = "VERSION\n" 10059 "\n" 10060 "out vec4 vs_tcs_result;\n" 10061 "\n" 10062 "UNI_TRUNKS\n" 10063 "UNI_VEGETA\n" 10064 "UNI_GOKU\n" 10065 "\n" 10066 "void main()\n" 10067 "{\n" 10068 " vec4 result = vec4(0, 1, 0, 1);\n" 10069 "\n" 10070 "VERIFICATION" 10071 "\n" 10072 " vs_tcs_result = result;\n" 10073 "}\n" 10074 "\n"; 10075 10076 const Utils::TYPES base_tex_coord_type = (Utils::TEX_BUFFER == m_test_case) ? Utils::INT : Utils::FLOAT; 10077 const GLchar* coordinates = 0; 10078 GLuint n_coordinates = Utils::getNumberOfCoordinates(m_test_case); 10079 const GLchar* shader_template = 0; 10080 const GLchar* sampler_type = Utils::getSamplerType(m_test_case); 10081 const GLchar* sampling_function = (Utils::TEX_BUFFER == m_test_case) ? "texelFetch" : "texture"; 10082 const GLchar* tex_coord_type = Utils::getTypeName(base_tex_coord_type, 1 /* n_columns */, n_coordinates); 10083 10084 switch (in_stage) 10085 { 10086 case Utils::COMPUTE_SHADER: 10087 shader_template = compute_shader_template; 10088 break; 10089 case Utils::FRAGMENT_SHADER: 10090 shader_template = fragment_shader_template; 10091 break; 10092 case Utils::GEOMETRY_SHADER: 10093 shader_template = geometry_shader_template; 10094 break; 10095 case Utils::TESS_CTRL_SHADER: 10096 shader_template = tess_ctrl_shader_template; 10097 break; 10098 case Utils::TESS_EVAL_SHADER: 10099 shader_template = tess_eval_shader_template; 10100 break; 10101 case Utils::VERTEX_SHADER: 10102 shader_template = vertex_shader_template; 10103 break; 10104 default: 10105 TCU_FAIL("Invalid enum"); 10106 break; 10107 } 10108 10109 switch (n_coordinates) 10110 { 10111 case 1: 10112 coordinates = "0"; 10113 break; 10114 case 2: 10115 coordinates = "0, 0"; 10116 break; 10117 case 3: 10118 coordinates = "0, 0, 0"; 10119 break; 10120 case 4: 10121 coordinates = "0, 0, 0, 0"; 10122 break; 10123 } 10124 10125 out_source.m_parts[0].m_code = shader_template; 10126 10127 size_t position = 0; 10128 10129 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 10130 out_source.m_parts[0].m_code); 10131 10132 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 10133 10134 position -= strlen(verification_snippet); 10135 10136 Utils::replaceToken("COORDINATES", position, coordinates, out_source.m_parts[0].m_code); 10137 10138 Utils::replaceAllTokens("SAMPLING_FUNCTION", sampling_function, out_source.m_parts[0].m_code); 10139 10140 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 10141 10142 Utils::replaceAllTokens("UNI_VEGETA", uni_vegeta, out_source.m_parts[0].m_code); 10143 10144 Utils::replaceAllTokens("UNI_TRUNKS", uni_trunks, out_source.m_parts[0].m_code); 10145 10146 Utils::replaceAllTokens("TEX_COORD_TYPE", tex_coord_type, out_source.m_parts[0].m_code); 10147 10148 Utils::replaceAllTokens("TYPE", sampler_type, out_source.m_parts[0].m_code); 10149 } 10150 10151 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 10152 * 10153 * @param program Current program 10154 **/ 10155 void BindingSamplersTest::prepareUniforms(Utils::program& program) 10156 { 10157 (void)program; 10158 static const GLuint goku_data = 0x000000ff; 10159 static const GLuint vegeta_data = 0x0000ff00; 10160 static const GLuint trunks_data = 0x00ff0000; 10161 10162 prepareTexture(m_goku_texture, m_test_case, goku_data); 10163 prepareTexture(m_vegeta_texture, m_test_case, vegeta_data); 10164 prepareTexture(m_trunks_texture, m_test_case, trunks_data); 10165 10166 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 10167 10168 gl.activeTexture(GL_TEXTURE0); 10169 GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture"); 10170 10171 m_goku_texture.bind(); 10172 10173 gl.activeTexture(GL_TEXTURE1); 10174 GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture"); 10175 10176 m_vegeta_texture.bind(); 10177 10178 gl.activeTexture(GL_TEXTURE3); 10179 GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture"); 10180 10181 m_trunks_texture.bind(); 10182 } 10183 10184 /** Overwrite of releaseResource method, release extra buffer and texture 10185 * 10186 * @param ignored 10187 **/ 10188 void BindingSamplersTest::releaseResource() 10189 { 10190 m_goku_texture.release(); 10191 m_vegeta_texture.release(); 10192 m_trunks_texture.release(); 10193 m_buffer.release(); 10194 } 10195 10196 /** Prepare texture of given type filled with given color 10197 * 10198 * @param texture Texture 10199 * @param texture_type Type of texture 10200 * @param color Color 10201 **/ 10202 void BindingSamplersTest::prepareTexture(Utils::texture& texture, Utils::TEXTURE_TYPES texture_type, glw::GLuint color) 10203 { 10204 (void)texture_type; 10205 static const GLuint width = 16; 10206 static const GLuint height = 16; 10207 static const GLuint depth = 1; 10208 10209 std::vector<GLuint> texture_data; 10210 texture_data.resize(width * height); 10211 10212 for (GLuint i = 0; i < texture_data.size(); ++i) 10213 { 10214 texture_data[i] = color; 10215 } 10216 10217 if (Utils::TEX_BUFFER != m_test_case) 10218 { 10219 texture.create(width, height, depth, GL_RGBA8, m_test_case); 10220 10221 texture.update(width, height, depth, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]); 10222 } 10223 else 10224 { 10225 m_buffer.generate(GL_TEXTURE_BUFFER); 10226 m_buffer.update(texture_data.size(), &texture_data[0], GL_STATIC_DRAW); 10227 10228 texture.createBuffer(GL_RGBA8, m_buffer.m_id); 10229 } 10230 } 10231 10232 /** Constructor 10233 * 10234 * @param context Test context 10235 **/ 10236 BindingSamplerSingleTest::BindingSamplerSingleTest(deqp::Context& context) 10237 : GLSLTestBase(context, "binding_sampler_single", "Test verifies sampler binding"), m_goku_texture(context) 10238 { 10239 /* Nothing to be done here */ 10240 } 10241 10242 /** Set up next test case 10243 * 10244 * @param test_case_index Index of next test case 10245 * 10246 * @return false if there is no more test cases, true otherwise 10247 **/ 10248 bool BindingSamplerSingleTest::prepareNextTestCase(glw::GLuint test_case_index) 10249 { 10250 switch (test_case_index) 10251 { 10252 case (glw::GLuint)-1: 10253 case 0: 10254 m_test_stage = Utils::VERTEX_SHADER; 10255 break; 10256 case 1: 10257 m_test_stage = Utils::TESS_CTRL_SHADER; 10258 break; 10259 case 2: 10260 m_test_stage = Utils::TESS_EVAL_SHADER; 10261 break; 10262 case 3: 10263 m_test_stage = Utils::GEOMETRY_SHADER; 10264 break; 10265 case 4: 10266 m_test_stage = Utils::FRAGMENT_SHADER; 10267 break; 10268 default: 10269 return false; 10270 break; 10271 } 10272 10273 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Tested stage: " 10274 << Utils::getShaderStageName((Utils::SHADER_STAGES)m_test_stage) 10275 << tcu::TestLog::EndMessage; 10276 10277 return true; 10278 } 10279 10280 /** Prepare source for given shader stage 10281 * 10282 * @param in_stage Shader stage, compute shader will use 430 10283 * @param in_use_version_400 Select if 400 or 420 should be used 10284 * @param out_source Prepared shader source instance 10285 **/ 10286 void BindingSamplerSingleTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 10287 Utils::shaderSource& out_source) 10288 { 10289 static const GLchar* uni_goku_with_binding = "layout(binding = 2) uniform sampler2D goku;\n"; 10290 10291 static const GLchar* uni_goku_no_binding = "uniform sampler2D goku;\n"; 10292 10293 static const GLchar* verification_snippet = " vec4 goku_color = texture(goku, vec2(0,0));\n" 10294 "\n" 10295 " if (vec4(1, 0, 0, 0) != goku_color)\n" 10296 " {\n" 10297 " result = vec4(1, 0, 0, 1);\n" 10298 " }\n"; 10299 10300 static const GLchar* compute_shader_template = 10301 "VERSION\n" 10302 "\n" 10303 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 10304 "\n" 10305 "writeonly uniform image2D uni_image;\n" 10306 "\n" 10307 "UNI_GOKU\n" 10308 "\n" 10309 "void main()\n" 10310 "{\n" 10311 " vec4 result = vec4(0, 1, 0, 1);\n" 10312 "\n" 10313 "VERIFICATION" 10314 "\n" 10315 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 10316 "}\n" 10317 "\n"; 10318 10319 static const GLchar* fragment_shader_template = "VERSION\n" 10320 "\n" 10321 "in vec4 gs_fs_result;\n" 10322 "out vec4 fs_out_result;\n" 10323 "\n" 10324 "UNI_GOKU\n" 10325 "\n" 10326 "void main()\n" 10327 "{\n" 10328 " vec4 result = vec4(0, 1, 0, 1);\n" 10329 "\n" 10330 "VERIFICATION" 10331 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 10332 " {\n" 10333 " result = vec4(1, 0, 0, 1);\n" 10334 " }\n" 10335 "\n" 10336 " fs_out_result = result;\n" 10337 "}\n" 10338 "\n"; 10339 10340 static const GLchar* geometry_shader_template = "VERSION\n" 10341 "\n" 10342 "layout(points) in;\n" 10343 "layout(triangle_strip, max_vertices = 4) out;\n" 10344 "\n" 10345 "in vec4 tes_gs_result[];\n" 10346 "out vec4 gs_fs_result;\n" 10347 "\n" 10348 "UNI_GOKU\n" 10349 "\n" 10350 "void main()\n" 10351 "{\n" 10352 " vec4 result = vec4(0, 1, 0, 1);\n" 10353 "\n" 10354 "VERIFICATION" 10355 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 10356 " {\n" 10357 " result = vec4(1, 0, 0, 1);\n" 10358 " }\n" 10359 "\n" 10360 " gs_fs_result = result;\n" 10361 " gl_Position = vec4(-1, -1, 0, 1);\n" 10362 " EmitVertex();\n" 10363 " gs_fs_result = result;\n" 10364 " gl_Position = vec4(-1, 1, 0, 1);\n" 10365 " EmitVertex();\n" 10366 " gs_fs_result = result;\n" 10367 " gl_Position = vec4(1, -1, 0, 1);\n" 10368 " EmitVertex();\n" 10369 " gs_fs_result = result;\n" 10370 " gl_Position = vec4(1, 1, 0, 1);\n" 10371 " EmitVertex();\n" 10372 "}\n" 10373 "\n"; 10374 10375 static const GLchar* tess_ctrl_shader_template = 10376 "VERSION\n" 10377 "\n" 10378 "layout(vertices = 1) out;\n" 10379 "\n" 10380 "in vec4 vs_tcs_result[];\n" 10381 "out vec4 tcs_tes_result[];\n" 10382 "\n" 10383 "UNI_GOKU\n" 10384 "\n" 10385 "void main()\n" 10386 "{\n" 10387 " vec4 result = vec4(0, 1, 0, 1);\n" 10388 "\n" 10389 "VERIFICATION" 10390 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 10391 " {\n" 10392 " result = vec4(1, 0, 0, 1);\n" 10393 " }\n" 10394 "\n" 10395 " tcs_tes_result[gl_InvocationID] = result;\n" 10396 "\n" 10397 " gl_TessLevelOuter[0] = 1.0;\n" 10398 " gl_TessLevelOuter[1] = 1.0;\n" 10399 " gl_TessLevelOuter[2] = 1.0;\n" 10400 " gl_TessLevelOuter[3] = 1.0;\n" 10401 " gl_TessLevelInner[0] = 1.0;\n" 10402 " gl_TessLevelInner[1] = 1.0;\n" 10403 "}\n" 10404 "\n"; 10405 10406 static const GLchar* tess_eval_shader_template = "VERSION\n" 10407 "\n" 10408 "layout(isolines, point_mode) in;\n" 10409 "\n" 10410 "in vec4 tcs_tes_result[];\n" 10411 "out vec4 tes_gs_result;\n" 10412 "\n" 10413 "UNI_GOKU\n" 10414 "\n" 10415 "void main()\n" 10416 "{\n" 10417 " vec4 result = vec4(0, 1, 0, 1);\n" 10418 "\n" 10419 "VERIFICATION" 10420 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 10421 " {\n" 10422 " result = vec4(1, 0, 0, 1);\n" 10423 " }\n" 10424 "\n" 10425 " tes_gs_result = result;\n" 10426 "}\n" 10427 "\n"; 10428 10429 static const GLchar* vertex_shader_template = "VERSION\n" 10430 "\n" 10431 "out vec4 vs_tcs_result;\n" 10432 "\n" 10433 "UNI_GOKU\n" 10434 "\n" 10435 "void main()\n" 10436 "{\n" 10437 " vec4 result = vec4(0, 1, 0, 1);\n" 10438 "\n" 10439 "VERIFICATION" 10440 "\n" 10441 " vs_tcs_result = result;\n" 10442 "}\n" 10443 "\n"; 10444 10445 const GLchar* shader_template = 0; 10446 const GLchar* uniform_definition = uni_goku_no_binding; 10447 10448 switch (in_stage) 10449 { 10450 case Utils::COMPUTE_SHADER: 10451 shader_template = compute_shader_template; 10452 uniform_definition = uni_goku_with_binding; 10453 break; 10454 case Utils::FRAGMENT_SHADER: 10455 shader_template = fragment_shader_template; 10456 break; 10457 case Utils::GEOMETRY_SHADER: 10458 shader_template = geometry_shader_template; 10459 break; 10460 case Utils::TESS_CTRL_SHADER: 10461 shader_template = tess_ctrl_shader_template; 10462 break; 10463 case Utils::TESS_EVAL_SHADER: 10464 shader_template = tess_eval_shader_template; 10465 break; 10466 case Utils::VERTEX_SHADER: 10467 shader_template = vertex_shader_template; 10468 break; 10469 default: 10470 TCU_FAIL("Invalid enum"); 10471 break; 10472 } 10473 10474 if (in_stage == m_test_stage) 10475 { 10476 uniform_definition = uni_goku_with_binding; 10477 } 10478 10479 out_source.m_parts[0].m_code = shader_template; 10480 10481 size_t position = 0; 10482 10483 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 10484 out_source.m_parts[0].m_code); 10485 10486 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 10487 10488 Utils::replaceAllTokens("UNI_GOKU", uniform_definition, out_source.m_parts[0].m_code); 10489 } 10490 10491 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 10492 * 10493 * @param program Current program 10494 **/ 10495 void BindingSamplerSingleTest::prepareUniforms(Utils::program& program) 10496 { 10497 (void)program; 10498 static const GLuint goku_data = 0x000000ff; 10499 10500 m_goku_texture.create(16, 16, GL_RGBA8); 10501 10502 std::vector<GLuint> texture_data; 10503 texture_data.resize(16 * 16); 10504 10505 for (GLuint i = 0; i < texture_data.size(); ++i) 10506 { 10507 texture_data[i] = goku_data; 10508 } 10509 10510 m_goku_texture.update(16, 16, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]); 10511 10512 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 10513 10514 gl.activeTexture(GL_TEXTURE2); 10515 GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture"); 10516 10517 m_goku_texture.bind(); 10518 } 10519 10520 /** Overwrite of releaseResource method, release extra texture 10521 * 10522 * @param ignored 10523 **/ 10524 void BindingSamplerSingleTest::releaseResource() 10525 { 10526 m_goku_texture.release(); 10527 } 10528 10529 /** Constructor 10530 * 10531 * @param context Test context 10532 **/ 10533 BindingSamplerArrayTest::BindingSamplerArrayTest(deqp::Context& context) 10534 : GLSLTestBase(context, "binding_sampler_array", "Test verifies binding of sampler arrays") 10535 , m_goku_00_texture(context) 10536 , m_goku_01_texture(context) 10537 , m_goku_02_texture(context) 10538 , m_goku_03_texture(context) 10539 , m_goku_04_texture(context) 10540 , m_goku_05_texture(context) 10541 , m_goku_06_texture(context) 10542 { 10543 /* Nothing to be done here */ 10544 } 10545 10546 /** Prepare source for given shader stage 10547 * 10548 * @param in_stage Shader stage, compute shader will use 430 10549 * @param in_use_version_400 Select if 400 or 420 should be used 10550 * @param out_source Prepared shader source instance 10551 **/ 10552 void BindingSamplerArrayTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 10553 Utils::shaderSource& out_source) 10554 { 10555 static const GLchar* uni_goku = "layout(binding = 1) uniform sampler2D goku[7];\n"; 10556 10557 static const GLchar* verification_snippet = " vec4 color[7];\n" 10558 "\n" 10559 " for (uint i = 0u; i < 7; ++i)\n" 10560 " {\n" 10561 " color[i] = texture(goku[i], vec2(0, 0));\n" 10562 " }\n" 10563 "\n" 10564 " if ((vec4(0, 0, 0, 0) != color[0]) ||\n" 10565 " (vec4(0, 0, 0, 1) != color[1]) ||\n" 10566 " (vec4(0, 0, 1, 0) != color[2]) ||\n" 10567 " (vec4(0, 0, 1, 1) != color[3]) ||\n" 10568 " (vec4(0, 1, 0, 0) != color[4]) ||\n" 10569 " (vec4(0, 1, 0, 1) != color[5]) ||\n" 10570 " (vec4(0, 1, 1, 0) != color[6]) )\n" 10571 " {\n" 10572 " result = vec4(1, 0, 0, 1);\n" 10573 " }\n"; 10574 10575 static const GLchar* compute_shader_template = 10576 "VERSION\n" 10577 "\n" 10578 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 10579 "\n" 10580 "writeonly uniform image2D uni_image;\n" 10581 "\n" 10582 "UNI_GOKU\n" 10583 "\n" 10584 "void main()\n" 10585 "{\n" 10586 " vec4 result = vec4(0, 1, 0, 1);\n" 10587 "\n" 10588 "VERIFICATION" 10589 "\n" 10590 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 10591 "}\n" 10592 "\n"; 10593 10594 static const GLchar* fragment_shader_template = "VERSION\n" 10595 "\n" 10596 "in vec4 gs_fs_result;\n" 10597 "out vec4 fs_out_result;\n" 10598 "\n" 10599 "UNI_GOKU\n" 10600 "\n" 10601 "void main()\n" 10602 "{\n" 10603 " vec4 result = vec4(0, 1, 0, 1);\n" 10604 "\n" 10605 "VERIFICATION" 10606 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 10607 " {\n" 10608 " result = vec4(1, 0, 0, 1);\n" 10609 " }\n" 10610 "\n" 10611 " fs_out_result = result;\n" 10612 "}\n" 10613 "\n"; 10614 10615 static const GLchar* geometry_shader_template = "VERSION\n" 10616 "\n" 10617 "layout(points) in;\n" 10618 "layout(triangle_strip, max_vertices = 4) out;\n" 10619 "\n" 10620 "in vec4 tes_gs_result[];\n" 10621 "out vec4 gs_fs_result;\n" 10622 "\n" 10623 "UNI_GOKU\n" 10624 "\n" 10625 "void main()\n" 10626 "{\n" 10627 " vec4 result = vec4(0, 1, 0, 1);\n" 10628 "\n" 10629 "VERIFICATION" 10630 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 10631 " {\n" 10632 " result = vec4(1, 0, 0, 1);\n" 10633 " }\n" 10634 "\n" 10635 " gs_fs_result = result;\n" 10636 " gl_Position = vec4(-1, -1, 0, 1);\n" 10637 " EmitVertex();\n" 10638 " gs_fs_result = result;\n" 10639 " gl_Position = vec4(-1, 1, 0, 1);\n" 10640 " EmitVertex();\n" 10641 " gs_fs_result = result;\n" 10642 " gl_Position = vec4(1, -1, 0, 1);\n" 10643 " EmitVertex();\n" 10644 " gs_fs_result = result;\n" 10645 " gl_Position = vec4(1, 1, 0, 1);\n" 10646 " EmitVertex();\n" 10647 "}\n" 10648 "\n"; 10649 10650 static const GLchar* tess_ctrl_shader_template = 10651 "VERSION\n" 10652 "\n" 10653 "layout(vertices = 1) out;\n" 10654 "\n" 10655 "in vec4 vs_tcs_result[];\n" 10656 "out vec4 tcs_tes_result[];\n" 10657 "\n" 10658 "UNI_GOKU\n" 10659 "\n" 10660 "void main()\n" 10661 "{\n" 10662 " vec4 result = vec4(0, 1, 0, 1);\n" 10663 "\n" 10664 "VERIFICATION" 10665 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 10666 " {\n" 10667 " result = vec4(1, 0, 0, 1);\n" 10668 " }\n" 10669 "\n" 10670 " tcs_tes_result[gl_InvocationID] = result;\n" 10671 "\n" 10672 " gl_TessLevelOuter[0] = 1.0;\n" 10673 " gl_TessLevelOuter[1] = 1.0;\n" 10674 " gl_TessLevelOuter[2] = 1.0;\n" 10675 " gl_TessLevelOuter[3] = 1.0;\n" 10676 " gl_TessLevelInner[0] = 1.0;\n" 10677 " gl_TessLevelInner[1] = 1.0;\n" 10678 "}\n" 10679 "\n"; 10680 10681 static const GLchar* tess_eval_shader_template = "VERSION\n" 10682 "\n" 10683 "layout(isolines, point_mode) in;\n" 10684 "\n" 10685 "in vec4 tcs_tes_result[];\n" 10686 "out vec4 tes_gs_result;\n" 10687 "\n" 10688 "UNI_GOKU\n" 10689 "\n" 10690 "void main()\n" 10691 "{\n" 10692 " vec4 result = vec4(0, 1, 0, 1);\n" 10693 "\n" 10694 "VERIFICATION" 10695 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 10696 " {\n" 10697 " result = vec4(1, 0, 0, 1);\n" 10698 " }\n" 10699 "\n" 10700 " tes_gs_result = result;\n" 10701 "}\n" 10702 "\n"; 10703 10704 static const GLchar* vertex_shader_template = "VERSION\n" 10705 "\n" 10706 "out vec4 vs_tcs_result;\n" 10707 "\n" 10708 "UNI_GOKU\n" 10709 "\n" 10710 "void main()\n" 10711 "{\n" 10712 " vec4 result = vec4(0, 1, 0, 1);\n" 10713 "\n" 10714 "VERIFICATION" 10715 "\n" 10716 " vs_tcs_result = result;\n" 10717 "}\n" 10718 "\n"; 10719 10720 const GLchar* shader_template = 0; 10721 10722 switch (in_stage) 10723 { 10724 case Utils::COMPUTE_SHADER: 10725 shader_template = compute_shader_template; 10726 break; 10727 case Utils::FRAGMENT_SHADER: 10728 shader_template = fragment_shader_template; 10729 break; 10730 case Utils::GEOMETRY_SHADER: 10731 shader_template = geometry_shader_template; 10732 break; 10733 case Utils::TESS_CTRL_SHADER: 10734 shader_template = tess_ctrl_shader_template; 10735 break; 10736 case Utils::TESS_EVAL_SHADER: 10737 shader_template = tess_eval_shader_template; 10738 break; 10739 case Utils::VERTEX_SHADER: 10740 shader_template = vertex_shader_template; 10741 break; 10742 default: 10743 TCU_FAIL("Invalid enum"); 10744 break; 10745 } 10746 10747 out_source.m_parts[0].m_code = shader_template; 10748 10749 size_t position = 0; 10750 10751 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 10752 out_source.m_parts[0].m_code); 10753 10754 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 10755 10756 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 10757 } 10758 10759 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 10760 * 10761 * @param program Current program 10762 **/ 10763 void BindingSamplerArrayTest::prepareUniforms(Utils::program& program) 10764 { 10765 static const GLuint goku_data[7] = { 10766 0x00000000, 0xff000000, 0x00ff0000, 0xffff0000, 0x0000ff00, 0xff00ff00, 0x00ffff00, 10767 }; 10768 10769 static const GLuint binding_offset = 1; 10770 10771 Utils::texture* textures[7] = { 10772 &m_goku_00_texture, &m_goku_01_texture, &m_goku_02_texture, &m_goku_03_texture, 10773 &m_goku_04_texture, &m_goku_05_texture, &m_goku_06_texture, 10774 }; 10775 10776 std::vector<GLuint> texture_data; 10777 texture_data.resize(16 * 16); 10778 10779 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 10780 10781 for (GLuint i = 0; i < 7; ++i) 10782 { 10783 GLint expected_binding = i + binding_offset; 10784 10785 checkBinding(program, i, expected_binding); 10786 10787 gl.activeTexture(GL_TEXTURE0 + expected_binding); 10788 GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture"); 10789 10790 textures[i]->create(16, 16, GL_RGBA8); 10791 10792 for (GLuint j = 0; j < texture_data.size(); ++j) 10793 { 10794 texture_data[j] = goku_data[i]; 10795 } 10796 10797 textures[i]->update(16, 16, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]); 10798 } 10799 } 10800 10801 /** Overwrite of releaseResource method, release extra textures 10802 * 10803 * @param ignored 10804 **/ 10805 void BindingSamplerArrayTest::releaseResource() 10806 { 10807 Utils::texture* textures[7] = { 10808 &m_goku_00_texture, &m_goku_01_texture, &m_goku_02_texture, &m_goku_03_texture, 10809 &m_goku_04_texture, &m_goku_05_texture, &m_goku_06_texture, 10810 }; 10811 10812 for (GLuint i = 0; i < 7; ++i) 10813 { 10814 textures[i]->release(); 10815 } 10816 } 10817 10818 /** Verifies that API reports correct uniform binding 10819 * 10820 * @param program Program 10821 * @param index Index of array element 10822 * @param expected_binding Expected binding 10823 **/ 10824 void BindingSamplerArrayTest::checkBinding(Utils::program& program, GLuint index, GLint expected_binding) 10825 { 10826 if (false == Utils::checkUniformArrayBinding(program, "goku", index, expected_binding)) 10827 { 10828 TCU_FAIL("Wrong binding reported by API"); 10829 } 10830 } 10831 10832 /** Constructor 10833 * 10834 * @param context Test context 10835 **/ 10836 BindingSamplerDefaultTest::BindingSamplerDefaultTest(deqp::Context& context) 10837 : APITestBase(context, "binding_sampler_default", "Test verifies default sampler binding") 10838 { 10839 /* Nothing to be done here */ 10840 } 10841 10842 /** Execute API call and verifies results 10843 * 10844 * @return true when results are positive, false otherwise 10845 **/ 10846 bool BindingSamplerDefaultTest::checkResults(Utils::program& program) 10847 { 10848 return Utils::checkUniformBinding(program, "goku", 0 /* expected_binding */); 10849 } 10850 10851 /** Prepare source for given shader stage 10852 * 10853 * @param in_stage Shader stage, compute shader will use 430 10854 * @param in_use_version_400 Select if 400 or 420 should be used 10855 * @param out_source Prepared shader source instance 10856 **/ 10857 void BindingSamplerDefaultTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 10858 Utils::shaderSource& out_source) 10859 { 10860 static const GLchar* uni_goku = "uniform sampler2D goku;\n"; 10861 10862 static const GLchar* verification_snippet = " vec4 color = texture(goku, vec2(0,0));\n" 10863 " if (vec4(1, 0, 0, 0) != color)\n" 10864 " {\n" 10865 " result = vec4(1, 0, 0, 1);\n" 10866 " }\n"; 10867 10868 static const GLchar* compute_shader_template = 10869 "VERSION\n" 10870 "\n" 10871 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 10872 "\n" 10873 "writeonly uniform image2D uni_image;\n" 10874 "\n" 10875 "UNI_GOKU\n" 10876 "\n" 10877 "void main()\n" 10878 "{\n" 10879 " vec4 result = vec4(0, 1, 0, 1);\n" 10880 "\n" 10881 "VERIFICATION" 10882 "\n" 10883 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 10884 "}\n" 10885 "\n"; 10886 10887 static const GLchar* fragment_shader_template = "VERSION\n" 10888 "\n" 10889 "in vec4 gs_fs_result;\n" 10890 "out vec4 fs_out_result;\n" 10891 "\n" 10892 "UNI_GOKU\n" 10893 "\n" 10894 "void main()\n" 10895 "{\n" 10896 " vec4 result = vec4(0, 1, 0, 1);\n" 10897 "\n" 10898 "VERIFICATION" 10899 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 10900 " {\n" 10901 " result = vec4(1, 0, 0, 1);\n" 10902 " }\n" 10903 "\n" 10904 " fs_out_result = result;\n" 10905 "}\n" 10906 "\n"; 10907 10908 static const GLchar* geometry_shader_template = "VERSION\n" 10909 "\n" 10910 "layout(points) in;\n" 10911 "layout(triangle_strip, max_vertices = 4) out;\n" 10912 "\n" 10913 "in vec4 tes_gs_result[];\n" 10914 "out vec4 gs_fs_result;\n" 10915 "\n" 10916 "UNI_GOKU\n" 10917 "\n" 10918 "void main()\n" 10919 "{\n" 10920 " vec4 result = vec4(0, 1, 0, 1);\n" 10921 "\n" 10922 "VERIFICATION" 10923 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 10924 " {\n" 10925 " result = vec4(1, 0, 0, 1);\n" 10926 " }\n" 10927 "\n" 10928 " gs_fs_result = result;\n" 10929 " gl_Position = vec4(-1, -1, 0, 1);\n" 10930 " EmitVertex();\n" 10931 " gs_fs_result = result;\n" 10932 " gl_Position = vec4(-1, 1, 0, 1);\n" 10933 " EmitVertex();\n" 10934 " gs_fs_result = result;\n" 10935 " gl_Position = vec4(1, -1, 0, 1);\n" 10936 " EmitVertex();\n" 10937 " gs_fs_result = result;\n" 10938 " gl_Position = vec4(1, 1, 0, 1);\n" 10939 " EmitVertex();\n" 10940 "}\n" 10941 "\n"; 10942 10943 static const GLchar* tess_ctrl_shader_template = 10944 "VERSION\n" 10945 "\n" 10946 "layout(vertices = 1) out;\n" 10947 "\n" 10948 "in vec4 vs_tcs_result[];\n" 10949 "out vec4 tcs_tes_result[];\n" 10950 "\n" 10951 "UNI_GOKU\n" 10952 "\n" 10953 "void main()\n" 10954 "{\n" 10955 " vec4 result = vec4(0, 1, 0, 1);\n" 10956 "\n" 10957 "VERIFICATION" 10958 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 10959 " {\n" 10960 " result = vec4(1, 0, 0, 1);\n" 10961 " }\n" 10962 "\n" 10963 " tcs_tes_result[gl_InvocationID] = result;\n" 10964 "\n" 10965 " gl_TessLevelOuter[0] = 1.0;\n" 10966 " gl_TessLevelOuter[1] = 1.0;\n" 10967 " gl_TessLevelOuter[2] = 1.0;\n" 10968 " gl_TessLevelOuter[3] = 1.0;\n" 10969 " gl_TessLevelInner[0] = 1.0;\n" 10970 " gl_TessLevelInner[1] = 1.0;\n" 10971 "}\n" 10972 "\n"; 10973 10974 static const GLchar* tess_eval_shader_template = "VERSION\n" 10975 "\n" 10976 "layout(isolines, point_mode) in;\n" 10977 "\n" 10978 "in vec4 tcs_tes_result[];\n" 10979 "out vec4 tes_gs_result;\n" 10980 "\n" 10981 "UNI_GOKU\n" 10982 "\n" 10983 "void main()\n" 10984 "{\n" 10985 " vec4 result = vec4(0, 1, 0, 1);\n" 10986 "\n" 10987 "VERIFICATION" 10988 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 10989 " {\n" 10990 " result = vec4(1, 0, 0, 1);\n" 10991 " }\n" 10992 "\n" 10993 " tes_gs_result = result;\n" 10994 "}\n" 10995 "\n"; 10996 10997 static const GLchar* vertex_shader_template = "VERSION\n" 10998 "\n" 10999 "out vec4 vs_tcs_result;\n" 11000 "\n" 11001 "UNI_GOKU\n" 11002 "\n" 11003 "void main()\n" 11004 "{\n" 11005 " vec4 result = vec4(0, 1, 0, 1);\n" 11006 "\n" 11007 "VERIFICATION" 11008 "\n" 11009 " vs_tcs_result = result;\n" 11010 "}\n" 11011 "\n"; 11012 11013 const GLchar* shader_template = 0; 11014 11015 switch (in_stage) 11016 { 11017 case Utils::COMPUTE_SHADER: 11018 shader_template = compute_shader_template; 11019 break; 11020 case Utils::FRAGMENT_SHADER: 11021 shader_template = fragment_shader_template; 11022 break; 11023 case Utils::GEOMETRY_SHADER: 11024 shader_template = geometry_shader_template; 11025 break; 11026 case Utils::TESS_CTRL_SHADER: 11027 shader_template = tess_ctrl_shader_template; 11028 break; 11029 case Utils::TESS_EVAL_SHADER: 11030 shader_template = tess_eval_shader_template; 11031 break; 11032 case Utils::VERTEX_SHADER: 11033 shader_template = vertex_shader_template; 11034 break; 11035 default: 11036 TCU_FAIL("Invalid enum"); 11037 break; 11038 } 11039 11040 out_source.m_parts[0].m_code = shader_template; 11041 11042 size_t position = 0; 11043 11044 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 11045 out_source.m_parts[0].m_code); 11046 11047 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 11048 11049 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 11050 } 11051 11052 /** Constructor 11053 * 11054 * @param context Test context 11055 **/ 11056 BindingSamplerAPIOverrideTest::BindingSamplerAPIOverrideTest(deqp::Context& context) 11057 : GLSLTestBase(context, "binding_sampler_api_override", "Verifies that API can override sampler binding") 11058 , m_goku_texture(context) 11059 { 11060 /* Nothing to be done here */ 11061 } 11062 11063 /** Prepare source for given shader stage 11064 * 11065 * @param in_stage Shader stage, compute shader will use 430 11066 * @param in_use_version_400 Select if 400 or 420 should be used 11067 * @param out_source Prepared shader source instance 11068 **/ 11069 void BindingSamplerAPIOverrideTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 11070 Utils::shaderSource& out_source) 11071 { 11072 static const GLchar* uni_goku = "layout(binding = 2) uniform sampler2D goku;\n"; 11073 11074 static const GLchar* verification_snippet = " vec4 color = texture(goku, vec2(0,0));\n" 11075 " if (vec4(1, 0, 0, 0) != color)\n" 11076 " {\n" 11077 " result = vec4(1, 0, 0, 1);\n" 11078 " }\n"; 11079 11080 static const GLchar* compute_shader_template = 11081 "VERSION\n" 11082 "\n" 11083 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 11084 "\n" 11085 "writeonly uniform image2D uni_image;\n" 11086 "\n" 11087 "UNI_GOKU\n" 11088 "\n" 11089 "void main()\n" 11090 "{\n" 11091 " vec4 result = vec4(0, 1, 0, 1);\n" 11092 "\n" 11093 "VERIFICATION" 11094 "\n" 11095 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 11096 "}\n" 11097 "\n"; 11098 11099 static const GLchar* fragment_shader_template = "VERSION\n" 11100 "\n" 11101 "in vec4 gs_fs_result;\n" 11102 "out vec4 fs_out_result;\n" 11103 "\n" 11104 "UNI_GOKU\n" 11105 "\n" 11106 "void main()\n" 11107 "{\n" 11108 " vec4 result = vec4(0, 1, 0, 1);\n" 11109 "\n" 11110 "VERIFICATION" 11111 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 11112 " {\n" 11113 " result = vec4(1, 0, 0, 1);\n" 11114 " }\n" 11115 "\n" 11116 " fs_out_result = result;\n" 11117 "}\n" 11118 "\n"; 11119 11120 static const GLchar* geometry_shader_template = "VERSION\n" 11121 "\n" 11122 "layout(points) in;\n" 11123 "layout(triangle_strip, max_vertices = 4) out;\n" 11124 "\n" 11125 "in vec4 tes_gs_result[];\n" 11126 "out vec4 gs_fs_result;\n" 11127 "\n" 11128 "UNI_GOKU\n" 11129 "\n" 11130 "void main()\n" 11131 "{\n" 11132 " vec4 result = vec4(0, 1, 0, 1);\n" 11133 "\n" 11134 "VERIFICATION" 11135 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 11136 " {\n" 11137 " result = vec4(1, 0, 0, 1);\n" 11138 " }\n" 11139 "\n" 11140 " gs_fs_result = result;\n" 11141 " gl_Position = vec4(-1, -1, 0, 1);\n" 11142 " EmitVertex();\n" 11143 " gs_fs_result = result;\n" 11144 " gl_Position = vec4(-1, 1, 0, 1);\n" 11145 " EmitVertex();\n" 11146 " gs_fs_result = result;\n" 11147 " gl_Position = vec4(1, -1, 0, 1);\n" 11148 " EmitVertex();\n" 11149 " gs_fs_result = result;\n" 11150 " gl_Position = vec4(1, 1, 0, 1);\n" 11151 " EmitVertex();\n" 11152 "}\n" 11153 "\n"; 11154 11155 static const GLchar* tess_ctrl_shader_template = 11156 "VERSION\n" 11157 "\n" 11158 "layout(vertices = 1) out;\n" 11159 "\n" 11160 "in vec4 vs_tcs_result[];\n" 11161 "out vec4 tcs_tes_result[];\n" 11162 "\n" 11163 "UNI_GOKU\n" 11164 "\n" 11165 "void main()\n" 11166 "{\n" 11167 " vec4 result = vec4(0, 1, 0, 1);\n" 11168 "\n" 11169 "VERIFICATION" 11170 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 11171 " {\n" 11172 " result = vec4(1, 0, 0, 1);\n" 11173 " }\n" 11174 "\n" 11175 " tcs_tes_result[gl_InvocationID] = result;\n" 11176 "\n" 11177 " gl_TessLevelOuter[0] = 1.0;\n" 11178 " gl_TessLevelOuter[1] = 1.0;\n" 11179 " gl_TessLevelOuter[2] = 1.0;\n" 11180 " gl_TessLevelOuter[3] = 1.0;\n" 11181 " gl_TessLevelInner[0] = 1.0;\n" 11182 " gl_TessLevelInner[1] = 1.0;\n" 11183 "}\n" 11184 "\n"; 11185 11186 static const GLchar* tess_eval_shader_template = "VERSION\n" 11187 "\n" 11188 "layout(isolines, point_mode) in;\n" 11189 "\n" 11190 "in vec4 tcs_tes_result[];\n" 11191 "out vec4 tes_gs_result;\n" 11192 "\n" 11193 "UNI_GOKU\n" 11194 "\n" 11195 "void main()\n" 11196 "{\n" 11197 " vec4 result = vec4(0, 1, 0, 1);\n" 11198 "\n" 11199 "VERIFICATION" 11200 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 11201 " {\n" 11202 " result = vec4(1, 0, 0, 1);\n" 11203 " }\n" 11204 "\n" 11205 " tes_gs_result = result;\n" 11206 "}\n" 11207 "\n"; 11208 11209 static const GLchar* vertex_shader_template = "VERSION\n" 11210 "\n" 11211 "out vec4 vs_tcs_result;\n" 11212 "\n" 11213 "UNI_GOKU\n" 11214 "\n" 11215 "void main()\n" 11216 "{\n" 11217 " vec4 result = vec4(0, 1, 0, 1);\n" 11218 "\n" 11219 "VERIFICATION" 11220 "\n" 11221 " vs_tcs_result = result;\n" 11222 "}\n" 11223 "\n"; 11224 11225 const GLchar* shader_template = 0; 11226 11227 switch (in_stage) 11228 { 11229 case Utils::COMPUTE_SHADER: 11230 shader_template = compute_shader_template; 11231 break; 11232 case Utils::FRAGMENT_SHADER: 11233 shader_template = fragment_shader_template; 11234 break; 11235 case Utils::GEOMETRY_SHADER: 11236 shader_template = geometry_shader_template; 11237 break; 11238 case Utils::TESS_CTRL_SHADER: 11239 shader_template = tess_ctrl_shader_template; 11240 break; 11241 case Utils::TESS_EVAL_SHADER: 11242 shader_template = tess_eval_shader_template; 11243 break; 11244 case Utils::VERTEX_SHADER: 11245 shader_template = vertex_shader_template; 11246 break; 11247 default: 11248 TCU_FAIL("Invalid enum"); 11249 break; 11250 } 11251 11252 out_source.m_parts[0].m_code = shader_template; 11253 11254 size_t position = 0; 11255 11256 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 11257 out_source.m_parts[0].m_code); 11258 11259 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 11260 11261 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 11262 } 11263 11264 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 11265 * 11266 * @param program Current program 11267 **/ 11268 void BindingSamplerAPIOverrideTest::prepareUniforms(Utils::program& program) 11269 { 11270 static const GLuint goku_data = 0x000000ff; 11271 static const GLint new_binding = 11; 11272 11273 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 11274 11275 const GLint uniform_location = program.getUniformLocation("goku"); 11276 if (-1 == uniform_location) 11277 { 11278 TCU_FAIL("Uniform is inactive"); 11279 } 11280 11281 gl.uniform1i(uniform_location, new_binding); 11282 11283 GLint binding = -1; 11284 11285 gl.getUniformiv(program.m_program_object_id, uniform_location, &binding); 11286 GLU_EXPECT_NO_ERROR(gl.getError(), "getUniformiv"); 11287 11288 if (new_binding != binding) 11289 { 11290 TCU_FAIL("Wrong binding value"); 11291 return; 11292 } 11293 11294 m_goku_texture.create(16, 16, GL_RGBA8); 11295 11296 std::vector<GLuint> texture_data; 11297 texture_data.resize(16 * 16); 11298 11299 for (GLuint i = 0; i < texture_data.size(); ++i) 11300 { 11301 texture_data[i] = goku_data; 11302 } 11303 11304 m_goku_texture.update(16, 16, 0 /* depth */, GL_RGBA, GL_UNSIGNED_BYTE, &texture_data[0]); 11305 11306 gl.activeTexture(GL_TEXTURE11); 11307 GLU_EXPECT_NO_ERROR(gl.getError(), "ActiveTexture"); 11308 11309 m_goku_texture.bind(); 11310 } 11311 11312 /** Overwrite of releaseResource method, release extra texture 11313 * 11314 * @param ignored 11315 **/ 11316 void BindingSamplerAPIOverrideTest::releaseResource() 11317 { 11318 m_goku_texture.release(); 11319 } 11320 11321 /** Constructor 11322 * 11323 * @param context Test context 11324 **/ 11325 BindingSamplerInvalidTest::BindingSamplerInvalidTest(deqp::Context& context) 11326 : NegativeTestBase(context, "binding_sampler_invalid", "Test verifies invalid binding values") 11327 { 11328 /* Nothing to be done here */ 11329 } 11330 11331 /** Set up next test case 11332 * 11333 * @param test_case_index Index of next test case 11334 * 11335 * @return false if there is no more test cases, true otherwise 11336 **/ 11337 bool BindingSamplerInvalidTest::prepareNextTestCase(glw::GLuint test_case_index) 11338 { 11339 switch (test_case_index) 11340 { 11341 case (glw::GLuint)-1: 11342 m_case = TEST_CASES_MAX; 11343 break; 11344 case NEGATIVE_VALUE: 11345 case VARIABLE_NAME: 11346 case STD140: 11347 case MISSING: 11348 m_case = (TESTCASES)test_case_index; 11349 break; 11350 default: 11351 return false; 11352 } 11353 11354 return true; 11355 } 11356 11357 /** Prepare source for given shader stage 11358 * 11359 * @param in_stage Shader stage, compute shader will use 430 11360 * @param in_use_version_400 Select if 400 or 420 should be used 11361 * @param out_source Prepared shader source instance 11362 **/ 11363 void BindingSamplerInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 11364 Utils::shaderSource& out_source) 11365 { 11366 static const GLchar* uni_goku = "layout(binding BINDING) uniform sampler2D goku;\n"; 11367 11368 static const GLchar* verification_snippet = " vec4 color = texture(goku, vec2(0,0));\n" 11369 " if (vec4(1, 0, 0, 0) != color)\n" 11370 " {\n" 11371 " result = vec4(1, 0, 0, 1);\n" 11372 " }\n"; 11373 11374 static const GLchar* compute_shader_template = 11375 "VERSION\n" 11376 "\n" 11377 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 11378 "\n" 11379 "writeonly uniform image2D uni_image;\n" 11380 "\n" 11381 "UNI_GOKU\n" 11382 "\n" 11383 "void main()\n" 11384 "{\n" 11385 " vec4 result = vec4(0, 1, 0, 1);\n" 11386 "\n" 11387 "VERIFICATION" 11388 "\n" 11389 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 11390 "}\n" 11391 "\n"; 11392 11393 static const GLchar* fragment_shader_template = "VERSION\n" 11394 "\n" 11395 "in vec4 gs_fs_result;\n" 11396 "out vec4 fs_out_result;\n" 11397 "\n" 11398 "UNI_GOKU\n" 11399 "\n" 11400 "void main()\n" 11401 "{\n" 11402 " vec4 result = vec4(0, 1, 0, 1);\n" 11403 "\n" 11404 "VERIFICATION" 11405 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 11406 " {\n" 11407 " result = vec4(1, 0, 0, 1);\n" 11408 " }\n" 11409 "\n" 11410 " fs_out_result = result;\n" 11411 "}\n" 11412 "\n"; 11413 11414 static const GLchar* geometry_shader_template = "VERSION\n" 11415 "\n" 11416 "layout(points) in;\n" 11417 "layout(triangle_strip, max_vertices = 4) out;\n" 11418 "\n" 11419 "in vec4 tes_gs_result[];\n" 11420 "out vec4 gs_fs_result;\n" 11421 "\n" 11422 "UNI_GOKU\n" 11423 "\n" 11424 "void main()\n" 11425 "{\n" 11426 " vec4 result = vec4(0, 1, 0, 1);\n" 11427 "\n" 11428 "VERIFICATION" 11429 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 11430 " {\n" 11431 " result = vec4(1, 0, 0, 1);\n" 11432 " }\n" 11433 "\n" 11434 " gs_fs_result = result;\n" 11435 " gl_Position = vec4(-1, -1, 0, 1);\n" 11436 " EmitVertex();\n" 11437 " gs_fs_result = result;\n" 11438 " gl_Position = vec4(-1, 1, 0, 1);\n" 11439 " EmitVertex();\n" 11440 " gs_fs_result = result;\n" 11441 " gl_Position = vec4(1, -1, 0, 1);\n" 11442 " EmitVertex();\n" 11443 " gs_fs_result = result;\n" 11444 " gl_Position = vec4(1, 1, 0, 1);\n" 11445 " EmitVertex();\n" 11446 "}\n" 11447 "\n"; 11448 11449 static const GLchar* tess_ctrl_shader_template = 11450 "VERSION\n" 11451 "\n" 11452 "layout(vertices = 1) out;\n" 11453 "\n" 11454 "in vec4 vs_tcs_result[];\n" 11455 "out vec4 tcs_tes_result[];\n" 11456 "\n" 11457 "UNI_GOKU\n" 11458 "\n" 11459 "void main()\n" 11460 "{\n" 11461 " vec4 result = vec4(0, 1, 0, 1);\n" 11462 "\n" 11463 "VERIFICATION" 11464 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 11465 " {\n" 11466 " result = vec4(1, 0, 0, 1);\n" 11467 " }\n" 11468 "\n" 11469 " tcs_tes_result[gl_InvocationID] = result;\n" 11470 "\n" 11471 " gl_TessLevelOuter[0] = 1.0;\n" 11472 " gl_TessLevelOuter[1] = 1.0;\n" 11473 " gl_TessLevelOuter[2] = 1.0;\n" 11474 " gl_TessLevelOuter[3] = 1.0;\n" 11475 " gl_TessLevelInner[0] = 1.0;\n" 11476 " gl_TessLevelInner[1] = 1.0;\n" 11477 "}\n" 11478 "\n"; 11479 11480 static const GLchar* tess_eval_shader_template = "VERSION\n" 11481 "\n" 11482 "layout(isolines, point_mode) in;\n" 11483 "\n" 11484 "in vec4 tcs_tes_result[];\n" 11485 "out vec4 tes_gs_result;\n" 11486 "\n" 11487 "UNI_GOKU\n" 11488 "\n" 11489 "void main()\n" 11490 "{\n" 11491 " vec4 result = vec4(0, 1, 0, 1);\n" 11492 "\n" 11493 "VERIFICATION" 11494 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 11495 " {\n" 11496 " result = vec4(1, 0, 0, 1);\n" 11497 " }\n" 11498 "\n" 11499 " tes_gs_result = result;\n" 11500 "}\n" 11501 "\n"; 11502 11503 static const GLchar* vertex_shader_template = "VERSION\n" 11504 "\n" 11505 "out vec4 vs_tcs_result;\n" 11506 "\n" 11507 "UNI_GOKU\n" 11508 "\n" 11509 "void main()\n" 11510 "{\n" 11511 " vec4 result = vec4(0, 1, 0, 1);\n" 11512 "\n" 11513 "VERIFICATION" 11514 "\n" 11515 " vs_tcs_result = result;\n" 11516 "}\n" 11517 "\n"; 11518 11519 const GLchar* shader_template = 0; 11520 11521 switch (in_stage) 11522 { 11523 case Utils::COMPUTE_SHADER: 11524 shader_template = compute_shader_template; 11525 break; 11526 case Utils::FRAGMENT_SHADER: 11527 shader_template = fragment_shader_template; 11528 break; 11529 case Utils::GEOMETRY_SHADER: 11530 shader_template = geometry_shader_template; 11531 break; 11532 case Utils::TESS_CTRL_SHADER: 11533 shader_template = tess_ctrl_shader_template; 11534 break; 11535 case Utils::TESS_EVAL_SHADER: 11536 shader_template = tess_eval_shader_template; 11537 break; 11538 case Utils::VERTEX_SHADER: 11539 shader_template = vertex_shader_template; 11540 break; 11541 default: 11542 TCU_FAIL("Invalid enum"); 11543 break; 11544 } 11545 11546 out_source.m_parts[0].m_code = shader_template; 11547 11548 size_t position = 0; 11549 11550 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 11551 out_source.m_parts[0].m_code); 11552 11553 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 11554 11555 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 11556 11557 Utils::replaceAllTokens("BINDING", getCaseString(m_case), out_source.m_parts[0].m_code); 11558 } 11559 11560 const GLchar* BindingSamplerInvalidTest::getCaseString(TESTCASES test_case) 11561 { 11562 (void)test_case; 11563 const GLchar* binding = 0; 11564 11565 switch (m_case) 11566 { 11567 case NEGATIVE_VALUE: 11568 binding = "= -1"; 11569 break; 11570 case VARIABLE_NAME: 11571 binding = "= goku"; 11572 break; 11573 case STD140: 11574 binding = "= std140"; 11575 break; 11576 case MISSING: 11577 binding = ""; 11578 break; 11579 case TEST_CASES_MAX: 11580 binding = "= 0"; 11581 break; 11582 default: 11583 TCU_FAIL("Invalid enum"); 11584 } 11585 11586 return binding; 11587 } 11588 11589 /* Constants used by BindingImagesTest */ 11590 const GLuint BindingImagesTest::m_goku_data = 0x000000ff; 11591 const GLuint BindingImagesTest::m_vegeta_data = 0x0000ff00; 11592 const GLuint BindingImagesTest::m_trunks_data = 0x00ff0000; 11593 11594 /** Constructor 11595 * 11596 * @param context Test context 11597 **/ 11598 BindingImagesTest::BindingImagesTest(deqp::Context& context) 11599 : BindingImageTest(context, "binding_images", "Test verifies binding of images") 11600 , m_goku_texture(context) 11601 , m_vegeta_texture(context) 11602 , m_trunks_texture(context) 11603 , m_goku_buffer(context) 11604 , m_vegeta_buffer(context) 11605 , m_trunks_buffer(context) 11606 { 11607 /* Nothing to be done here */ 11608 } 11609 11610 /** Set up next test case 11611 * 11612 * @param test_case_index Index of next test case 11613 * 11614 * @return false if there is no more test cases, true otherwise 11615 **/ 11616 bool BindingImagesTest::prepareNextTestCase(glw::GLuint test_case_index) 11617 { 11618 switch (test_case_index) 11619 { 11620 case (glw::GLuint)-1: 11621 case 0: 11622 m_test_case = Utils::TEX_2D; 11623 break; 11624 case 1: 11625 m_test_case = Utils::TEX_BUFFER; 11626 break; 11627 case 2: 11628 m_test_case = Utils::TEX_2D_RECT; 11629 break; 11630 case 3: 11631 m_test_case = Utils::TEX_2D_ARRAY; 11632 break; 11633 case 4: 11634 m_test_case = Utils::TEX_3D; 11635 break; 11636 case 5: 11637 m_test_case = Utils::TEX_CUBE; 11638 break; 11639 case 6: 11640 m_test_case = Utils::TEX_1D; 11641 break; 11642 case 7: 11643 m_test_case = Utils::TEX_1D_ARRAY; 11644 break; 11645 default: 11646 return false; 11647 break; 11648 } 11649 11650 m_context.getTestContext().getLog() << tcu::TestLog::Message 11651 << "Tested texture type: " << Utils::getTextureTypeName(m_test_case) 11652 << tcu::TestLog::EndMessage; 11653 11654 return true; 11655 } 11656 11657 /** Prepare source for given shader stage 11658 * 11659 * @param in_stage Shader stage, compute shader will use 430 11660 * @param in_use_version_400 Select if 400 or 420 should be used 11661 * @param out_source Prepared shader source instance 11662 **/ 11663 void BindingImagesTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 11664 Utils::shaderSource& out_source) 11665 { 11666 static const GLchar* uni_goku = "layout(binding = 1, rgba8) uniform TYPE goku;\n"; 11667 11668 static const GLchar* uni_vegeta = "layout(binding = 2, rgba8) uniform TYPE vegeta;\n"; 11669 11670 static const GLchar* uni_trunks = "layout(binding = 4, rgba8) uniform TYPE trunks;\n\n"; 11671 11672 static const GLchar* verification_snippet = " TEX_COORD_TYPE tex_coord_read = TEX_COORD_TYPE(COORDINATES);\n" 11673 " TEX_COORD_TYPE tex_coord_write = TEX_COORD_TYPE(COORDINATES);\n" 11674 " vec4 goku_color = imageLoad(goku, tex_coord_read);\n" 11675 " vec4 vegeta_color = imageLoad(vegeta, tex_coord_read);\n" 11676 " vec4 trunks_color = imageLoad(trunks, tex_coord_read);\n" 11677 "\n" 11678 " imageStore(goku, tex_coord_write, vec4(0, 1, 0, 1));\n" 11679 " imageStore(vegeta, tex_coord_write, vec4(0, 1, 0, 1));\n" 11680 " imageStore(trunks, tex_coord_write, vec4(0, 1, 0, 1));\n" 11681 "\n" 11682 " if ((vec4(1, 0, 0, 0) != goku_color) ||\n" 11683 " (vec4(0, 1, 0, 0) != vegeta_color) ||\n" 11684 " (vec4(0, 0, 1, 0) != trunks_color) )\n" 11685 " {\n" 11686 " result = goku_color;\n" 11687 " //result = vec4(1, 0, 0, 1);\n" 11688 " }\n"; 11689 11690 static const GLchar* compute_shader_template = 11691 "VERSION\n" 11692 "#extension GL_ARB_shader_image_load_store : enable\n" 11693 "\n" 11694 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 11695 "\n" 11696 "writeonly uniform image2D uni_image;\n" 11697 "\n" 11698 "UNI_GOKU\n" 11699 "UNI_VEGETA\n" 11700 "UNI_TRUNKS\n" 11701 "\n" 11702 "void main()\n" 11703 "{\n" 11704 " vec4 result = vec4(0, 1, 0, 1);\n" 11705 "\n" 11706 " if(gl_GlobalInvocationID.xy == vec2(0, 0)) {\n" 11707 "VERIFICATION" 11708 " }\n" 11709 "\n" 11710 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 11711 "}\n" 11712 "\n"; 11713 11714 static const GLchar* fragment_shader_template = "VERSION\n" 11715 "#extension GL_ARB_shader_image_load_store : enable\n" 11716 "\n" 11717 "in vec4 gs_fs_result;\n" 11718 "out vec4 fs_out_result;\n" 11719 "\n" 11720 "UNI_GOKU\n" 11721 "UNI_VEGETA\n" 11722 "UNI_TRUNKS\n" 11723 "\n" 11724 "void main()\n" 11725 "{\n" 11726 " vec4 result = vec4(0, 1, 0, 1);\n" 11727 "\n" 11728 "VERIFICATION" 11729 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 11730 " {\n" 11731 " result = vec4(1, 0, 0, 1);\n" 11732 " }\n" 11733 "\n" 11734 " fs_out_result = result;\n" 11735 "}\n" 11736 "\n"; 11737 11738 static const GLchar* geometry_shader_template = "VERSION\n" 11739 "#extension GL_ARB_shader_image_load_store : enable\n" 11740 "\n" 11741 "layout(points) in;\n" 11742 "layout(triangle_strip, max_vertices = 4) out;\n" 11743 "\n" 11744 "in vec4 tes_gs_result[];\n" 11745 "out vec4 gs_fs_result;\n" 11746 "\n" 11747 "UNI_TRUNKS\n" 11748 "UNI_GOKU\n" 11749 "UNI_VEGETA\n" 11750 "\n" 11751 "void main()\n" 11752 "{\n" 11753 " vec4 result = vec4(0, 1, 0, 1);\n" 11754 "\n" 11755 "VERIFICATION" 11756 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 11757 " {\n" 11758 " result = vec4(1, 0, 0, 1);\n" 11759 " }\n" 11760 "\n" 11761 " gs_fs_result = result;\n" 11762 " gl_Position = vec4(-1, -1, 0, 1);\n" 11763 " EmitVertex();\n" 11764 " gs_fs_result = result;\n" 11765 " gl_Position = vec4(-1, 1, 0, 1);\n" 11766 " EmitVertex();\n" 11767 " gs_fs_result = result;\n" 11768 " gl_Position = vec4(1, -1, 0, 1);\n" 11769 " EmitVertex();\n" 11770 " gs_fs_result = result;\n" 11771 " gl_Position = vec4(1, 1, 0, 1);\n" 11772 " EmitVertex();\n" 11773 "}\n" 11774 "\n"; 11775 11776 static const GLchar* tess_ctrl_shader_template = 11777 "VERSION\n" 11778 "#extension GL_ARB_shader_image_load_store : enable\n" 11779 "\n" 11780 "layout(vertices = 1) out;\n" 11781 "\n" 11782 "in vec4 vs_tcs_result[];\n" 11783 "out vec4 tcs_tes_result[];\n" 11784 "\n" 11785 "UNI_VEGETA\n" 11786 "UNI_TRUNKS\n" 11787 "UNI_GOKU\n" 11788 "\n" 11789 "void main()\n" 11790 "{\n" 11791 " vec4 result = vec4(0, 1, 0, 1);\n" 11792 "\n" 11793 "VERIFICATION" 11794 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 11795 " {\n" 11796 " result = vec4(1, 0, 0, 1);\n" 11797 " }\n" 11798 "\n" 11799 " tcs_tes_result[gl_InvocationID] = result;\n" 11800 "\n" 11801 " gl_TessLevelOuter[0] = 1.0;\n" 11802 " gl_TessLevelOuter[1] = 1.0;\n" 11803 " gl_TessLevelOuter[2] = 1.0;\n" 11804 " gl_TessLevelOuter[3] = 1.0;\n" 11805 " gl_TessLevelInner[0] = 1.0;\n" 11806 " gl_TessLevelInner[1] = 1.0;\n" 11807 "}\n" 11808 "\n"; 11809 11810 static const GLchar* tess_eval_shader_template = "VERSION\n" 11811 "#extension GL_ARB_shader_image_load_store : enable\n" 11812 "\n" 11813 "layout(isolines, point_mode) in;\n" 11814 "\n" 11815 "in vec4 tcs_tes_result[];\n" 11816 "out vec4 tes_gs_result;\n" 11817 "\n" 11818 "UNI_GOKU\n" 11819 "UNI_TRUNKS\n" 11820 "UNI_VEGETA\n" 11821 "\n" 11822 "void main()\n" 11823 "{\n" 11824 " vec4 result = vec4(0, 1, 0, 1);\n" 11825 "\n" 11826 "VERIFICATION" 11827 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 11828 " {\n" 11829 " result = vec4(1, 0, 0, 1);\n" 11830 " }\n" 11831 "\n" 11832 " tes_gs_result = result;\n" 11833 "}\n" 11834 "\n"; 11835 11836 static const GLchar* vertex_shader_template = "VERSION\n" 11837 "#extension GL_ARB_shader_image_load_store : enable\n" 11838 "\n" 11839 "out vec4 vs_tcs_result;\n" 11840 "\n" 11841 "UNI_TRUNKS\n" 11842 "UNI_VEGETA\n" 11843 "UNI_GOKU\n" 11844 "\n" 11845 "void main()\n" 11846 "{\n" 11847 " vec4 result = vec4(0, 1, 0, 1);\n" 11848 "\n" 11849 "VERIFICATION" 11850 "\n" 11851 " vs_tcs_result = result;\n" 11852 "}\n" 11853 "\n"; 11854 11855 const GLchar* coordinates_read = 0; 11856 const GLchar* coordinates_write = 0; 11857 const GLchar* image_type = Utils::getImageType(m_test_case); 11858 GLuint n_coordinates = Utils::getNumberOfCoordinates(m_test_case); 11859 const GLchar* shader_template = 0; 11860 const GLchar* tex_coord_type = Utils::getTypeName(Utils::INT, 1 /* n_columns */, n_coordinates); 11861 11862 switch (in_stage) 11863 { 11864 case Utils::COMPUTE_SHADER: 11865 shader_template = compute_shader_template; 11866 break; 11867 case Utils::FRAGMENT_SHADER: 11868 shader_template = fragment_shader_template; 11869 break; 11870 case Utils::GEOMETRY_SHADER: 11871 shader_template = geometry_shader_template; 11872 break; 11873 case Utils::TESS_CTRL_SHADER: 11874 shader_template = tess_ctrl_shader_template; 11875 break; 11876 case Utils::TESS_EVAL_SHADER: 11877 shader_template = tess_eval_shader_template; 11878 break; 11879 case Utils::VERTEX_SHADER: 11880 shader_template = vertex_shader_template; 11881 break; 11882 default: 11883 TCU_FAIL("Invalid enum"); 11884 break; 11885 } 11886 11887 switch (n_coordinates) 11888 { 11889 case 1: 11890 coordinates_read = "1"; 11891 coordinates_write = "0"; 11892 break; 11893 case 2: 11894 coordinates_read = "1, 0"; 11895 coordinates_write = "0, 0"; 11896 break; 11897 case 3: 11898 coordinates_read = "1, 0, 0"; 11899 coordinates_write = "0, 0, 0"; 11900 break; 11901 case 4: 11902 coordinates_read = "1, 0, 0, 0"; 11903 coordinates_write = "0, 0, 0, 0"; 11904 break; 11905 } 11906 11907 out_source.m_parts[0].m_code = shader_template; 11908 11909 size_t position = 0; 11910 11911 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 11912 out_source.m_parts[0].m_code); 11913 11914 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 11915 11916 position -= strlen(verification_snippet); 11917 11918 Utils::replaceToken("COORDINATES", position, coordinates_read, out_source.m_parts[0].m_code); 11919 11920 Utils::replaceToken("COORDINATES", position, coordinates_write, out_source.m_parts[0].m_code); 11921 11922 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 11923 11924 Utils::replaceAllTokens("UNI_VEGETA", uni_vegeta, out_source.m_parts[0].m_code); 11925 11926 Utils::replaceAllTokens("UNI_TRUNKS", uni_trunks, out_source.m_parts[0].m_code); 11927 11928 Utils::replaceAllTokens("TEX_COORD_TYPE", tex_coord_type, out_source.m_parts[0].m_code); 11929 11930 Utils::replaceAllTokens("TYPE", image_type, out_source.m_parts[0].m_code); 11931 } 11932 11933 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 11934 * 11935 * @param program Current program 11936 **/ 11937 void BindingImagesTest::prepareUniforms(Utils::program& program) 11938 { 11939 (void)program; 11940 prepareBuffer(m_goku_buffer, m_goku_data); 11941 prepareBuffer(m_vegeta_buffer, m_vegeta_data); 11942 prepareBuffer(m_trunks_buffer, m_trunks_data); 11943 11944 prepareTexture(m_goku_texture, m_goku_buffer, m_test_case, m_goku_data, 1); 11945 prepareTexture(m_vegeta_texture, m_vegeta_buffer, m_test_case, m_vegeta_data, 2); 11946 prepareTexture(m_trunks_texture, m_trunks_buffer, m_test_case, m_trunks_data, 4); 11947 } 11948 11949 /** Overwrite of releaseResource method, release extra buffers and textures 11950 * 11951 * @param ignored 11952 **/ 11953 void BindingImagesTest::releaseResource() 11954 { 11955 m_goku_texture.release(); 11956 m_vegeta_texture.release(); 11957 m_trunks_texture.release(); 11958 if (m_test_case != Utils::TEX_BUFFER) 11959 { 11960 m_goku_buffer.release(); 11961 m_vegeta_buffer.release(); 11962 m_trunks_buffer.release(); 11963 } 11964 } 11965 11966 /** Verify that all images have green texel at [0,0,0,0] 11967 * 11968 * @return true texel is green, false otherwise 11969 **/ 11970 bool BindingImagesTest::verifyAdditionalResults() const 11971 { 11972 if (Utils::TEX_BUFFER != m_test_case) 11973 { 11974 return (verifyTexture(m_goku_texture) && verifyTexture(m_vegeta_texture) && verifyTexture(m_trunks_texture)); 11975 } 11976 else 11977 { 11978 return (verifyBuffer(m_goku_buffer) && verifyBuffer(m_vegeta_buffer) && verifyBuffer(m_trunks_buffer)); 11979 } 11980 } 11981 11982 /** Constructor 11983 * 11984 * @param context Test context 11985 **/ 11986 BindingImageSingleTest::BindingImageSingleTest(deqp::Context& context) 11987 : BindingImageTest(context, "binding_image_single", "Test verifies single binding of image used in multiple stages") 11988 , m_goku_texture(context) 11989 { 11990 /* Nothing to be done here */ 11991 } 11992 11993 /** Set up next test case 11994 * 11995 * @param test_case_index Index of next test case 11996 * 11997 * @return false if there is no more test cases, true otherwise 11998 **/ 11999 bool BindingImageSingleTest::prepareNextTestCase(glw::GLuint test_case_index) 12000 { 12001 switch (test_case_index) 12002 { 12003 case (glw::GLuint)-1: 12004 case 0: 12005 m_test_stage = Utils::VERTEX_SHADER; 12006 break; 12007 case 1: 12008 m_test_stage = Utils::TESS_CTRL_SHADER; 12009 break; 12010 case 2: 12011 m_test_stage = Utils::TESS_EVAL_SHADER; 12012 break; 12013 case 3: 12014 m_test_stage = Utils::GEOMETRY_SHADER; 12015 break; 12016 case 4: 12017 m_test_stage = Utils::FRAGMENT_SHADER; 12018 break; 12019 default: 12020 return false; 12021 break; 12022 } 12023 12024 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Tested stage: " 12025 << Utils::getShaderStageName((Utils::SHADER_STAGES)m_test_stage) 12026 << tcu::TestLog::EndMessage; 12027 12028 return true; 12029 } 12030 12031 /** Prepare source for given shader stage 12032 * 12033 * @param in_stage Shader stage, compute shader will use 430 12034 * @param in_use_version_400 Select if 400 or 420 should be used 12035 * @param out_source Prepared shader source instance 12036 **/ 12037 void BindingImageSingleTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 12038 Utils::shaderSource& out_source) 12039 { 12040 static const GLchar* uni_goku_with_binding = "layout(binding = 2, rgba8) uniform image2D goku;\n"; 12041 12042 static const GLchar* uni_goku_no_binding = "layout(rgba8) uniform image2D goku;\n"; 12043 12044 static const GLchar* verification_snippet = " vec4 goku_color = imageLoad(goku, ivec2(0,1));\n" 12045 "\n" 12046 " imageStore(goku, ivec2(0,0), vec4(0, 1, 0, 1));\n" 12047 "\n" 12048 " if (vec4(1, 0, 0, 0) != goku_color)\n" 12049 " {\n" 12050 " result = vec4(1, 0, 0, 1);\n" 12051 " }\n"; 12052 12053 static const GLchar* compute_shader_template = 12054 "VERSION\n" 12055 "#extension GL_ARB_shader_image_load_store : enable\n" 12056 "\n" 12057 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 12058 "\n" 12059 "writeonly uniform image2D uni_image;\n" 12060 "\n" 12061 "UNI_GOKU\n" 12062 "\n" 12063 "void main()\n" 12064 "{\n" 12065 " vec4 result = vec4(0, 1, 0, 1);\n" 12066 "\n" 12067 "VERIFICATION" 12068 "\n" 12069 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 12070 "}\n" 12071 "\n"; 12072 12073 static const GLchar* fragment_shader_template = "VERSION\n" 12074 "#extension GL_ARB_shader_image_load_store : enable\n" 12075 "\n" 12076 "in vec4 gs_fs_result;\n" 12077 "out vec4 fs_out_result;\n" 12078 "\n" 12079 "UNI_GOKU\n" 12080 "\n" 12081 "void main()\n" 12082 "{\n" 12083 " vec4 result = vec4(0, 1, 0, 1);\n" 12084 "\n" 12085 "VERIFICATION" 12086 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 12087 " {\n" 12088 " result = vec4(1, 0, 0, 1);\n" 12089 " }\n" 12090 "\n" 12091 " fs_out_result = result;\n" 12092 "}\n" 12093 "\n"; 12094 12095 static const GLchar* geometry_shader_template = "VERSION\n" 12096 "#extension GL_ARB_shader_image_load_store : enable\n" 12097 "\n" 12098 "layout(points) in;\n" 12099 "layout(triangle_strip, max_vertices = 4) out;\n" 12100 "\n" 12101 "in vec4 tes_gs_result[];\n" 12102 "out vec4 gs_fs_result;\n" 12103 "\n" 12104 "UNI_GOKU\n" 12105 "\n" 12106 "void main()\n" 12107 "{\n" 12108 " vec4 result = vec4(0, 1, 0, 1);\n" 12109 "\n" 12110 "VERIFICATION" 12111 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 12112 " {\n" 12113 " result = vec4(1, 0, 0, 1);\n" 12114 " }\n" 12115 "\n" 12116 " gs_fs_result = result;\n" 12117 " gl_Position = vec4(-1, -1, 0, 1);\n" 12118 " EmitVertex();\n" 12119 " gs_fs_result = result;\n" 12120 " gl_Position = vec4(-1, 1, 0, 1);\n" 12121 " EmitVertex();\n" 12122 " gs_fs_result = result;\n" 12123 " gl_Position = vec4(1, -1, 0, 1);\n" 12124 " EmitVertex();\n" 12125 " gs_fs_result = result;\n" 12126 " gl_Position = vec4(1, 1, 0, 1);\n" 12127 " EmitVertex();\n" 12128 "}\n" 12129 "\n"; 12130 12131 static const GLchar* tess_ctrl_shader_template = 12132 "VERSION\n" 12133 "#extension GL_ARB_shader_image_load_store : enable\n" 12134 "\n" 12135 "layout(vertices = 1) out;\n" 12136 "\n" 12137 "in vec4 vs_tcs_result[];\n" 12138 "out vec4 tcs_tes_result[];\n" 12139 "\n" 12140 "UNI_GOKU\n" 12141 "\n" 12142 "void main()\n" 12143 "{\n" 12144 " vec4 result = vec4(0, 1, 0, 1);\n" 12145 "\n" 12146 "VERIFICATION" 12147 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 12148 " {\n" 12149 " result = vec4(1, 0, 0, 1);\n" 12150 " }\n" 12151 "\n" 12152 " tcs_tes_result[gl_InvocationID] = result;\n" 12153 "\n" 12154 " gl_TessLevelOuter[0] = 1.0;\n" 12155 " gl_TessLevelOuter[1] = 1.0;\n" 12156 " gl_TessLevelOuter[2] = 1.0;\n" 12157 " gl_TessLevelOuter[3] = 1.0;\n" 12158 " gl_TessLevelInner[0] = 1.0;\n" 12159 " gl_TessLevelInner[1] = 1.0;\n" 12160 "}\n" 12161 "\n"; 12162 12163 static const GLchar* tess_eval_shader_template = "VERSION\n" 12164 "#extension GL_ARB_shader_image_load_store : enable\n" 12165 "\n" 12166 "layout(isolines, point_mode) in;\n" 12167 "\n" 12168 "in vec4 tcs_tes_result[];\n" 12169 "out vec4 tes_gs_result;\n" 12170 "\n" 12171 "UNI_GOKU\n" 12172 "\n" 12173 "void main()\n" 12174 "{\n" 12175 " vec4 result = vec4(0, 1, 0, 1);\n" 12176 "\n" 12177 "VERIFICATION" 12178 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 12179 " {\n" 12180 " result = vec4(1, 0, 0, 1);\n" 12181 " }\n" 12182 "\n" 12183 " tes_gs_result = result;\n" 12184 "}\n" 12185 "\n"; 12186 12187 static const GLchar* vertex_shader_template = "VERSION\n" 12188 "#extension GL_ARB_shader_image_load_store : enable\n" 12189 "\n" 12190 "out vec4 vs_tcs_result;\n" 12191 "\n" 12192 "UNI_GOKU\n" 12193 "\n" 12194 "void main()\n" 12195 "{\n" 12196 " vec4 result = vec4(0, 1, 0, 1);\n" 12197 "\n" 12198 "VERIFICATION" 12199 "\n" 12200 " vs_tcs_result = result;\n" 12201 "}\n" 12202 "\n"; 12203 12204 const GLchar* shader_template = 0; 12205 const GLchar* uniform_definition = uni_goku_no_binding; 12206 12207 switch (in_stage) 12208 { 12209 case Utils::COMPUTE_SHADER: 12210 shader_template = compute_shader_template; 12211 uniform_definition = uni_goku_with_binding; 12212 break; 12213 case Utils::FRAGMENT_SHADER: 12214 shader_template = fragment_shader_template; 12215 break; 12216 case Utils::GEOMETRY_SHADER: 12217 shader_template = geometry_shader_template; 12218 break; 12219 case Utils::TESS_CTRL_SHADER: 12220 shader_template = tess_ctrl_shader_template; 12221 break; 12222 case Utils::TESS_EVAL_SHADER: 12223 shader_template = tess_eval_shader_template; 12224 break; 12225 case Utils::VERTEX_SHADER: 12226 shader_template = vertex_shader_template; 12227 break; 12228 default: 12229 TCU_FAIL("Invalid enum"); 12230 break; 12231 } 12232 12233 if (in_stage == m_test_stage) 12234 { 12235 uniform_definition = uni_goku_with_binding; 12236 } 12237 12238 out_source.m_parts[0].m_code = shader_template; 12239 12240 size_t position = 0; 12241 12242 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 12243 out_source.m_parts[0].m_code); 12244 12245 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 12246 12247 Utils::replaceAllTokens("UNI_GOKU", uniform_definition, out_source.m_parts[0].m_code); 12248 } 12249 12250 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 12251 * 12252 * @param program Current program 12253 **/ 12254 void BindingImageSingleTest::prepareUniforms(Utils::program& program) 12255 { 12256 (void)program; 12257 static const GLuint goku_data = 0x000000ff; 12258 12259 prepareTexture(m_goku_texture, Utils::buffer(m_context), Utils::TEX_2D, goku_data, 2 /* unit */); 12260 } 12261 12262 /** Overwrite of releaseResource method, release extra texture 12263 * 12264 * @param ignored 12265 **/ 12266 void BindingImageSingleTest::releaseResource() 12267 { 12268 m_goku_texture.release(); 12269 } 12270 12271 /** Verify that all images have green texel at [0,0,0,0] 12272 * 12273 * @return true texel is green, false otherwise 12274 **/ 12275 bool BindingImageSingleTest::verifyAdditionalResults() const 12276 { 12277 return verifyTexture(m_goku_texture); 12278 } 12279 12280 /** Constructor 12281 * 12282 * @param context Test context 12283 **/ 12284 BindingImageArrayTest::BindingImageArrayTest(deqp::Context& context) 12285 : BindingImageTest(context, "binding_image_array", "Test verifies binding of image array") 12286 , m_goku_00_texture(context) 12287 , m_goku_01_texture(context) 12288 , m_goku_02_texture(context) 12289 , m_goku_03_texture(context) 12290 , m_goku_04_texture(context) 12291 , m_goku_05_texture(context) 12292 , m_goku_06_texture(context) 12293 { 12294 /* Nothing to be done here */ 12295 } 12296 12297 /** Prepare source for given shader stage 12298 * 12299 * @param in_stage Shader stage, compute shader will use 430 12300 * @param in_use_version_400 Select if 400 or 420 should be used 12301 * @param out_source Prepared shader source instance 12302 **/ 12303 void BindingImageArrayTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 12304 Utils::shaderSource& out_source) 12305 { 12306 static const GLchar* uni_goku = "layout(binding = 1, rgba8) uniform image2D goku[7];\n"; 12307 12308 static const GLchar* verification_snippet = " vec4 color[7];\n" 12309 "\n" 12310 " for (uint i = 0u; i < 7; ++i)\n" 12311 " {\n" 12312 " color[i] = imageLoad(goku[i], ivec2(0,0));\n" 12313 " }\n" 12314 "\n" 12315 " if ((vec4(0, 0, 0, 0) != color[0]) ||\n" 12316 " (vec4(0, 0, 0, 1) != color[1]) ||\n" 12317 " (vec4(0, 0, 1, 0) != color[2]) ||\n" 12318 " (vec4(0, 0, 1, 1) != color[3]) ||\n" 12319 " (vec4(0, 1, 0, 0) != color[4]) ||\n" 12320 " (vec4(0, 1, 0, 1) != color[5]) ||\n" 12321 " (vec4(0, 1, 1, 0) != color[6]) )\n" 12322 " {\n" 12323 " result = vec4(1, 0, 0, 1);\n" 12324 " }\n"; 12325 12326 static const GLchar* compute_shader_template = 12327 "VERSION\n" 12328 "#extension GL_ARB_shader_image_load_store : enable\n" 12329 "\n" 12330 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 12331 "\n" 12332 "writeonly uniform image2D uni_image;\n" 12333 "\n" 12334 "UNI_GOKU\n" 12335 "\n" 12336 "void main()\n" 12337 "{\n" 12338 " vec4 result = vec4(0, 1, 0, 1);\n" 12339 "\n" 12340 "VERIFICATION" 12341 "\n" 12342 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 12343 "}\n" 12344 "\n"; 12345 12346 static const GLchar* fragment_shader_template = "VERSION\n" 12347 "#extension GL_ARB_shader_image_load_store : enable\n" 12348 "\n" 12349 "in vec4 gs_fs_result;\n" 12350 "out vec4 fs_out_result;\n" 12351 "\n" 12352 "UNI_GOKU\n" 12353 "\n" 12354 "void main()\n" 12355 "{\n" 12356 " vec4 result = vec4(0, 1, 0, 1);\n" 12357 "\n" 12358 "VERIFICATION" 12359 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 12360 " {\n" 12361 " result = vec4(1, 0, 0, 1);\n" 12362 " }\n" 12363 "\n" 12364 " fs_out_result = result;\n" 12365 "}\n" 12366 "\n"; 12367 12368 static const GLchar* geometry_shader_template = "VERSION\n" 12369 "#extension GL_ARB_shader_image_load_store : enable\n" 12370 "\n" 12371 "layout(points) in;\n" 12372 "layout(triangle_strip, max_vertices = 4) out;\n" 12373 "\n" 12374 "in vec4 tes_gs_result[];\n" 12375 "out vec4 gs_fs_result;\n" 12376 "\n" 12377 "UNI_GOKU\n" 12378 "\n" 12379 "void main()\n" 12380 "{\n" 12381 " vec4 result = vec4(0, 1, 0, 1);\n" 12382 "\n" 12383 "VERIFICATION" 12384 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 12385 " {\n" 12386 " result = vec4(1, 0, 0, 1);\n" 12387 " }\n" 12388 "\n" 12389 " gs_fs_result = result;\n" 12390 " gl_Position = vec4(-1, -1, 0, 1);\n" 12391 " EmitVertex();\n" 12392 " gs_fs_result = result;\n" 12393 " gl_Position = vec4(-1, 1, 0, 1);\n" 12394 " EmitVertex();\n" 12395 " gs_fs_result = result;\n" 12396 " gl_Position = vec4(1, -1, 0, 1);\n" 12397 " EmitVertex();\n" 12398 " gs_fs_result = result;\n" 12399 " gl_Position = vec4(1, 1, 0, 1);\n" 12400 " EmitVertex();\n" 12401 "}\n" 12402 "\n"; 12403 12404 static const GLchar* tess_ctrl_shader_template = 12405 "VERSION\n" 12406 "#extension GL_ARB_shader_image_load_store : enable\n" 12407 "\n" 12408 "layout(vertices = 1) out;\n" 12409 "\n" 12410 "in vec4 vs_tcs_result[];\n" 12411 "out vec4 tcs_tes_result[];\n" 12412 "\n" 12413 "UNI_GOKU\n" 12414 "\n" 12415 "void main()\n" 12416 "{\n" 12417 " vec4 result = vec4(0, 1, 0, 1);\n" 12418 "\n" 12419 "VERIFICATION" 12420 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 12421 " {\n" 12422 " result = vec4(1, 0, 0, 1);\n" 12423 " }\n" 12424 "\n" 12425 " tcs_tes_result[gl_InvocationID] = result;\n" 12426 "\n" 12427 " gl_TessLevelOuter[0] = 1.0;\n" 12428 " gl_TessLevelOuter[1] = 1.0;\n" 12429 " gl_TessLevelOuter[2] = 1.0;\n" 12430 " gl_TessLevelOuter[3] = 1.0;\n" 12431 " gl_TessLevelInner[0] = 1.0;\n" 12432 " gl_TessLevelInner[1] = 1.0;\n" 12433 "}\n" 12434 "\n"; 12435 12436 static const GLchar* tess_eval_shader_template = "VERSION\n" 12437 "#extension GL_ARB_shader_image_load_store : enable\n" 12438 "\n" 12439 "layout(isolines, point_mode) in;\n" 12440 "\n" 12441 "in vec4 tcs_tes_result[];\n" 12442 "out vec4 tes_gs_result;\n" 12443 "\n" 12444 "UNI_GOKU\n" 12445 "\n" 12446 "void main()\n" 12447 "{\n" 12448 " vec4 result = vec4(0, 1, 0, 1);\n" 12449 "\n" 12450 "VERIFICATION" 12451 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 12452 " {\n" 12453 " result = vec4(1, 0, 0, 1);\n" 12454 " }\n" 12455 "\n" 12456 " tes_gs_result = result;\n" 12457 "}\n" 12458 "\n"; 12459 12460 static const GLchar* vertex_shader_template = "VERSION\n" 12461 "#extension GL_ARB_shader_image_load_store : enable\n" 12462 "\n" 12463 "out vec4 vs_tcs_result;\n" 12464 "\n" 12465 "UNI_GOKU\n" 12466 "\n" 12467 "void main()\n" 12468 "{\n" 12469 " vec4 result = vec4(0, 1, 0, 1);\n" 12470 "\n" 12471 "VERIFICATION" 12472 "\n" 12473 " vs_tcs_result = result;\n" 12474 "}\n" 12475 "\n"; 12476 12477 const GLchar* shader_template = 0; 12478 12479 switch (in_stage) 12480 { 12481 case Utils::COMPUTE_SHADER: 12482 shader_template = compute_shader_template; 12483 break; 12484 case Utils::FRAGMENT_SHADER: 12485 shader_template = fragment_shader_template; 12486 break; 12487 case Utils::GEOMETRY_SHADER: 12488 shader_template = geometry_shader_template; 12489 break; 12490 case Utils::TESS_CTRL_SHADER: 12491 shader_template = tess_ctrl_shader_template; 12492 break; 12493 case Utils::TESS_EVAL_SHADER: 12494 shader_template = tess_eval_shader_template; 12495 break; 12496 case Utils::VERTEX_SHADER: 12497 shader_template = vertex_shader_template; 12498 break; 12499 default: 12500 TCU_FAIL("Invalid enum"); 12501 break; 12502 } 12503 12504 out_source.m_parts[0].m_code = shader_template; 12505 12506 size_t position = 0; 12507 12508 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 12509 out_source.m_parts[0].m_code); 12510 12511 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 12512 12513 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 12514 } 12515 12516 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 12517 * 12518 * @param program Current program 12519 **/ 12520 void BindingImageArrayTest::prepareUniforms(Utils::program& program) 12521 { 12522 static const GLuint goku_data[7] = { 12523 0x00000000, 0xff000000, 0x00ff0000, 0xffff0000, 0x0000ff00, 0xff00ff00, 0x00ffff00, 12524 }; 12525 12526 Utils::texture* textures[7] = { 12527 &m_goku_00_texture, &m_goku_01_texture, &m_goku_02_texture, &m_goku_03_texture, 12528 &m_goku_04_texture, &m_goku_05_texture, &m_goku_06_texture, 12529 }; 12530 12531 for (GLuint i = 0; i < 7; ++i) 12532 { 12533 GLint expected_binding = i + 1; 12534 12535 checkBinding(program, i, expected_binding); 12536 12537 prepareTexture(*textures[i], Utils::buffer(m_context), Utils::TEX_2D, goku_data[i], expected_binding); 12538 } 12539 } 12540 12541 /** Overwrite of releaseResource method, release extra textures 12542 * 12543 * @param ignored 12544 **/ 12545 void BindingImageArrayTest::releaseResource() 12546 { 12547 Utils::texture* textures[7] = { 12548 &m_goku_00_texture, &m_goku_01_texture, &m_goku_02_texture, &m_goku_03_texture, 12549 &m_goku_04_texture, &m_goku_05_texture, &m_goku_06_texture, 12550 }; 12551 12552 for (GLuint i = 0; i < 7; ++i) 12553 { 12554 textures[i]->release(); 12555 } 12556 } 12557 12558 /** Verifies that API reports correct uniform binding 12559 * 12560 * @param program Program 12561 * @param index Index of array element 12562 * @param expected_binding Expected binding 12563 **/ 12564 void BindingImageArrayTest::checkBinding(Utils::program& program, GLuint index, GLint expected_binding) 12565 { 12566 if (false == Utils::checkUniformArrayBinding(program, "goku", index, expected_binding)) 12567 { 12568 TCU_FAIL("Wrong binding reported by API"); 12569 } 12570 } 12571 12572 /** Constructor 12573 * 12574 * @param context Test context 12575 **/ 12576 BindingImageDefaultTest::BindingImageDefaultTest(deqp::Context& context) 12577 : APITestBase(context, "binding_image_default", "Test verifies default image binding") 12578 { 12579 /* Nothing to be done here */ 12580 } 12581 12582 /** Execute API call and verifies results 12583 * 12584 * @return true when results are positive, false otherwise 12585 **/ 12586 bool BindingImageDefaultTest::checkResults(Utils::program& program) 12587 { 12588 return Utils::checkUniformBinding(program, "goku", 0 /* expected_binding */); 12589 } 12590 12591 /** Prepare source for given shader stage 12592 * 12593 * @param in_stage Shader stage, compute shader will use 430 12594 * @param in_use_version_400 Select if 400 or 420 should be used 12595 * @param out_source Prepared shader source instance 12596 **/ 12597 void BindingImageDefaultTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 12598 Utils::shaderSource& out_source) 12599 { 12600 static const GLchar* uni_goku = "layout(rgba8) uniform image2D goku;\n"; 12601 12602 static const GLchar* verification_snippet = " vec4 goku_color = imageLoad(goku, ivec2(0,0));\n" 12603 "\n" 12604 " if (vec4(1, 0, 0, 0) != goku_color)\n" 12605 " {\n" 12606 " result = vec4(1, 0, 0, 1);\n" 12607 " }\n"; 12608 12609 static const GLchar* compute_shader_template = 12610 "VERSION\n" 12611 "#extension GL_ARB_shader_image_load_store : enable\n" 12612 "\n" 12613 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 12614 "\n" 12615 "writeonly uniform image2D uni_image;\n" 12616 "\n" 12617 "UNI_GOKU\n" 12618 "\n" 12619 "void main()\n" 12620 "{\n" 12621 " vec4 result = vec4(0, 1, 0, 1);\n" 12622 "\n" 12623 "VERIFICATION" 12624 "\n" 12625 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 12626 "}\n" 12627 "\n"; 12628 12629 static const GLchar* fragment_shader_template = "VERSION\n" 12630 "#extension GL_ARB_shader_image_load_store : enable\n" 12631 "\n" 12632 "in vec4 gs_fs_result;\n" 12633 "out vec4 fs_out_result;\n" 12634 "\n" 12635 "UNI_GOKU\n" 12636 "\n" 12637 "void main()\n" 12638 "{\n" 12639 " vec4 result = vec4(0, 1, 0, 1);\n" 12640 "\n" 12641 "VERIFICATION" 12642 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 12643 " {\n" 12644 " result = vec4(1, 0, 0, 1);\n" 12645 " }\n" 12646 "\n" 12647 " fs_out_result = result;\n" 12648 "}\n" 12649 "\n"; 12650 12651 static const GLchar* geometry_shader_template = "VERSION\n" 12652 "#extension GL_ARB_shader_image_load_store : enable\n" 12653 "\n" 12654 "layout(points) in;\n" 12655 "layout(triangle_strip, max_vertices = 4) out;\n" 12656 "\n" 12657 "in vec4 tes_gs_result[];\n" 12658 "out vec4 gs_fs_result;\n" 12659 "\n" 12660 "UNI_GOKU\n" 12661 "\n" 12662 "void main()\n" 12663 "{\n" 12664 " vec4 result = vec4(0, 1, 0, 1);\n" 12665 "\n" 12666 "VERIFICATION" 12667 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 12668 " {\n" 12669 " result = vec4(1, 0, 0, 1);\n" 12670 " }\n" 12671 "\n" 12672 " gs_fs_result = result;\n" 12673 " gl_Position = vec4(-1, -1, 0, 1);\n" 12674 " EmitVertex();\n" 12675 " gs_fs_result = result;\n" 12676 " gl_Position = vec4(-1, 1, 0, 1);\n" 12677 " EmitVertex();\n" 12678 " gs_fs_result = result;\n" 12679 " gl_Position = vec4(1, -1, 0, 1);\n" 12680 " EmitVertex();\n" 12681 " gs_fs_result = result;\n" 12682 " gl_Position = vec4(1, 1, 0, 1);\n" 12683 " EmitVertex();\n" 12684 "}\n" 12685 "\n"; 12686 12687 static const GLchar* tess_ctrl_shader_template = 12688 "VERSION\n" 12689 "#extension GL_ARB_shader_image_load_store : enable\n" 12690 "\n" 12691 "layout(vertices = 1) out;\n" 12692 "\n" 12693 "in vec4 vs_tcs_result[];\n" 12694 "out vec4 tcs_tes_result[];\n" 12695 "\n" 12696 "UNI_GOKU\n" 12697 "\n" 12698 "void main()\n" 12699 "{\n" 12700 " vec4 result = vec4(0, 1, 0, 1);\n" 12701 "\n" 12702 "VERIFICATION" 12703 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 12704 " {\n" 12705 " result = vec4(1, 0, 0, 1);\n" 12706 " }\n" 12707 "\n" 12708 " tcs_tes_result[gl_InvocationID] = result;\n" 12709 "\n" 12710 " gl_TessLevelOuter[0] = 1.0;\n" 12711 " gl_TessLevelOuter[1] = 1.0;\n" 12712 " gl_TessLevelOuter[2] = 1.0;\n" 12713 " gl_TessLevelOuter[3] = 1.0;\n" 12714 " gl_TessLevelInner[0] = 1.0;\n" 12715 " gl_TessLevelInner[1] = 1.0;\n" 12716 "}\n" 12717 "\n"; 12718 12719 static const GLchar* tess_eval_shader_template = "VERSION\n" 12720 "#extension GL_ARB_shader_image_load_store : enable\n" 12721 "\n" 12722 "layout(isolines, point_mode) in;\n" 12723 "\n" 12724 "in vec4 tcs_tes_result[];\n" 12725 "out vec4 tes_gs_result;\n" 12726 "\n" 12727 "UNI_GOKU\n" 12728 "\n" 12729 "void main()\n" 12730 "{\n" 12731 " vec4 result = vec4(0, 1, 0, 1);\n" 12732 "\n" 12733 "VERIFICATION" 12734 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 12735 " {\n" 12736 " result = vec4(1, 0, 0, 1);\n" 12737 " }\n" 12738 "\n" 12739 " tes_gs_result = result;\n" 12740 "}\n" 12741 "\n"; 12742 12743 static const GLchar* vertex_shader_template = "VERSION\n" 12744 "#extension GL_ARB_shader_image_load_store : enable\n" 12745 "\n" 12746 "out vec4 vs_tcs_result;\n" 12747 "\n" 12748 "UNI_GOKU\n" 12749 "\n" 12750 "void main()\n" 12751 "{\n" 12752 " vec4 result = vec4(0, 1, 0, 1);\n" 12753 "\n" 12754 "VERIFICATION" 12755 "\n" 12756 " vs_tcs_result = result;\n" 12757 "}\n" 12758 "\n"; 12759 12760 const GLchar* shader_template = 0; 12761 12762 switch (in_stage) 12763 { 12764 case Utils::COMPUTE_SHADER: 12765 shader_template = compute_shader_template; 12766 break; 12767 case Utils::FRAGMENT_SHADER: 12768 shader_template = fragment_shader_template; 12769 break; 12770 case Utils::GEOMETRY_SHADER: 12771 shader_template = geometry_shader_template; 12772 break; 12773 case Utils::TESS_CTRL_SHADER: 12774 shader_template = tess_ctrl_shader_template; 12775 break; 12776 case Utils::TESS_EVAL_SHADER: 12777 shader_template = tess_eval_shader_template; 12778 break; 12779 case Utils::VERTEX_SHADER: 12780 shader_template = vertex_shader_template; 12781 break; 12782 default: 12783 TCU_FAIL("Invalid enum"); 12784 break; 12785 } 12786 12787 out_source.m_parts[0].m_code = shader_template; 12788 12789 size_t position = 0; 12790 12791 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 12792 out_source.m_parts[0].m_code); 12793 12794 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 12795 12796 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 12797 } 12798 12799 /** Constructor 12800 * 12801 * @param context Test context 12802 **/ 12803 BindingImageAPIOverrideTest::BindingImageAPIOverrideTest(deqp::Context& context) 12804 : BindingImageTest(context, "binding_image_api_override", "Verifies that API can override image binding") 12805 , m_goku_texture(context) 12806 { 12807 /* Nothing to be done here */ 12808 } 12809 12810 /** Prepare source for given shader stage 12811 * 12812 * @param in_stage Shader stage, compute shader will use 430 12813 * @param in_use_version_400 Select if 400 or 420 should be used 12814 * @param out_source Prepared shader source instance 12815 **/ 12816 void BindingImageAPIOverrideTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 12817 Utils::shaderSource& out_source) 12818 { 12819 static const GLchar* uni_goku = "layout(binding = 3, rgba8) uniform image2D goku;\n"; 12820 12821 static const GLchar* verification_snippet = " vec4 goku_color = imageLoad(goku, ivec2(0,0));\n" 12822 "\n" 12823 " if (vec4(1, 0, 0, 0) != goku_color)\n" 12824 " {\n" 12825 " result = vec4(1, 0, 0, 1);\n" 12826 " }\n"; 12827 12828 static const GLchar* compute_shader_template = 12829 "VERSION\n" 12830 "#extension GL_ARB_shader_image_load_store : enable\n" 12831 "\n" 12832 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 12833 "\n" 12834 "writeonly uniform image2D uni_image;\n" 12835 "\n" 12836 "UNI_GOKU\n" 12837 "\n" 12838 "void main()\n" 12839 "{\n" 12840 " vec4 result = vec4(0, 1, 0, 1);\n" 12841 "\n" 12842 "VERIFICATION" 12843 "\n" 12844 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 12845 "}\n" 12846 "\n"; 12847 12848 static const GLchar* fragment_shader_template = "VERSION\n" 12849 "#extension GL_ARB_shader_image_load_store : enable\n" 12850 "\n" 12851 "in vec4 gs_fs_result;\n" 12852 "out vec4 fs_out_result;\n" 12853 "\n" 12854 "UNI_GOKU\n" 12855 "\n" 12856 "void main()\n" 12857 "{\n" 12858 " vec4 result = vec4(0, 1, 0, 1);\n" 12859 "\n" 12860 "VERIFICATION" 12861 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 12862 " {\n" 12863 " result = vec4(1, 0, 0, 1);\n" 12864 " }\n" 12865 "\n" 12866 " fs_out_result = result;\n" 12867 "}\n" 12868 "\n"; 12869 12870 static const GLchar* geometry_shader_template = "VERSION\n" 12871 "#extension GL_ARB_shader_image_load_store : enable\n" 12872 "\n" 12873 "layout(points) in;\n" 12874 "layout(triangle_strip, max_vertices = 4) out;\n" 12875 "\n" 12876 "in vec4 tes_gs_result[];\n" 12877 "out vec4 gs_fs_result;\n" 12878 "\n" 12879 "UNI_GOKU\n" 12880 "\n" 12881 "void main()\n" 12882 "{\n" 12883 " vec4 result = vec4(0, 1, 0, 1);\n" 12884 "\n" 12885 "VERIFICATION" 12886 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 12887 " {\n" 12888 " result = vec4(1, 0, 0, 1);\n" 12889 " }\n" 12890 "\n" 12891 " gs_fs_result = result;\n" 12892 " gl_Position = vec4(-1, -1, 0, 1);\n" 12893 " EmitVertex();\n" 12894 " gs_fs_result = result;\n" 12895 " gl_Position = vec4(-1, 1, 0, 1);\n" 12896 " EmitVertex();\n" 12897 " gs_fs_result = result;\n" 12898 " gl_Position = vec4(1, -1, 0, 1);\n" 12899 " EmitVertex();\n" 12900 " gs_fs_result = result;\n" 12901 " gl_Position = vec4(1, 1, 0, 1);\n" 12902 " EmitVertex();\n" 12903 "}\n" 12904 "\n"; 12905 12906 static const GLchar* tess_ctrl_shader_template = 12907 "VERSION\n" 12908 "#extension GL_ARB_shader_image_load_store : enable\n" 12909 "\n" 12910 "layout(vertices = 1) out;\n" 12911 "\n" 12912 "in vec4 vs_tcs_result[];\n" 12913 "out vec4 tcs_tes_result[];\n" 12914 "\n" 12915 "UNI_GOKU\n" 12916 "\n" 12917 "void main()\n" 12918 "{\n" 12919 " vec4 result = vec4(0, 1, 0, 1);\n" 12920 "\n" 12921 "VERIFICATION" 12922 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 12923 " {\n" 12924 " result = vec4(1, 0, 0, 1);\n" 12925 " }\n" 12926 "\n" 12927 " tcs_tes_result[gl_InvocationID] = result;\n" 12928 "\n" 12929 " gl_TessLevelOuter[0] = 1.0;\n" 12930 " gl_TessLevelOuter[1] = 1.0;\n" 12931 " gl_TessLevelOuter[2] = 1.0;\n" 12932 " gl_TessLevelOuter[3] = 1.0;\n" 12933 " gl_TessLevelInner[0] = 1.0;\n" 12934 " gl_TessLevelInner[1] = 1.0;\n" 12935 "}\n" 12936 "\n"; 12937 12938 static const GLchar* tess_eval_shader_template = "VERSION\n" 12939 "#extension GL_ARB_shader_image_load_store : enable\n" 12940 "\n" 12941 "layout(isolines, point_mode) in;\n" 12942 "\n" 12943 "in vec4 tcs_tes_result[];\n" 12944 "out vec4 tes_gs_result;\n" 12945 "\n" 12946 "UNI_GOKU\n" 12947 "\n" 12948 "void main()\n" 12949 "{\n" 12950 " vec4 result = vec4(0, 1, 0, 1);\n" 12951 "\n" 12952 "VERIFICATION" 12953 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 12954 " {\n" 12955 " result = vec4(1, 0, 0, 1);\n" 12956 " }\n" 12957 "\n" 12958 " tes_gs_result = result;\n" 12959 "}\n" 12960 "\n"; 12961 12962 static const GLchar* vertex_shader_template = "VERSION\n" 12963 "#extension GL_ARB_shader_image_load_store : enable\n" 12964 "\n" 12965 "out vec4 vs_tcs_result;\n" 12966 "\n" 12967 "UNI_GOKU\n" 12968 "\n" 12969 "void main()\n" 12970 "{\n" 12971 " vec4 result = vec4(0, 1, 0, 1);\n" 12972 "\n" 12973 "VERIFICATION" 12974 "\n" 12975 " vs_tcs_result = result;\n" 12976 "}\n" 12977 "\n"; 12978 12979 const GLchar* shader_template = 0; 12980 12981 switch (in_stage) 12982 { 12983 case Utils::COMPUTE_SHADER: 12984 shader_template = compute_shader_template; 12985 break; 12986 case Utils::FRAGMENT_SHADER: 12987 shader_template = fragment_shader_template; 12988 break; 12989 case Utils::GEOMETRY_SHADER: 12990 shader_template = geometry_shader_template; 12991 break; 12992 case Utils::TESS_CTRL_SHADER: 12993 shader_template = tess_ctrl_shader_template; 12994 break; 12995 case Utils::TESS_EVAL_SHADER: 12996 shader_template = tess_eval_shader_template; 12997 break; 12998 case Utils::VERTEX_SHADER: 12999 shader_template = vertex_shader_template; 13000 break; 13001 default: 13002 TCU_FAIL("Invalid enum"); 13003 break; 13004 } 13005 13006 out_source.m_parts[0].m_code = shader_template; 13007 13008 size_t position = 0; 13009 13010 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 13011 out_source.m_parts[0].m_code); 13012 13013 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 13014 13015 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 13016 } 13017 13018 /** Overwritte of prepareUniforms method, set up values for unit_left and unit_right 13019 * 13020 * @param program Current program 13021 **/ 13022 void BindingImageAPIOverrideTest::prepareUniforms(Utils::program& program) 13023 { 13024 static const GLuint goku_data = 0x000000ff; 13025 static const GLint new_binding = 7; 13026 13027 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 13028 13029 const GLint uniform_location = program.getUniformLocation("goku"); 13030 if (-1 == uniform_location) 13031 { 13032 TCU_FAIL("Uniform is inactive"); 13033 } 13034 13035 gl.uniform1i(uniform_location, new_binding); 13036 13037 GLint binding = -1; 13038 13039 gl.getUniformiv(program.m_program_object_id, uniform_location, &binding); 13040 GLU_EXPECT_NO_ERROR(gl.getError(), "getUniformiv"); 13041 13042 if (new_binding != binding) 13043 { 13044 TCU_FAIL("Wrong binding value"); 13045 return; 13046 } 13047 13048 prepareTexture(m_goku_texture, Utils::buffer(m_context), Utils::TEX_2D, goku_data, new_binding); 13049 } 13050 13051 /** Overwrite of releaseResource method, release extra texture 13052 * 13053 * @param ignored 13054 **/ 13055 void BindingImageAPIOverrideTest::releaseResource() 13056 { 13057 m_goku_texture.release(); 13058 } 13059 13060 /** Constructor 13061 * 13062 * @param context Test context 13063 **/ 13064 BindingImageInvalidTest::BindingImageInvalidTest(deqp::Context& context) 13065 : NegativeTestBase(context, "binding_image_invalid", "Test verifies invalid binding values") 13066 { 13067 /* Nothing to be done here */ 13068 } 13069 13070 /** Set up next test case 13071 * 13072 * @param test_case_index Index of next test case 13073 * 13074 * @return false if there is no more test cases, true otherwise 13075 **/ 13076 bool BindingImageInvalidTest::prepareNextTestCase(glw::GLuint test_case_index) 13077 { 13078 switch (test_case_index) 13079 { 13080 case (glw::GLuint)-1: 13081 m_case = TEST_CASES_MAX; 13082 break; 13083 case NEGATIVE_VALUE: 13084 case VARIABLE_NAME: 13085 case STD140: 13086 case MISSING: 13087 m_case = (TESTCASES)test_case_index; 13088 break; 13089 default: 13090 return false; 13091 } 13092 13093 return true; 13094 } 13095 13096 /** Prepare source for given shader stage 13097 * 13098 * @param in_stage Shader stage, compute shader will use 430 13099 * @param in_use_version_400 Select if 400 or 420 should be used 13100 * @param out_source Prepared shader source instance 13101 **/ 13102 void BindingImageInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 13103 Utils::shaderSource& out_source) 13104 { 13105 static const GLchar* uni_goku = "layout(binding BINDING, rgba8) uniform image2D goku;\n"; 13106 13107 static const GLchar* verification_snippet = " vec4 goku_color = imageLoad(goku, ivec2(0,0));\n" 13108 "\n" 13109 " if (vec4(1, 0, 0, 0) != goku_color)\n" 13110 " {\n" 13111 " result = vec4(1, 0, 0, 1);\n" 13112 " }\n"; 13113 13114 static const GLchar* compute_shader_template = 13115 "VERSION\n" 13116 "#extension GL_ARB_shader_image_load_store : enable\n" 13117 "\n" 13118 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 13119 "\n" 13120 "writeonly uniform image2D uni_image;\n" 13121 "\n" 13122 "UNI_GOKU\n" 13123 "\n" 13124 "void main()\n" 13125 "{\n" 13126 " vec4 result = vec4(0, 1, 0, 1);\n" 13127 "\n" 13128 "VERIFICATION" 13129 "\n" 13130 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 13131 "}\n" 13132 "\n"; 13133 13134 static const GLchar* fragment_shader_template = "VERSION\n" 13135 "#extension GL_ARB_shader_image_load_store : enable\n" 13136 "\n" 13137 "in vec4 gs_fs_result;\n" 13138 "out vec4 fs_out_result;\n" 13139 "\n" 13140 "UNI_GOKU\n" 13141 "\n" 13142 "void main()\n" 13143 "{\n" 13144 " vec4 result = vec4(0, 1, 0, 1);\n" 13145 "\n" 13146 "VERIFICATION" 13147 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 13148 " {\n" 13149 " result = vec4(1, 0, 0, 1);\n" 13150 " }\n" 13151 "\n" 13152 " fs_out_result = result;\n" 13153 "}\n" 13154 "\n"; 13155 13156 static const GLchar* geometry_shader_template = "VERSION\n" 13157 "#extension GL_ARB_shader_image_load_store : enable\n" 13158 "\n" 13159 "layout(points) in;\n" 13160 "layout(triangle_strip, max_vertices = 4) out;\n" 13161 "\n" 13162 "in vec4 tes_gs_result[];\n" 13163 "out vec4 gs_fs_result;\n" 13164 "\n" 13165 "UNI_GOKU\n" 13166 "\n" 13167 "void main()\n" 13168 "{\n" 13169 " vec4 result = vec4(0, 1, 0, 1);\n" 13170 "\n" 13171 "VERIFICATION" 13172 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 13173 " {\n" 13174 " result = vec4(1, 0, 0, 1);\n" 13175 " }\n" 13176 "\n" 13177 " gs_fs_result = result;\n" 13178 " gl_Position = vec4(-1, -1, 0, 1);\n" 13179 " EmitVertex();\n" 13180 " gs_fs_result = result;\n" 13181 " gl_Position = vec4(-1, 1, 0, 1);\n" 13182 " EmitVertex();\n" 13183 " gs_fs_result = result;\n" 13184 " gl_Position = vec4(1, -1, 0, 1);\n" 13185 " EmitVertex();\n" 13186 " gs_fs_result = result;\n" 13187 " gl_Position = vec4(1, 1, 0, 1);\n" 13188 " EmitVertex();\n" 13189 "}\n" 13190 "\n"; 13191 13192 static const GLchar* tess_ctrl_shader_template = 13193 "VERSION\n" 13194 "#extension GL_ARB_shader_image_load_store : enable\n" 13195 "\n" 13196 "layout(vertices = 1) out;\n" 13197 "\n" 13198 "in vec4 vs_tcs_result[];\n" 13199 "out vec4 tcs_tes_result[];\n" 13200 "\n" 13201 "UNI_GOKU\n" 13202 "\n" 13203 "void main()\n" 13204 "{\n" 13205 " vec4 result = vec4(0, 1, 0, 1);\n" 13206 "\n" 13207 "VERIFICATION" 13208 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 13209 " {\n" 13210 " result = vec4(1, 0, 0, 1);\n" 13211 " }\n" 13212 "\n" 13213 " tcs_tes_result[gl_InvocationID] = result;\n" 13214 "\n" 13215 " gl_TessLevelOuter[0] = 1.0;\n" 13216 " gl_TessLevelOuter[1] = 1.0;\n" 13217 " gl_TessLevelOuter[2] = 1.0;\n" 13218 " gl_TessLevelOuter[3] = 1.0;\n" 13219 " gl_TessLevelInner[0] = 1.0;\n" 13220 " gl_TessLevelInner[1] = 1.0;\n" 13221 "}\n" 13222 "\n"; 13223 13224 static const GLchar* tess_eval_shader_template = "VERSION\n" 13225 "#extension GL_ARB_shader_image_load_store : enable\n" 13226 "\n" 13227 "layout(isolines, point_mode) in;\n" 13228 "\n" 13229 "in vec4 tcs_tes_result[];\n" 13230 "out vec4 tes_gs_result;\n" 13231 "\n" 13232 "UNI_GOKU\n" 13233 "\n" 13234 "void main()\n" 13235 "{\n" 13236 " vec4 result = vec4(0, 1, 0, 1);\n" 13237 "\n" 13238 "VERIFICATION" 13239 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 13240 " {\n" 13241 " result = vec4(1, 0, 0, 1);\n" 13242 " }\n" 13243 "\n" 13244 " tes_gs_result = result;\n" 13245 "}\n" 13246 "\n"; 13247 13248 static const GLchar* vertex_shader_template = "VERSION\n" 13249 "#extension GL_ARB_shader_image_load_store : enable\n" 13250 "\n" 13251 "out vec4 vs_tcs_result;\n" 13252 "\n" 13253 "UNI_GOKU\n" 13254 "\n" 13255 "void main()\n" 13256 "{\n" 13257 " vec4 result = vec4(0, 1, 0, 1);\n" 13258 "\n" 13259 "VERIFICATION" 13260 "\n" 13261 " vs_tcs_result = result;\n" 13262 "}\n" 13263 "\n"; 13264 13265 const GLchar* shader_template = 0; 13266 13267 switch (in_stage) 13268 { 13269 case Utils::COMPUTE_SHADER: 13270 shader_template = compute_shader_template; 13271 break; 13272 case Utils::FRAGMENT_SHADER: 13273 shader_template = fragment_shader_template; 13274 break; 13275 case Utils::GEOMETRY_SHADER: 13276 shader_template = geometry_shader_template; 13277 break; 13278 case Utils::TESS_CTRL_SHADER: 13279 shader_template = tess_ctrl_shader_template; 13280 break; 13281 case Utils::TESS_EVAL_SHADER: 13282 shader_template = tess_eval_shader_template; 13283 break; 13284 case Utils::VERTEX_SHADER: 13285 shader_template = vertex_shader_template; 13286 break; 13287 default: 13288 TCU_FAIL("Invalid enum"); 13289 break; 13290 } 13291 13292 out_source.m_parts[0].m_code = shader_template; 13293 13294 size_t position = 0; 13295 13296 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 13297 out_source.m_parts[0].m_code); 13298 13299 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 13300 13301 Utils::replaceAllTokens("UNI_GOKU", uni_goku, out_source.m_parts[0].m_code); 13302 13303 Utils::replaceAllTokens("BINDING", getCaseString(m_case), out_source.m_parts[0].m_code); 13304 } 13305 13306 const GLchar* BindingImageInvalidTest::getCaseString(TESTCASES test_case) 13307 { 13308 (void)test_case; 13309 const GLchar* binding = 0; 13310 13311 switch (m_case) 13312 { 13313 case NEGATIVE_VALUE: 13314 binding = "= -1"; 13315 break; 13316 case VARIABLE_NAME: 13317 binding = "= goku"; 13318 break; 13319 case STD140: 13320 binding = "= std140"; 13321 break; 13322 case MISSING: 13323 binding = ""; 13324 break; 13325 case TEST_CASES_MAX: 13326 binding = "= 0"; 13327 break; 13328 default: 13329 TCU_FAIL("Invalid enum"); 13330 } 13331 13332 return binding; 13333 } 13334 13335 /* Constants used by InitializerListTest */ 13336 const GLfloat InitializerListTest::m_value = 0.0625f; 13337 13338 /** Constructor 13339 * 13340 * @param context Test context 13341 **/ 13342 InitializerListTest::InitializerListTest(deqp::Context& context) 13343 : GLSLTestBase(context, "initializer_list", "Test verifies initializer lists") 13344 { 13345 /* Nothing to be done here */ 13346 } 13347 13348 /** Set up next test case 13349 * 13350 * @param test_case_index Index of next test case 13351 * 13352 * @return false if there is no more test cases, true otherwise 13353 **/ 13354 bool InitializerListTest::prepareNextTestCase(glw::GLuint test_case_index) 13355 { 13356 m_current_test_case_index = test_case_index; 13357 13358 if ((glw::GLuint)-1 == test_case_index) 13359 { 13360 m_current_test_case_index = 0; 13361 return true; 13362 } 13363 else if (m_test_cases.size() <= test_case_index) 13364 { 13365 return false; 13366 } 13367 13368 logTestCaseName(); 13369 13370 return true; 13371 } 13372 13373 /** Overwritte of prepareUniforms method 13374 * 13375 * @param program Current program 13376 **/ 13377 void InitializerListTest::prepareUniforms(Utils::program& program) 13378 { 13379 static const GLfloat float_data[16] = { m_value, m_value, m_value, m_value, m_value, m_value, m_value, m_value, 13380 m_value, m_value, m_value, m_value, m_value, m_value, m_value, m_value }; 13381 13382 program.uniform("uni_matrix", Utils::FLOAT, 4, 4, float_data); 13383 } 13384 13385 /** Prepare source for given shader stage 13386 * 13387 * @param in_stage Shader stage, compute shader will use 430 13388 * @param in_use_version_400 Select if 400 or 420 should be used 13389 * @param out_source Prepared shader source instance 13390 **/ 13391 void InitializerListTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 13392 Utils::shaderSource& out_source) 13393 { 13394 static const GLchar* verification_snippet = " TYPE_NAME variableARRAY_DEFINITION = INITIALIZATION;\n" 13395 "\n" 13396 " float sum = SUM;\n" 13397 "\n" 13398 " if (EXPECTED_VALUE != sum)\n" 13399 " {\n" 13400 " result = vec4(1, 0, 0, 1);\n" 13401 " }\n"; 13402 13403 static const GLchar* compute_shader_template = 13404 "VERSION\n" 13405 "\n" 13406 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 13407 "\n" 13408 "writeonly uniform image2D uni_image;\n" 13409 " uniform mat4 uni_matrix;\n" 13410 "\n" 13411 "TYPE_DEFINITION\n" 13412 "\n" 13413 "void main()\n" 13414 "{\n" 13415 " vec4 result = vec4(0, 1, 0, 1);\n" 13416 "\n" 13417 "VERIFICATION" 13418 "\n" 13419 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 13420 "}\n" 13421 "\n"; 13422 13423 static const GLchar* fragment_shader_template = "VERSION\n" 13424 "\n" 13425 "in vec4 gs_fs_result;\n" 13426 "out vec4 fs_out_result;\n" 13427 "\n" 13428 "uniform mat4 uni_matrix;\n" 13429 "\n" 13430 "TYPE_DEFINITION\n" 13431 "\n" 13432 "void main()\n" 13433 "{\n" 13434 " vec4 result = vec4(0, 1, 0, 1);\n" 13435 "\n" 13436 "VERIFICATION" 13437 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 13438 " {\n" 13439 " result = vec4(1, 0, 0, 1);\n" 13440 " }\n" 13441 "\n" 13442 " fs_out_result = result;\n" 13443 "}\n" 13444 "\n"; 13445 13446 static const GLchar* geometry_shader_template = "VERSION\n" 13447 "\n" 13448 "layout(points) in;\n" 13449 "layout(triangle_strip, max_vertices = 4) out;\n" 13450 "\n" 13451 "in vec4 tes_gs_result[];\n" 13452 "out vec4 gs_fs_result;\n" 13453 "\n" 13454 "uniform mat4 uni_matrix;\n" 13455 "\n" 13456 "TYPE_DEFINITION\n" 13457 "\n" 13458 "void main()\n" 13459 "{\n" 13460 " vec4 result = vec4(0, 1, 0, 1);\n" 13461 "\n" 13462 "VERIFICATION" 13463 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 13464 " {\n" 13465 " result = vec4(1, 0, 0, 1);\n" 13466 " }\n" 13467 "\n" 13468 " gs_fs_result = result;\n" 13469 " gl_Position = vec4(-1, -1, 0, 1);\n" 13470 " EmitVertex();\n" 13471 " gs_fs_result = result;\n" 13472 " gl_Position = vec4(-1, 1, 0, 1);\n" 13473 " EmitVertex();\n" 13474 " gs_fs_result = result;\n" 13475 " gl_Position = vec4(1, -1, 0, 1);\n" 13476 " EmitVertex();\n" 13477 " gs_fs_result = result;\n" 13478 " gl_Position = vec4(1, 1, 0, 1);\n" 13479 " EmitVertex();\n" 13480 "}\n" 13481 "\n"; 13482 13483 static const GLchar* tess_ctrl_shader_template = 13484 "VERSION\n" 13485 "\n" 13486 "layout(vertices = 1) out;\n" 13487 "\n" 13488 "in vec4 vs_tcs_result[];\n" 13489 "out vec4 tcs_tes_result[];\n" 13490 "\n" 13491 "uniform mat4 uni_matrix;\n" 13492 "\n" 13493 "TYPE_DEFINITION\n" 13494 "\n" 13495 "void main()\n" 13496 "{\n" 13497 " vec4 result = vec4(0, 1, 0, 1);\n" 13498 "\n" 13499 "VERIFICATION" 13500 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 13501 " {\n" 13502 " result = vec4(1, 0, 0, 1);\n" 13503 " }\n" 13504 "\n" 13505 " tcs_tes_result[gl_InvocationID] = result;\n" 13506 "\n" 13507 " gl_TessLevelOuter[0] = 1.0;\n" 13508 " gl_TessLevelOuter[1] = 1.0;\n" 13509 " gl_TessLevelOuter[2] = 1.0;\n" 13510 " gl_TessLevelOuter[3] = 1.0;\n" 13511 " gl_TessLevelInner[0] = 1.0;\n" 13512 " gl_TessLevelInner[1] = 1.0;\n" 13513 "}\n" 13514 "\n"; 13515 13516 static const GLchar* tess_eval_shader_template = "VERSION\n" 13517 "\n" 13518 "layout(isolines, point_mode) in;\n" 13519 "\n" 13520 "in vec4 tcs_tes_result[];\n" 13521 "out vec4 tes_gs_result;\n" 13522 "\n" 13523 "uniform mat4 uni_matrix;\n" 13524 "\n" 13525 "TYPE_DEFINITION\n" 13526 "\n" 13527 "void main()\n" 13528 "{\n" 13529 " vec4 result = vec4(0, 1, 0, 1);\n" 13530 "\n" 13531 "VERIFICATION" 13532 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 13533 " {\n" 13534 " result = vec4(1, 0, 0, 1);\n" 13535 " }\n" 13536 "\n" 13537 " tes_gs_result = result;\n" 13538 "}\n" 13539 "\n"; 13540 13541 static const GLchar* vertex_shader_template = "VERSION\n" 13542 "\n" 13543 "out vec4 vs_tcs_result;\n" 13544 "\n" 13545 "uniform mat4 uni_matrix;\n" 13546 "\n" 13547 "TYPE_DEFINITION\n" 13548 "\n" 13549 "void main()\n" 13550 "{\n" 13551 " vec4 result = vec4(0, 1, 0, 1);\n" 13552 "\n" 13553 "VERIFICATION" 13554 "\n" 13555 " vs_tcs_result = result;\n" 13556 "}\n" 13557 "\n"; 13558 13559 const std::string& array_definition = getArrayDefinition(); 13560 const std::string& expected_value = getExpectedValue(); 13561 const std::string& initialization = getInitialization(); 13562 const GLchar* shader_template = 0; 13563 const std::string& sum = getSum(); 13564 const std::string& type_definition = getTypeDefinition(); 13565 const std::string& type_name = getTypeName(); 13566 13567 switch (in_stage) 13568 { 13569 case Utils::COMPUTE_SHADER: 13570 shader_template = compute_shader_template; 13571 break; 13572 case Utils::FRAGMENT_SHADER: 13573 shader_template = fragment_shader_template; 13574 break; 13575 case Utils::GEOMETRY_SHADER: 13576 shader_template = geometry_shader_template; 13577 break; 13578 case Utils::TESS_CTRL_SHADER: 13579 shader_template = tess_ctrl_shader_template; 13580 break; 13581 case Utils::TESS_EVAL_SHADER: 13582 shader_template = tess_eval_shader_template; 13583 break; 13584 case Utils::VERTEX_SHADER: 13585 shader_template = vertex_shader_template; 13586 break; 13587 default: 13588 TCU_FAIL("Invalid enum"); 13589 break; 13590 } 13591 13592 out_source.m_parts[0].m_code = shader_template; 13593 13594 size_t position = 0; 13595 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 13596 out_source.m_parts[0].m_code); 13597 13598 Utils::replaceToken("TYPE_DEFINITION", position, type_definition.c_str(), out_source.m_parts[0].m_code); 13599 13600 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 13601 13602 position -= strlen(verification_snippet); 13603 13604 Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code); 13605 13606 Utils::replaceToken("ARRAY_DEFINITION", position, array_definition.c_str(), out_source.m_parts[0].m_code); 13607 13608 Utils::replaceToken("INITIALIZATION", position, initialization.c_str(), out_source.m_parts[0].m_code); 13609 13610 Utils::replaceToken("SUM", position, sum.c_str(), out_source.m_parts[0].m_code); 13611 13612 Utils::replaceToken("EXPECTED_VALUE", position, expected_value.c_str(), out_source.m_parts[0].m_code); 13613 } 13614 13615 /** Prepare test cases 13616 * 13617 * @return true 13618 **/ 13619 bool InitializerListTest::testInit() 13620 { 13621 for (GLuint i = 0; i < TESTED_INITIALIZERS_MAX; ++i) 13622 { 13623 const TESTED_INITIALIZERS l_init = (TESTED_INITIALIZERS)i; 13624 13625 testCase test_case = { l_init, 1, 1 }; 13626 13627 switch (l_init) 13628 { 13629 case VECTOR: 13630 case ARRAY_VECTOR_CTR: 13631 case ARRAY_VECTOR_LIST: 13632 case UNSIZED_ARRAY_VECTOR: 13633 for (GLuint row = 2; row <= 4; ++row) 13634 { 13635 test_case.m_n_rows = row; 13636 13637 m_test_cases.push_back(test_case); 13638 } 13639 13640 break; 13641 13642 case MATRIX: 13643 case MATRIX_ROWS: 13644 case ARRAY_MATRIX_CTR: 13645 case ARRAY_MATRIX_LIST: 13646 case UNSIZED_ARRAY_MATRIX: 13647 for (GLuint col = 2; col <= 4; ++col) 13648 { 13649 for (GLuint row = 2; row <= 4; ++row) 13650 { 13651 test_case.m_n_cols = col; 13652 test_case.m_n_rows = row; 13653 13654 m_test_cases.push_back(test_case); 13655 } 13656 } 13657 13658 break; 13659 13660 case ARRAY_SCALAR: 13661 case UNSIZED_ARRAY_SCALAR: 13662 m_test_cases.push_back(test_case); 13663 13664 break; 13665 13666 case STRUCT: 13667 case ARRAY_STRUCT: 13668 case NESTED_STRUCT_CTR: 13669 case NESTED_STRUCT_LIST: 13670 case NESTED_STURCT_ARRAYS_STRUCT_LIST: 13671 case NESTED_STURCT_ARRAYS_STRUCT_MIX: 13672 case NESTED_ARRAY_STRUCT_STRUCT_LIST: 13673 case NESTED_ARRAY_STRUCT_STRUCT_MIX: 13674 case NESTED_STRUCT_STRUCT_ARRAY_LIST: 13675 case NESTED_STRUCT_STRUCT_ARRAY_MIX: 13676 case UNSIZED_ARRAY_STRUCT: 13677 test_case.m_n_rows = 4; 13678 m_test_cases.push_back(test_case); 13679 13680 break; 13681 default: 13682 DE_ASSERT(0); 13683 break; 13684 } 13685 } 13686 13687 return true; 13688 } 13689 13690 /** Get string representing "[SIZE]" for current test case 13691 * 13692 * @return String 13693 **/ 13694 std::string InitializerListTest::getArrayDefinition() 13695 { 13696 const testCase& test_case = m_test_cases[m_current_test_case_index]; 13697 13698 std::string array_definition; 13699 13700 switch (test_case.m_initializer) 13701 { 13702 case VECTOR: 13703 case MATRIX: 13704 case MATRIX_ROWS: 13705 case STRUCT: 13706 case NESTED_STRUCT_CTR: 13707 case NESTED_STRUCT_LIST: 13708 case NESTED_STURCT_ARRAYS_STRUCT_LIST: 13709 case NESTED_STURCT_ARRAYS_STRUCT_MIX: 13710 case NESTED_STRUCT_STRUCT_ARRAY_LIST: 13711 case NESTED_STRUCT_STRUCT_ARRAY_MIX: 13712 array_definition = ""; 13713 break; 13714 case ARRAY_SCALAR: 13715 case ARRAY_VECTOR_CTR: 13716 case ARRAY_VECTOR_LIST: 13717 case ARRAY_MATRIX_CTR: 13718 case ARRAY_MATRIX_LIST: 13719 case ARRAY_STRUCT: 13720 case NESTED_ARRAY_STRUCT_STRUCT_LIST: 13721 case NESTED_ARRAY_STRUCT_STRUCT_MIX: 13722 array_definition = "[4]"; 13723 break; 13724 case UNSIZED_ARRAY_SCALAR: 13725 case UNSIZED_ARRAY_VECTOR: 13726 case UNSIZED_ARRAY_MATRIX: 13727 case UNSIZED_ARRAY_STRUCT: 13728 array_definition = "[]"; 13729 break; 13730 default: 13731 TCU_FAIL("Invalid enum"); 13732 break; 13733 } 13734 13735 return array_definition; 13736 } 13737 13738 /** Get string representing expected value of sum for current test case 13739 * 13740 * @return String 13741 **/ 13742 std::string InitializerListTest::getExpectedValue() 13743 { 13744 const testCase& test_case = m_test_cases[m_current_test_case_index]; 13745 13746 GLfloat value = 0.0f; 13747 13748 switch (test_case.m_initializer) 13749 { 13750 case VECTOR: 13751 case MATRIX: 13752 case MATRIX_ROWS: 13753 value = (GLfloat)(test_case.m_n_cols * test_case.m_n_rows); 13754 break; 13755 case ARRAY_VECTOR_CTR: 13756 case ARRAY_VECTOR_LIST: 13757 case ARRAY_MATRIX_CTR: 13758 case ARRAY_MATRIX_LIST: 13759 case UNSIZED_ARRAY_VECTOR: 13760 case UNSIZED_ARRAY_MATRIX: 13761 value = (GLfloat)(test_case.m_n_cols * test_case.m_n_rows) * 4.0f; 13762 break; 13763 case ARRAY_SCALAR: 13764 case UNSIZED_ARRAY_SCALAR: 13765 value = 4.0f; 13766 break; 13767 case STRUCT: 13768 value = 8.0f; 13769 break; 13770 case NESTED_STRUCT_CTR: 13771 case NESTED_STRUCT_LIST: 13772 value = 12.0f; 13773 break; 13774 case NESTED_STRUCT_STRUCT_ARRAY_LIST: 13775 case NESTED_STRUCT_STRUCT_ARRAY_MIX: 13776 value = 16.0f; 13777 break; 13778 case NESTED_STURCT_ARRAYS_STRUCT_LIST: 13779 case NESTED_STURCT_ARRAYS_STRUCT_MIX: 13780 value = 28.0f; 13781 break; 13782 case ARRAY_STRUCT: 13783 case UNSIZED_ARRAY_STRUCT: 13784 value = 32.0f; 13785 break; 13786 case NESTED_ARRAY_STRUCT_STRUCT_LIST: 13787 case NESTED_ARRAY_STRUCT_STRUCT_MIX: 13788 value = 48.0f; 13789 break; 13790 default: 13791 TCU_FAIL("Invalid enum"); 13792 break; 13793 } 13794 13795 value *= m_value; 13796 13797 std::string expected_value; 13798 expected_value.resize(64, 0); 13799 13800 sprintf(&expected_value[0], "%f", value); 13801 13802 return expected_value; 13803 } 13804 13805 /** Get string representing initialization list for current test case 13806 * 13807 * @return String 13808 **/ 13809 std::string InitializerListTest::getInitialization() 13810 { 13811 const testCase& test_case = m_test_cases[m_current_test_case_index]; 13812 13813 std::string initialization; 13814 13815 switch (test_case.m_initializer) 13816 { 13817 case VECTOR: 13818 initialization.append(getVectorInitializer(0 /*column*/, test_case.m_n_rows)); 13819 13820 break; 13821 13822 case MATRIX: 13823 initialization = "{ "; 13824 initialization.append(getVectorArrayList(test_case.m_n_cols, test_case.m_n_rows)); 13825 initialization.append(" }"); 13826 13827 break; 13828 13829 case MATRIX_ROWS: 13830 { 13831 initialization = "{ "; 13832 initialization.append(getVectorArrayCtr(test_case.m_n_cols, test_case.m_n_rows)); 13833 initialization.append(" }"); 13834 } 13835 break; 13836 13837 case STRUCT: 13838 initialization = "{ "; 13839 initialization.append(getVectorInitializer(0 /* column */, test_case.m_n_rows)); 13840 initialization.append(", "); 13841 initialization.append(getVectorInitializer(2 /* column */, test_case.m_n_rows)); 13842 initialization.append(" }"); 13843 13844 break; 13845 13846 case ARRAY_SCALAR: 13847 case UNSIZED_ARRAY_SCALAR: 13848 initialization = "{ "; 13849 initialization.append(getVectorValues(0 /* column */, 4 /* size */)); 13850 initialization.append(" }"); 13851 13852 break; 13853 13854 case ARRAY_VECTOR_LIST: 13855 case UNSIZED_ARRAY_VECTOR: 13856 initialization = "{ "; 13857 initialization.append(getVectorArrayList(4 /* columns */, test_case.m_n_rows)); 13858 initialization.append(" }"); 13859 13860 break; 13861 13862 case ARRAY_VECTOR_CTR: 13863 initialization = "{ "; 13864 initialization.append(getVectorArrayCtr(4 /* columns */, test_case.m_n_rows)); 13865 initialization.append(" }"); 13866 13867 break; 13868 13869 case ARRAY_MATRIX_LIST: 13870 case UNSIZED_ARRAY_MATRIX: 13871 initialization = "{ "; 13872 13873 for (GLuint i = 0; i < 4; ++i) 13874 { 13875 initialization.append("{ "); 13876 initialization.append(getVectorArrayList(test_case.m_n_cols, test_case.m_n_rows)); 13877 initialization.append(" }"); 13878 13879 if (i + 1 < 4) 13880 { 13881 initialization.append(", "); 13882 } 13883 } 13884 13885 initialization.append(" }"); 13886 13887 break; 13888 13889 case ARRAY_MATRIX_CTR: 13890 { 13891 const std::string& type_name = Utils::getTypeName(Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows); 13892 13893 initialization = "{ "; 13894 13895 for (GLuint i = 0; i < 4; ++i) 13896 { 13897 initialization.append(type_name); 13898 initialization.append("("); 13899 for (GLuint col = 0; col < test_case.m_n_cols; ++col) 13900 { 13901 initialization.append(getVectorValues(col, test_case.m_n_rows)); 13902 13903 if (col + 1 < test_case.m_n_cols) 13904 { 13905 initialization.append(", "); 13906 } 13907 } 13908 initialization.append(")"); 13909 13910 if (i + 1 < 4) 13911 { 13912 initialization.append(", "); 13913 } 13914 } 13915 13916 initialization.append(" }"); 13917 } 13918 break; 13919 13920 case ARRAY_STRUCT: 13921 case UNSIZED_ARRAY_STRUCT: 13922 initialization = "{ "; 13923 13924 for (GLuint i = 0; i < 4; ++i) 13925 { 13926 initialization.append("{ "); 13927 initialization.append(getVectorInitializer(0 /* column */, test_case.m_n_rows)); 13928 initialization.append(", "); 13929 initialization.append(getVectorInitializer(2 /* column */, test_case.m_n_rows)); 13930 initialization.append(" }"); 13931 13932 if (i + 1 < 4) 13933 { 13934 initialization.append(", "); 13935 } 13936 } 13937 13938 initialization.append(" }"); 13939 13940 break; 13941 13942 case NESTED_STRUCT_CTR: 13943 initialization = "StructureWithStructure(BasicStructure("; 13944 initialization.append(getVectorConstructor(0 /* column */, 4)); 13945 initialization.append(", "); 13946 initialization.append(getVectorConstructor(2 /* column */, 4)); 13947 initialization.append("), "); 13948 initialization.append(getVectorConstructor(3 /* column */, 4)); 13949 initialization.append(")"); 13950 13951 break; 13952 13953 case NESTED_STRUCT_LIST: 13954 initialization = "{ { "; 13955 initialization.append(getVectorInitializer(0 /* column */, 4)); 13956 initialization.append(", "); 13957 initialization.append(getVectorInitializer(2 /* column */, 4)); 13958 initialization.append(" }, "); 13959 initialization.append(getVectorInitializer(3 /* column */, 4)); 13960 initialization.append(" }"); 13961 13962 break; 13963 13964 case NESTED_STURCT_ARRAYS_STRUCT_LIST: 13965 initialization = "{ "; 13966 initialization.append(getVectorInitializer(0 /* column */, 4)); 13967 initialization.append(", { "); 13968 13969 for (GLuint i = 0; i < 3; ++i) 13970 { 13971 initialization.append("{ "); 13972 initialization.append(getVectorInitializer(2 /* column */, 4)); 13973 initialization.append(", "); 13974 initialization.append(getVectorInitializer(3 /* column */, 4)); 13975 initialization.append(" }"); 13976 13977 if (i + 1 < 3) 13978 { 13979 initialization.append(", "); 13980 } 13981 } 13982 13983 initialization.append(" } }"); 13984 13985 break; 13986 13987 case NESTED_STURCT_ARRAYS_STRUCT_MIX: 13988 initialization = "{ "; 13989 initialization.append(getVectorConstructor(0 /* column */, 4)); 13990 initialization.append(", { "); 13991 13992 for (GLuint i = 0; i < 3; ++i) 13993 { 13994 initialization.append("{ "); 13995 initialization.append(getVectorInitializer(2 /* column */, 4)); 13996 initialization.append(", "); 13997 initialization.append(getVectorConstructor(3 /* column */, 4)); 13998 initialization.append(" }"); 13999 14000 if (i + 1 < 3) 14001 { 14002 initialization.append(", "); 14003 } 14004 } 14005 14006 initialization.append(" } }"); 14007 14008 break; 14009 14010 case NESTED_ARRAY_STRUCT_STRUCT_LIST: 14011 initialization = "{ "; 14012 14013 for (GLuint i = 0; i < 4; ++i) 14014 { 14015 initialization.append("{ { "); 14016 14017 initialization.append(getVectorInitializer(0 /* column */, 4)); 14018 initialization.append(", "); 14019 initialization.append(getVectorInitializer(1 /* column */, 4)); 14020 14021 initialization.append(" }, "); 14022 14023 initialization.append(getVectorInitializer(2 /* column */, 4)); 14024 14025 initialization.append(" }"); 14026 14027 if (i + 1 < 4) 14028 { 14029 initialization.append(", "); 14030 } 14031 } 14032 14033 initialization.append(" }"); 14034 14035 break; 14036 14037 case NESTED_ARRAY_STRUCT_STRUCT_MIX: 14038 initialization = "{\n"; 14039 14040 for (GLuint i = 0; i < 2; ++i) 14041 { 14042 initialization.append("StructureWithStructure(\n"); 14043 initialization.append("BasicStructure("); 14044 14045 initialization.append(getVectorConstructor(0 /* column */, 4)); 14046 initialization.append(" , "); 14047 initialization.append(getVectorConstructor(1 /* column */, 4)); 14048 14049 initialization.append("), "); 14050 14051 initialization.append(getVectorConstructor(2 /* column */, 4)); 14052 14053 initialization.append(")"); 14054 14055 initialization.append(" , "); 14056 14057 initialization.append("{ { "); 14058 14059 initialization.append(getVectorInitializer(0 /* column */, 4)); 14060 initialization.append(", "); 14061 initialization.append(getVectorInitializer(1 /* column */, 4)); 14062 14063 initialization.append(" }, "); 14064 14065 initialization.append(getVectorInitializer(2 /* column */, 4)); 14066 14067 initialization.append(" }"); 14068 14069 if (i + 1 < 2) 14070 { 14071 initialization.append(" , "); 14072 } 14073 } 14074 14075 initialization.append(" }"); 14076 14077 break; 14078 14079 case NESTED_STRUCT_STRUCT_ARRAY_LIST: 14080 initialization = "{ "; 14081 initialization.append("{ "); 14082 initialization.append(getVectorInitializer(0 /* column */, 4)); 14083 initialization.append(", "); 14084 initialization.append("{ "); 14085 initialization.append(getVectorInitializer(1 /* column */, 4)); 14086 initialization.append(", "); 14087 initialization.append(getVectorInitializer(2 /* column */, 4)); 14088 initialization.append(" }"); 14089 initialization.append(" }"); 14090 initialization.append(", "); 14091 initialization.append(getVectorInitializer(3 /* column */, 4)); 14092 initialization.append(" }"); 14093 14094 break; 14095 14096 case NESTED_STRUCT_STRUCT_ARRAY_MIX: 14097 initialization = "StructureWithStructureWithArray("; 14098 initialization.append("StructureWithArray("); 14099 initialization.append(getVectorConstructor(0 /* column */, 4)); 14100 initialization.append(" , vec4[2]( "); 14101 initialization.append(getVectorConstructor(1 /* column */, 4)); 14102 initialization.append(" , "); 14103 initialization.append(getVectorConstructor(2 /* column */, 4)); 14104 initialization.append(" )"); 14105 initialization.append(")"); 14106 initialization.append(" , "); 14107 initialization.append(getVectorConstructor(3 /* column */, 4)); 14108 initialization.append(")"); 14109 14110 break; 14111 14112 default: 14113 TCU_FAIL("Invalid enum"); 14114 break; 14115 } 14116 14117 return initialization; 14118 } 14119 14120 /** Logs description of current test case 14121 * 14122 **/ 14123 void InitializerListTest::logTestCaseName() 14124 { 14125 const testCase& test_case = m_test_cases[m_current_test_case_index]; 14126 14127 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 14128 14129 switch (test_case.m_initializer) 14130 { 14131 case VECTOR: 14132 message << "List. Single vec" << test_case.m_n_rows; 14133 break; 14134 case MATRIX: 14135 message << "List. Single mat" << test_case.m_n_cols << "x" << test_case.m_n_rows; 14136 break; 14137 case MATRIX_ROWS: 14138 message << "Ctr. Single mat" << test_case.m_n_cols << "x" << test_case.m_n_rows; 14139 break; 14140 case STRUCT: 14141 message << "List. Structure"; 14142 break; 14143 case NESTED_STRUCT_CTR: 14144 message << "Ctr. Nested structure"; 14145 break; 14146 case NESTED_STRUCT_LIST: 14147 message << "List. Nested structure"; 14148 break; 14149 case NESTED_STURCT_ARRAYS_STRUCT_LIST: 14150 message << "List. Structure with structure array"; 14151 break; 14152 case NESTED_STURCT_ARRAYS_STRUCT_MIX: 14153 message << "Mix. Structure with structure array"; 14154 break; 14155 case NESTED_STRUCT_STRUCT_ARRAY_LIST: 14156 message << "List. Structure with structure with array"; 14157 break; 14158 case NESTED_STRUCT_STRUCT_ARRAY_MIX: 14159 message << "Mix. Structure with structure with array"; 14160 break; 14161 case ARRAY_SCALAR: 14162 message << "List. Array of scalars"; 14163 break; 14164 case ARRAY_VECTOR_CTR: 14165 message << "Ctr. Array of vec" << test_case.m_n_rows; 14166 break; 14167 case ARRAY_VECTOR_LIST: 14168 message << "List. Array of vec" << test_case.m_n_rows; 14169 break; 14170 case ARRAY_MATRIX_CTR: 14171 message << "Ctr. Array of mat" << test_case.m_n_cols << "x" << test_case.m_n_rows; 14172 break; 14173 case ARRAY_MATRIX_LIST: 14174 message << "List. Array of mat" << test_case.m_n_cols << "x" << test_case.m_n_rows; 14175 break; 14176 case ARRAY_STRUCT: 14177 message << "List. Array of structures"; 14178 break; 14179 case NESTED_ARRAY_STRUCT_STRUCT_LIST: 14180 message << "List. Array of structures with structures"; 14181 break; 14182 case NESTED_ARRAY_STRUCT_STRUCT_MIX: 14183 message << "Mix. Array of structures with structures"; 14184 break; 14185 case UNSIZED_ARRAY_SCALAR: 14186 message << "List. Unsized array of scalars"; 14187 break; 14188 case UNSIZED_ARRAY_VECTOR: 14189 message << "List. Unsized array of vec" << test_case.m_n_rows; 14190 break; 14191 case UNSIZED_ARRAY_MATRIX: 14192 message << "List. Unsized array of mat" << test_case.m_n_cols << "x" << test_case.m_n_rows; 14193 break; 14194 case UNSIZED_ARRAY_STRUCT: 14195 message << "List. Unsized array of structures"; 14196 break; 14197 default: 14198 TCU_FAIL("Invalid enum"); 14199 break; 14200 } 14201 14202 message << tcu::TestLog::EndMessage; 14203 } 14204 14205 /** Get string representing sum for current test case 14206 * 14207 * @return String 14208 **/ 14209 std::string InitializerListTest::getSum() 14210 { 14211 static const GLchar* var = "variable"; 14212 14213 const testCase& test_case = m_test_cases[m_current_test_case_index]; 14214 14215 std::string sum; 14216 14217 switch (test_case.m_initializer) 14218 { 14219 case VECTOR: 14220 sum = getVectorSum(var, test_case.m_n_rows); 14221 14222 break; 14223 14224 case MATRIX: 14225 case MATRIX_ROWS: 14226 sum = getVectorArraySum("variable[INDEX]", test_case.m_n_cols, test_case.m_n_rows); 14227 14228 break; 14229 14230 case STRUCT: 14231 sum = getVectorSum("variable.member_a", test_case.m_n_rows); 14232 sum.append(" + "); 14233 sum.append(getVectorSum("variable.member_b", test_case.m_n_rows)); 14234 14235 break; 14236 14237 case ARRAY_SCALAR: 14238 case UNSIZED_ARRAY_SCALAR: 14239 sum = "variable[0] + variable[1] + variable[2] + variable[3]"; 14240 14241 break; 14242 14243 case ARRAY_VECTOR_LIST: 14244 case ARRAY_VECTOR_CTR: 14245 case UNSIZED_ARRAY_VECTOR: 14246 sum = getVectorArraySum("variable[INDEX]", 4 /* columns */, test_case.m_n_rows); 14247 14248 break; 14249 14250 case ARRAY_MATRIX_LIST: 14251 case ARRAY_MATRIX_CTR: 14252 case UNSIZED_ARRAY_MATRIX: 14253 sum.append(getVectorArraySum("variable[0][INDEX]", test_case.m_n_cols, test_case.m_n_rows)); 14254 sum.append(" + "); 14255 sum.append(getVectorArraySum("variable[1][INDEX]", test_case.m_n_cols, test_case.m_n_rows)); 14256 sum.append(" + "); 14257 sum.append(getVectorArraySum("variable[2][INDEX]", test_case.m_n_cols, test_case.m_n_rows)); 14258 sum.append(" + "); 14259 sum.append(getVectorArraySum("variable[3][INDEX]", test_case.m_n_cols, test_case.m_n_rows)); 14260 14261 break; 14262 14263 case ARRAY_STRUCT: 14264 case UNSIZED_ARRAY_STRUCT: 14265 sum.append(getVectorArraySum("variable[INDEX].member_a", 4, test_case.m_n_rows)); 14266 sum.append(" + "); 14267 sum.append(getVectorArraySum("variable[INDEX].member_b", 4, test_case.m_n_rows)); 14268 14269 break; 14270 14271 case NESTED_STRUCT_CTR: 14272 case NESTED_STRUCT_LIST: 14273 sum.append(getVectorSum("variable.member_a.member_a", 4)); 14274 sum.append(" + "); 14275 sum.append(getVectorSum("variable.member_a.member_b", 4)); 14276 sum.append(" + "); 14277 sum.append(getVectorSum("variable.member_b", 4)); 14278 14279 break; 14280 14281 case NESTED_STURCT_ARRAYS_STRUCT_LIST: 14282 case NESTED_STURCT_ARRAYS_STRUCT_MIX: 14283 sum.append(getVectorSum("variable.member_a", 4)); 14284 sum.append(" + "); 14285 sum.append(getVectorArraySum("variable.member_b[INDEX].member_a", 3, 4)); 14286 sum.append(" + "); 14287 sum.append(getVectorArraySum("variable.member_b[INDEX].member_b", 3, 4)); 14288 14289 break; 14290 14291 case NESTED_ARRAY_STRUCT_STRUCT_LIST: 14292 case NESTED_ARRAY_STRUCT_STRUCT_MIX: 14293 sum.append(getVectorArraySum("variable[INDEX].member_a.member_a", 4, 4)); 14294 sum.append(" + "); 14295 sum.append(getVectorArraySum("variable[INDEX].member_a.member_b", 4, 4)); 14296 sum.append(" + "); 14297 sum.append(getVectorArraySum("variable[INDEX].member_b", 4, 4)); 14298 14299 break; 14300 14301 case NESTED_STRUCT_STRUCT_ARRAY_LIST: 14302 case NESTED_STRUCT_STRUCT_ARRAY_MIX: 14303 sum.append(getVectorSum("variable.member_a.member_a", 4)); 14304 sum.append(" + "); 14305 sum.append(getVectorArraySum("variable.member_a.member_b[INDEX]", 2, 4)); 14306 sum.append(" + "); 14307 sum.append(getVectorSum("variable.member_b", 4)); 14308 14309 break; 14310 14311 default: 14312 TCU_FAIL("Invalid enum"); 14313 break; 14314 } 14315 14316 return sum; 14317 } 14318 14319 /** Get string representing types definition for current test case 14320 * 14321 * @return String 14322 **/ 14323 std::string InitializerListTest::getTypeDefinition() 14324 { 14325 const testCase& test_case = m_test_cases[m_current_test_case_index]; 14326 14327 static const GLchar* basic_struct = "struct BasicStructure {\n" 14328 " vec4 member_a;\n" 14329 " vec4 member_b;\n" 14330 "};\n"; 14331 14332 static const GLchar* struct_with_array = "struct StructureWithArray {\n" 14333 " vec4 member_a;\n" 14334 " vec4 member_b[2];\n" 14335 "};\n"; 14336 14337 static const GLchar* struct_with_struct = "struct StructureWithStructure {\n" 14338 " BasicStructure member_a;\n" 14339 " vec4 member_b;\n" 14340 "};\n"; 14341 14342 static const GLchar* struct_with_struct_array = "struct StructureWithStructArray {\n" 14343 " vec4 member_a;\n" 14344 " BasicStructure member_b[3];\n" 14345 "};\n"; 14346 14347 static const GLchar* struct_with_struct_with_array = "struct StructureWithStructureWithArray {\n" 14348 " StructureWithArray member_a;\n" 14349 " vec4 member_b;\n" 14350 "};\n"; 14351 14352 std::string type_definition; 14353 14354 switch (test_case.m_initializer) 14355 { 14356 case VECTOR: 14357 case MATRIX: 14358 case MATRIX_ROWS: 14359 case ARRAY_SCALAR: 14360 case ARRAY_VECTOR_CTR: 14361 case ARRAY_VECTOR_LIST: 14362 case ARRAY_MATRIX_CTR: 14363 case ARRAY_MATRIX_LIST: 14364 case UNSIZED_ARRAY_SCALAR: 14365 case UNSIZED_ARRAY_VECTOR: 14366 case UNSIZED_ARRAY_MATRIX: 14367 type_definition = ""; 14368 break; 14369 case STRUCT: 14370 case ARRAY_STRUCT: 14371 case UNSIZED_ARRAY_STRUCT: 14372 type_definition = basic_struct; 14373 break; 14374 case NESTED_STRUCT_CTR: 14375 case NESTED_STRUCT_LIST: 14376 case NESTED_ARRAY_STRUCT_STRUCT_LIST: 14377 case NESTED_ARRAY_STRUCT_STRUCT_MIX: 14378 type_definition = basic_struct; 14379 type_definition.append(struct_with_struct); 14380 break; 14381 case NESTED_STURCT_ARRAYS_STRUCT_LIST: 14382 case NESTED_STURCT_ARRAYS_STRUCT_MIX: 14383 type_definition = basic_struct; 14384 type_definition.append(struct_with_struct_array); 14385 break; 14386 case NESTED_STRUCT_STRUCT_ARRAY_LIST: 14387 case NESTED_STRUCT_STRUCT_ARRAY_MIX: 14388 type_definition = struct_with_array; 14389 type_definition.append(struct_with_struct_with_array); 14390 break; 14391 default: 14392 TCU_FAIL("Invalid enum"); 14393 break; 14394 } 14395 14396 return type_definition; 14397 } 14398 14399 /** Get string representing name of variable's type for current test case 14400 * 14401 * @return String 14402 **/ 14403 std::string InitializerListTest::getTypeName() 14404 { 14405 const testCase& test_case = m_test_cases[m_current_test_case_index]; 14406 14407 static const GLchar* basic_struct = "BasicStructure"; 14408 14409 static const GLchar* struct_with_struct = "StructureWithStructure"; 14410 14411 static const GLchar* struct_with_struct_array = "StructureWithStructArray"; 14412 14413 static const GLchar* struct_with_struct_with_array = "StructureWithStructureWithArray"; 14414 14415 std::string type_name; 14416 14417 switch (test_case.m_initializer) 14418 { 14419 case VECTOR: 14420 case MATRIX: 14421 case MATRIX_ROWS: 14422 case ARRAY_VECTOR_CTR: 14423 case ARRAY_VECTOR_LIST: 14424 case ARRAY_MATRIX_CTR: 14425 case ARRAY_MATRIX_LIST: 14426 case UNSIZED_ARRAY_VECTOR: 14427 case UNSIZED_ARRAY_MATRIX: 14428 type_name = Utils::getTypeName(Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows); 14429 break; 14430 case STRUCT: 14431 case ARRAY_STRUCT: 14432 case UNSIZED_ARRAY_STRUCT: 14433 type_name = basic_struct; 14434 break; 14435 case NESTED_STRUCT_CTR: 14436 case NESTED_STRUCT_LIST: 14437 case NESTED_ARRAY_STRUCT_STRUCT_LIST: 14438 case NESTED_ARRAY_STRUCT_STRUCT_MIX: 14439 type_name = struct_with_struct; 14440 break; 14441 case NESTED_STURCT_ARRAYS_STRUCT_LIST: 14442 case NESTED_STURCT_ARRAYS_STRUCT_MIX: 14443 type_name = struct_with_struct_array; 14444 break; 14445 case NESTED_STRUCT_STRUCT_ARRAY_LIST: 14446 case NESTED_STRUCT_STRUCT_ARRAY_MIX: 14447 type_name = struct_with_struct_with_array; 14448 break; 14449 case ARRAY_SCALAR: 14450 case UNSIZED_ARRAY_SCALAR: 14451 type_name = "float"; 14452 break; 14453 default: 14454 TCU_FAIL("Invalid enum"); 14455 break; 14456 } 14457 14458 return type_name; 14459 } 14460 14461 /** Get string representing array of vector constructors 14462 * 14463 * @param columns Number of columns 14464 * @param size Size of vector 14465 * 14466 * @return String 14467 **/ 14468 std::string InitializerListTest::getVectorArrayCtr(GLuint columns, GLuint size) 14469 { 14470 std::string result; 14471 14472 for (GLuint col = 0; col < columns; ++col) 14473 { 14474 result.append(getVectorConstructor(col, size)); 14475 14476 if (col + 1 < columns) 14477 { 14478 result.append(", "); 14479 } 14480 } 14481 14482 return result; 14483 } 14484 14485 /** Get string representing array of vector initializers 14486 * 14487 * @param columns Number of columns 14488 * @param size Size of vector 14489 * 14490 * @return String 14491 **/ 14492 std::string InitializerListTest::getVectorArrayList(GLuint columns, GLuint size) 14493 { 14494 std::string result; 14495 14496 for (GLuint col = 0; col < columns; ++col) 14497 { 14498 result.append(getVectorInitializer(col, size)); 14499 14500 if (col + 1 < columns) 14501 { 14502 result.append(", "); 14503 } 14504 } 14505 14506 return result; 14507 } 14508 14509 /** Get string representing vector constructor 14510 * 14511 * @param column Index of column of uni_matrix to use as data source 14512 * @param size Size of vector 14513 * 14514 * @return String 14515 **/ 14516 std::string InitializerListTest::getVectorConstructor(GLuint column, GLuint size) 14517 { 14518 const std::string& type_name = Utils::getTypeName(Utils::FLOAT, 1 /*n_cols*/, size); 14519 14520 std::string result; 14521 14522 result.append(type_name); 14523 result.append("("); 14524 result.append(getVectorValues(column, size)); 14525 result.append(")"); 14526 14527 return result; 14528 } 14529 14530 /** Get string representing vector initializer 14531 * 14532 * @param column Index of column of uni_matrix to use as data source 14533 * @param size Size of vector 14534 * 14535 * @return String 14536 **/ 14537 std::string InitializerListTest::getVectorInitializer(GLuint column, GLuint size) 14538 { 14539 std::string result; 14540 14541 result.append("{"); 14542 result.append(getVectorValues(column, size)); 14543 result.append("}"); 14544 14545 return result; 14546 } 14547 14548 /** Get string representing sum of vector array. Token INDEX in name will be replaced with element index. 14549 * 14550 * @param array_name Name of array variable 14551 * @param columns Number of columns to sum 14552 * @param size Size of vector 14553 * 14554 * @return String 14555 **/ 14556 std::string InitializerListTest::getVectorArraySum(const GLchar* array_name, GLuint columns, GLuint size) 14557 { 14558 static const GLchar* lut[] = { "0", "1", "2", "3" }; 14559 14560 std::string sum; 14561 14562 for (GLuint i = 0; i < columns; ++i) 14563 { 14564 size_t position = 0; 14565 std::string name = array_name; 14566 14567 Utils::replaceToken("INDEX", position, lut[i], name); 14568 14569 sum.append(getVectorSum(name.c_str(), size)); 14570 14571 if (i + 1 < columns) 14572 { 14573 sum.append(" + "); 14574 } 14575 } 14576 14577 return sum; 14578 } 14579 14580 /** Get string representing sum of vectors' elements 14581 * 14582 * @param vector_name Name of vector variable 14583 * @param size Size of vector 14584 * 14585 * @return String 14586 **/ 14587 std::string InitializerListTest::getVectorSum(const GLchar* vector_name, GLuint size) 14588 { 14589 static const GLchar* lut[] = { 14590 ".x", ".y", ".z", ".w", 14591 }; 14592 14593 std::string sum; 14594 14595 for (GLuint i = 0; i < size; ++i) 14596 { 14597 sum.append(vector_name); 14598 sum.append(lut[i]); 14599 14600 if (i + 1 < size) 14601 { 14602 sum.append(" + "); 14603 } 14604 } 14605 14606 return sum; 14607 } 14608 14609 /** Get string representing vector values 14610 * 14611 * @param column Index of column of uni_matrix to use as data source 14612 * @param size Size of vector 14613 * 14614 * @return String 14615 **/ 14616 std::string InitializerListTest::getVectorValues(GLuint column, GLuint size) 14617 { 14618 const GLchar* init_template = 0; 14619 const GLchar* column_index = 0; 14620 14621 switch (size) 14622 { 14623 case 2: 14624 init_template = "uni_matrix[COLUMN].x, uni_matrix[COLUMN].y"; 14625 break; 14626 case 3: 14627 init_template = "uni_matrix[COLUMN].x, uni_matrix[COLUMN].y, uni_matrix[COLUMN].z"; 14628 break; 14629 case 4: 14630 init_template = "uni_matrix[COLUMN].z, uni_matrix[COLUMN].y, uni_matrix[COLUMN].z, uni_matrix[COLUMN].w"; 14631 break; 14632 } 14633 14634 switch (column) 14635 { 14636 case 0: 14637 column_index = "0"; 14638 break; 14639 case 1: 14640 column_index = "1"; 14641 break; 14642 case 2: 14643 column_index = "2"; 14644 break; 14645 case 3: 14646 column_index = "3"; 14647 break; 14648 } 14649 14650 std::string initializer = init_template; 14651 14652 Utils::replaceAllTokens("COLUMN", column_index, initializer); 14653 14654 return initializer; 14655 } 14656 14657 /** Constructor 14658 * 14659 * @param context Test context 14660 **/ 14661 InitializerListNegativeTest::InitializerListNegativeTest(deqp::Context& context) 14662 : NegativeTestBase(context, "initializer_list_negative", "Verifies invalid initializers") 14663 { 14664 /* Nothing to be done here */ 14665 } 14666 14667 /** Set up next test case 14668 * 14669 * @param test_case_index Index of next test case 14670 * 14671 * @return false if there is no more test cases, true otherwise 14672 **/ 14673 bool InitializerListNegativeTest::prepareNextTestCase(glw::GLuint test_case_index) 14674 { 14675 m_current_test_case_index = test_case_index; 14676 14677 if ((glw::GLuint)-1 == test_case_index) 14678 { 14679 m_current_test_case_index = 0; 14680 return true; 14681 } 14682 else if (m_test_cases.size() <= test_case_index) 14683 { 14684 return false; 14685 } 14686 14687 logTestCaseName(); 14688 14689 return true; 14690 } 14691 14692 /** Prepare source for given shader stage 14693 * 14694 * @param in_stage Shader stage, compute shader will use 430 14695 * @param in_use_version_400 Select if 400 or 420 should be used 14696 * @param out_source Prepared shader source instance 14697 **/ 14698 void InitializerListNegativeTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 14699 Utils::shaderSource& out_source) 14700 { 14701 static const GLchar* verification_snippet = " TYPE_NAME variable = INITIALIZATION;\n" 14702 "\n" 14703 " float sum = SUM;\n" 14704 "\n" 14705 " if (0 != sum)\n" 14706 " {\n" 14707 " result = vec4(1, 0, 0, 1);\n" 14708 " }\n"; 14709 14710 static const GLchar* compute_shader_template = 14711 "VERSION\n" 14712 "\n" 14713 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 14714 "\n" 14715 "writeonly uniform image2D uni_image;\n" 14716 "\n" 14717 "TYPE_DEFINITION\n" 14718 "\n" 14719 "void main()\n" 14720 "{\n" 14721 " vec4 result = vec4(0, 1, 0, 1);\n" 14722 "\n" 14723 "VERIFICATION" 14724 "\n" 14725 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 14726 "}\n" 14727 "\n"; 14728 14729 static const GLchar* fragment_shader_template = "VERSION\n" 14730 "\n" 14731 "in vec4 gs_fs_result;\n" 14732 "out vec4 fs_out_result;\n" 14733 "\n" 14734 "TYPE_DEFINITION\n" 14735 "\n" 14736 "void main()\n" 14737 "{\n" 14738 " vec4 result = vec4(0, 1, 0, 1);\n" 14739 "\n" 14740 "VERIFICATION" 14741 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 14742 " {\n" 14743 " result = vec4(1, 0, 0, 1);\n" 14744 " }\n" 14745 "\n" 14746 " fs_out_result = result;\n" 14747 "}\n" 14748 "\n"; 14749 14750 static const GLchar* geometry_shader_template = "VERSION\n" 14751 "\n" 14752 "layout(points) in;\n" 14753 "layout(triangle_strip, max_vertices = 4) out;\n" 14754 "\n" 14755 "in vec4 tes_gs_result[];\n" 14756 "out vec4 gs_fs_result;\n" 14757 "\n" 14758 "TYPE_DEFINITION\n" 14759 "\n" 14760 "void main()\n" 14761 "{\n" 14762 " vec4 result = vec4(0, 1, 0, 1);\n" 14763 "\n" 14764 "VERIFICATION" 14765 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 14766 " {\n" 14767 " result = vec4(1, 0, 0, 1);\n" 14768 " }\n" 14769 "\n" 14770 " gs_fs_result = result;\n" 14771 " gl_Position = vec4(-1, -1, 0, 1);\n" 14772 " EmitVertex();\n" 14773 " gs_fs_result = result;\n" 14774 " gl_Position = vec4(-1, 1, 0, 1);\n" 14775 " EmitVertex();\n" 14776 " gs_fs_result = result;\n" 14777 " gl_Position = vec4(1, -1, 0, 1);\n" 14778 " EmitVertex();\n" 14779 " gs_fs_result = result;\n" 14780 " gl_Position = vec4(1, 1, 0, 1);\n" 14781 " EmitVertex();\n" 14782 "}\n" 14783 "\n"; 14784 14785 static const GLchar* tess_ctrl_shader_template = 14786 "VERSION\n" 14787 "\n" 14788 "layout(vertices = 1) out;\n" 14789 "\n" 14790 "in vec4 vs_tcs_result[];\n" 14791 "out vec4 tcs_tes_result[];\n" 14792 "\n" 14793 "TYPE_DEFINITION\n" 14794 "\n" 14795 "void main()\n" 14796 "{\n" 14797 " vec4 result = vec4(0, 1, 0, 1);\n" 14798 "\n" 14799 "VERIFICATION" 14800 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 14801 " {\n" 14802 " result = vec4(1, 0, 0, 1);\n" 14803 " }\n" 14804 "\n" 14805 " tcs_tes_result[gl_InvocationID] = result;\n" 14806 "\n" 14807 " gl_TessLevelOuter[0] = 1.0;\n" 14808 " gl_TessLevelOuter[1] = 1.0;\n" 14809 " gl_TessLevelOuter[2] = 1.0;\n" 14810 " gl_TessLevelOuter[3] = 1.0;\n" 14811 " gl_TessLevelInner[0] = 1.0;\n" 14812 " gl_TessLevelInner[1] = 1.0;\n" 14813 "}\n" 14814 "\n"; 14815 14816 static const GLchar* tess_eval_shader_template = "VERSION\n" 14817 "\n" 14818 "layout(isolines, point_mode) in;\n" 14819 "\n" 14820 "in vec4 tcs_tes_result[];\n" 14821 "out vec4 tes_gs_result;\n" 14822 "\n" 14823 "TYPE_DEFINITION\n" 14824 "\n" 14825 "void main()\n" 14826 "{\n" 14827 " vec4 result = vec4(0, 1, 0, 1);\n" 14828 "\n" 14829 "VERIFICATION" 14830 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 14831 " {\n" 14832 " result = vec4(1, 0, 0, 1);\n" 14833 " }\n" 14834 "\n" 14835 " tes_gs_result = result;\n" 14836 "}\n" 14837 "\n"; 14838 14839 static const GLchar* vertex_shader_template = "VERSION\n" 14840 "\n" 14841 "out vec4 vs_tcs_result;\n" 14842 "\n" 14843 "TYPE_DEFINITION\n" 14844 "\n" 14845 "void main()\n" 14846 "{\n" 14847 " vec4 result = vec4(0, 1, 0, 1);\n" 14848 "\n" 14849 "VERIFICATION" 14850 "\n" 14851 " vs_tcs_result = result;\n" 14852 "}\n" 14853 "\n"; 14854 14855 const std::string& initialization = getInitialization(); 14856 const GLchar* shader_template = 0; 14857 const std::string& sum = getSum(); 14858 const std::string& type_definition = getTypeDefinition(); 14859 const std::string& type_name = getTypeName(); 14860 14861 switch (in_stage) 14862 { 14863 case Utils::COMPUTE_SHADER: 14864 shader_template = compute_shader_template; 14865 break; 14866 case Utils::FRAGMENT_SHADER: 14867 shader_template = fragment_shader_template; 14868 break; 14869 case Utils::GEOMETRY_SHADER: 14870 shader_template = geometry_shader_template; 14871 break; 14872 case Utils::TESS_CTRL_SHADER: 14873 shader_template = tess_ctrl_shader_template; 14874 break; 14875 case Utils::TESS_EVAL_SHADER: 14876 shader_template = tess_eval_shader_template; 14877 break; 14878 case Utils::VERTEX_SHADER: 14879 shader_template = vertex_shader_template; 14880 break; 14881 default: 14882 TCU_FAIL("Invalid enum"); 14883 break; 14884 } 14885 14886 out_source.m_parts[0].m_code = shader_template; 14887 14888 size_t position = 0; 14889 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 14890 out_source.m_parts[0].m_code); 14891 14892 Utils::replaceToken("TYPE_DEFINITION", position, type_definition.c_str(), out_source.m_parts[0].m_code); 14893 14894 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 14895 14896 position -= strlen(verification_snippet); 14897 14898 Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code); 14899 14900 Utils::replaceToken("INITIALIZATION", position, initialization.c_str(), out_source.m_parts[0].m_code); 14901 14902 Utils::replaceToken("SUM", position, sum.c_str(), out_source.m_parts[0].m_code); 14903 } 14904 14905 /** Prepare test cases 14906 * 14907 * @return true 14908 **/ 14909 bool InitializerListNegativeTest::testInit() 14910 { 14911 for (GLuint i = 0; i < TESTED_ERRORS_MAX; ++i) 14912 { 14913 const TESTED_ERRORS error = (TESTED_ERRORS)i; 14914 14915 m_test_cases.push_back(error); 14916 } 14917 14918 return true; 14919 } 14920 14921 /** Get string representing initialization list for current test case 14922 * 14923 * @return String 14924 **/ 14925 std::string InitializerListNegativeTest::getInitialization() 14926 { 14927 const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index]; 14928 14929 std::string initialization; 14930 14931 switch (error) 14932 { 14933 case TYPE_UIVEC_BOOL: 14934 initialization = "{ true, 0, 1, 2 }"; 14935 14936 break; 14937 14938 case TYPE_IVEC_BOOL: 14939 initialization = "{ true, 0, -1, 2 }"; 14940 14941 break; 14942 14943 case TYPE_VEC_BOOL: 14944 initialization = "{ true, 0.125, 0.25, 0.375 }"; 14945 14946 break; 14947 14948 case TYPE_MAT_BOOL: 14949 initialization = "{ {false, 0, 1, 1}, {0, 1, 0, 1}, {1, 0, 1, 0}, {0, 1, 0, 1} }"; 14950 14951 break; 14952 14953 case COMPONENTS_VEC_LESS: 14954 case COMPONENTS_VEC_MORE: 14955 initialization = "{ 0, 0.25, 0.375 }"; 14956 14957 break; 14958 14959 case COMPONENTS_MAT_LESS_ROWS: 14960 initialization = "{ {0, 0, 1, 1}, {0, 0, 1}, {1, 0, 1, 0}, {0, 1, 0, 1} }"; 14961 14962 break; 14963 14964 case COMPONENTS_MAT_MORE_ROWS: 14965 initialization = "{ {0, 0, 1}, {0, 0, 1}, {1, 0, 1, 0}, {1, 0, 1} }"; 14966 14967 break; 14968 14969 case COMPONENTS_MAT_LESS_COLUMNS: 14970 initialization = "{ {0, 0, 1, 1}, {1, 0, 1, 0}, {0, 1, 0, 1} }"; 14971 14972 break; 14973 14974 case COMPONENTS_MAT_MORE_COLUMNS: 14975 initialization = "{ {0, 0, 1}, {0, 0, 1}, {1, 0, 1}, {1, 0, 1} }"; 14976 14977 break; 14978 14979 case LIST_IN_CONSTRUCTOR: 14980 initialization = "Struct( { vec4(0, 1, 0, 1), vec3(0, 1, 0) }, vec4(1, 0, 1, 0) )"; 14981 14982 break; 14983 14984 case STRUCT_LAYOUT_MEMBER_TYPE: 14985 initialization = "{ { {0, 1, 0, 1}, vec4(0, 1, 0, 1) }, vec4(1, 0, 1, 0) }"; 14986 14987 break; 14988 14989 case STRUCT_LAYOUT_MEMBER_COUNT_MORE: 14990 initialization = "{ { {0, 1, 0, 1}, vec3(0, 1, 0) } , vec4(1, 0, 1, 0), vec4(1, 0, 1, 0) }"; 14991 14992 break; 14993 14994 case STRUCT_LAYOUT_MEMBER_COUNT_LESS: 14995 initialization = "{ { {0, 1, 0, 1}, vec3(0, 1, 0) } }"; 14996 14997 break; 14998 14999 case STRUCT_LAYOUT_MEMBER_ORDER: 15000 initialization = "{ vec4(1, 0, 1, 0), { vec3(0, 1, 0) , {0, 1, 0, 1} } }"; 15001 15002 break; 15003 15004 default: 15005 TCU_FAIL("Invalid enum"); 15006 break; 15007 } 15008 15009 return initialization; 15010 } 15011 15012 /** Logs description of current test case 15013 * 15014 **/ 15015 void InitializerListNegativeTest::logTestCaseName() 15016 { 15017 const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index]; 15018 15019 tcu::MessageBuilder message = m_context.getTestContext().getLog() << tcu::TestLog::Message; 15020 15021 switch (error) 15022 { 15023 case TYPE_UIVEC_BOOL: 15024 message << "Wrong type in uvec initializer list"; 15025 break; 15026 case TYPE_IVEC_BOOL: 15027 message << "Wrong type in ivec initializer list"; 15028 break; 15029 case TYPE_VEC_BOOL: 15030 message << "Wrong type in vec initializer list"; 15031 break; 15032 case TYPE_MAT_BOOL: 15033 message << "Wrong type in mat initializer list"; 15034 break; 15035 case COMPONENTS_VEC_LESS: 15036 message << "Wrong number of componenets in vec initialize list - less"; 15037 break; 15038 case COMPONENTS_VEC_MORE: 15039 message << "Wrong number of componenets in vec initialize list - more"; 15040 break; 15041 case COMPONENTS_MAT_LESS_ROWS: 15042 message << "Wrong number of componenets in mat initialize list - less rows"; 15043 break; 15044 case COMPONENTS_MAT_LESS_COLUMNS: 15045 message << "Wrong number of componenets in mat initialize list - less columns"; 15046 break; 15047 case COMPONENTS_MAT_MORE_ROWS: 15048 message << "Wrong number of componenets in mat initialize list - more rows"; 15049 break; 15050 case COMPONENTS_MAT_MORE_COLUMNS: 15051 message << "Wrong number of componenets in mat initialize list - more columns"; 15052 break; 15053 case LIST_IN_CONSTRUCTOR: 15054 message << "Initializer list in constructor"; 15055 break; 15056 case STRUCT_LAYOUT_MEMBER_TYPE: 15057 message << "Wrong type of structure member"; 15058 break; 15059 case STRUCT_LAYOUT_MEMBER_COUNT_MORE: 15060 message << "Wrong number of structure members - more"; 15061 break; 15062 case STRUCT_LAYOUT_MEMBER_COUNT_LESS: 15063 message << "Wrong number of structure members - less"; 15064 break; 15065 case STRUCT_LAYOUT_MEMBER_ORDER: 15066 message << "Wrong order of structure members"; 15067 break; 15068 default: 15069 TCU_FAIL("Invalid enum"); 15070 break; 15071 } 15072 15073 message << tcu::TestLog::EndMessage; 15074 } 15075 15076 /** Get string representing sum for current test case 15077 * 15078 * @return String 15079 **/ 15080 std::string InitializerListNegativeTest::getSum() 15081 { 15082 const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index]; 15083 15084 std::string sum; 15085 15086 switch (error) 15087 { 15088 case TYPE_UIVEC_BOOL: 15089 case TYPE_IVEC_BOOL: 15090 case TYPE_VEC_BOOL: 15091 case COMPONENTS_VEC_LESS: 15092 sum = "variable.x + variable.y + variable.z + variable.w"; 15093 break; 15094 case TYPE_MAT_BOOL: 15095 case COMPONENTS_MAT_LESS_ROWS: 15096 case COMPONENTS_MAT_LESS_COLUMNS: 15097 sum = "variable[0].x + variable[0].y + variable[0].z + variable[0].w + " 15098 "variable[1].x + variable[1].y + variable[1].z + variable[1].w + " 15099 "variable[2].x + variable[2].y + variable[2].z + variable[2].w + " 15100 "variable[3].x + variable[3].y + variable[3].z + variable[3].w"; 15101 break; 15102 case COMPONENTS_VEC_MORE: 15103 sum = "variable.x + variable.y + variable.z"; 15104 break; 15105 case COMPONENTS_MAT_MORE_ROWS: 15106 case COMPONENTS_MAT_MORE_COLUMNS: 15107 sum = "variable[0].x + variable[0].y + variable[0].z" 15108 "variable[1].x + variable[1].y + variable[1].z" 15109 "variable[2].x + variable[2].y + variable[2].z"; 15110 break; 15111 case LIST_IN_CONSTRUCTOR: 15112 case STRUCT_LAYOUT_MEMBER_TYPE: 15113 case STRUCT_LAYOUT_MEMBER_COUNT_MORE: 15114 case STRUCT_LAYOUT_MEMBER_COUNT_LESS: 15115 case STRUCT_LAYOUT_MEMBER_ORDER: 15116 sum = "variable.member_a.member_a.x + variable.member_a.member_a.y + variable.member_a.member_a.z + " 15117 "variable.member_a.member_a.w + " 15118 "variable.member_a.member_b.x + variable.member_a.member_b.y + variable.member_a.member_b.z + " 15119 "variable.member_b.x + variable.member_b.y + variable.member_b.z + variable.member_b.w"; 15120 break; 15121 default: 15122 TCU_FAIL("Invalid enum"); 15123 break; 15124 } 15125 15126 return sum; 15127 } 15128 15129 /** Get string representing types definition for current test case 15130 * 15131 * @return String 15132 **/ 15133 std::string InitializerListNegativeTest::getTypeDefinition() 15134 { 15135 const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index]; 15136 15137 static const GLchar* struct_def = "struct BasicStructure {\n" 15138 " vec4 member_a;\n" 15139 " vec3 member_b;\n" 15140 "};\n" 15141 "\n" 15142 "struct StructureWithStructure {\n" 15143 " BasicStructure member_a;\n" 15144 " vec4 member_b;\n" 15145 "};\n"; 15146 15147 std::string type_definition; 15148 15149 switch (error) 15150 { 15151 case TYPE_UIVEC_BOOL: 15152 case TYPE_IVEC_BOOL: 15153 case TYPE_VEC_BOOL: 15154 case TYPE_MAT_BOOL: 15155 case COMPONENTS_VEC_LESS: 15156 case COMPONENTS_VEC_MORE: 15157 case COMPONENTS_MAT_LESS_ROWS: 15158 case COMPONENTS_MAT_LESS_COLUMNS: 15159 case COMPONENTS_MAT_MORE_ROWS: 15160 case COMPONENTS_MAT_MORE_COLUMNS: 15161 type_definition = ""; 15162 break; 15163 case LIST_IN_CONSTRUCTOR: 15164 case STRUCT_LAYOUT_MEMBER_TYPE: 15165 case STRUCT_LAYOUT_MEMBER_COUNT_MORE: 15166 case STRUCT_LAYOUT_MEMBER_COUNT_LESS: 15167 case STRUCT_LAYOUT_MEMBER_ORDER: 15168 type_definition = struct_def; 15169 break; 15170 default: 15171 TCU_FAIL("Invalid enum"); 15172 break; 15173 } 15174 15175 return type_definition; 15176 } 15177 15178 /** Get string representing name of variable's type for current test case 15179 * 15180 * @return String 15181 **/ 15182 std::string InitializerListNegativeTest::getTypeName() 15183 { 15184 const TESTED_ERRORS& error = m_test_cases[m_current_test_case_index]; 15185 15186 static const GLchar* struct_with_struct = "StructureWithStructure"; 15187 15188 std::string type_name; 15189 15190 switch (error) 15191 { 15192 case TYPE_UIVEC_BOOL: 15193 type_name = "uvec4"; 15194 break; 15195 case TYPE_IVEC_BOOL: 15196 type_name = "ivec4"; 15197 break; 15198 case TYPE_VEC_BOOL: 15199 case COMPONENTS_VEC_LESS: 15200 type_name = "vec4"; 15201 break; 15202 case COMPONENTS_VEC_MORE: 15203 type_name = "vec2"; 15204 break; 15205 case TYPE_MAT_BOOL: 15206 case COMPONENTS_MAT_LESS_ROWS: 15207 case COMPONENTS_MAT_LESS_COLUMNS: 15208 type_name = "mat4"; 15209 break; 15210 case COMPONENTS_MAT_MORE_ROWS: 15211 case COMPONENTS_MAT_MORE_COLUMNS: 15212 type_name = "mat3"; 15213 break; 15214 break; 15215 case LIST_IN_CONSTRUCTOR: 15216 case STRUCT_LAYOUT_MEMBER_TYPE: 15217 case STRUCT_LAYOUT_MEMBER_COUNT_MORE: 15218 case STRUCT_LAYOUT_MEMBER_COUNT_LESS: 15219 case STRUCT_LAYOUT_MEMBER_ORDER: 15220 type_name = struct_with_struct; 15221 break; 15222 default: 15223 TCU_FAIL("Invalid enum"); 15224 break; 15225 } 15226 15227 return type_name; 15228 } 15229 15230 /** Constructor 15231 * 15232 * @param context Test context 15233 **/ 15234 LengthOfVectorAndMatrixTest::LengthOfVectorAndMatrixTest(deqp::Context& context) 15235 : GLSLTestBase(context, "length_of_vector_and_matrix", "Test verifies .length() for vectors and matrices") 15236 { 15237 /* Nothing to be done here */ 15238 } 15239 15240 /** Set up next test case 15241 * 15242 * @param test_case_index Index of next test case 15243 * 15244 * @return false if there is no more test cases, true otherwise 15245 **/ 15246 bool LengthOfVectorAndMatrixTest::prepareNextTestCase(glw::GLuint test_case_index) 15247 { 15248 m_current_test_case_index = test_case_index; 15249 15250 if ((glw::GLuint)-1 == test_case_index) 15251 { 15252 m_current_test_case_index = 0; 15253 return true; 15254 } 15255 else if (m_test_cases.size() <= test_case_index) 15256 { 15257 return false; 15258 } 15259 15260 const testCase& test_case = m_test_cases[m_current_test_case_index]; 15261 15262 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Tested type: " 15263 << Utils::getTypeName(test_case.m_type, test_case.m_n_cols, test_case.m_n_rows) 15264 << tcu::TestLog::EndMessage; 15265 15266 return true; 15267 } 15268 15269 /** Prepare source for given shader stage 15270 * 15271 * @param in_stage Shader stage, compute shader will use 430 15272 * @param in_use_version_400 Select if 400 or 420 should be used 15273 * @param out_source Prepared shader source instance 15274 **/ 15275 void LengthOfVectorAndMatrixTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 15276 Utils::shaderSource& out_source) 15277 { 15278 if (Utils::COMPUTE_SHADER == in_stage) 15279 { 15280 m_is_compute_program = true; 15281 prepareComputeShaderSource(out_source); 15282 } 15283 else 15284 { 15285 m_is_compute_program = false; 15286 prepareDrawShaderSource(in_stage, in_use_version_400, out_source); 15287 } 15288 } 15289 15290 /** Overwritte of prepareUniforms method 15291 * 15292 * @param program Current program 15293 **/ 15294 void LengthOfVectorAndMatrixTest::prepareUniforms(Utils::program& program) 15295 { 15296 static const GLfloat float_value = 0.125; 15297 static const GLint int_value = -1; 15298 static const GLuint uint_value = 1; 15299 15300 static const GLfloat float_data[16] = { float_value, float_value, float_value, float_value, 15301 float_value, float_value, float_value, float_value, 15302 float_value, float_value, float_value, float_value, 15303 float_value, float_value, float_value, float_value }; 15304 15305 static const GLint int_data[4] = { int_value, int_value, int_value, int_value }; 15306 15307 static const GLuint uint_data[4] = { uint_value, uint_value, uint_value, uint_value }; 15308 15309 if (false == m_is_compute_program) 15310 { 15311 return; 15312 } 15313 15314 const testCase& test_case = m_test_cases[m_current_test_case_index]; 15315 15316 switch (test_case.m_type) 15317 { 15318 case Utils::FLOAT: 15319 program.uniform("uni_variable", Utils::FLOAT, test_case.m_n_cols, test_case.m_n_rows, float_data); 15320 break; 15321 case Utils::INT: 15322 program.uniform("uni_variable", Utils::INT, 1 /* columns */, test_case.m_n_rows, int_data); 15323 break; 15324 case Utils::UINT: 15325 program.uniform("uni_variable", Utils::UINT, 1 /* columns */, test_case.m_n_rows, uint_data); 15326 break; 15327 default: 15328 TCU_FAIL("Invalid enum"); 15329 } 15330 } 15331 15332 /** Prepare vertex buffer 15333 * 15334 * @param program Program object 15335 * @param buffer Vertex buffer 15336 * @param vao Vertex array object 15337 * 15338 * @return 0 15339 **/ 15340 void LengthOfVectorAndMatrixTest::prepareVertexBuffer(const Utils::program& program, Utils::buffer& buffer, 15341 Utils::vertexArray& vao) 15342 { 15343 static const GLfloat float_value = 0.125f; 15344 static const GLint int_value = -1; 15345 static const GLuint uint_value = 1; 15346 15347 static const GLfloat float_data[16] = { float_value, float_value, float_value, float_value, 15348 float_value, float_value, float_value, float_value, 15349 float_value, float_value, float_value, float_value, 15350 float_value, float_value, float_value, float_value }; 15351 15352 static const GLint int_data[4] = { int_value, int_value, int_value, int_value }; 15353 15354 static const GLuint uint_data[4] = { uint_value, uint_value, uint_value, uint_value }; 15355 15356 const testCase& test_case = m_test_cases[m_current_test_case_index]; 15357 15358 std::string variable_name = Utils::getVariableName(Utils::VERTEX_SHADER, Utils::INPUT, "variable"); 15359 GLint variable_loc = program.getAttribLocation(variable_name.c_str()); 15360 15361 if (-1 == variable_loc) 15362 { 15363 TCU_FAIL("Vertex attribute location is invalid"); 15364 } 15365 15366 vao.generate(); 15367 vao.bind(); 15368 15369 buffer.generate(GL_ARRAY_BUFFER); 15370 15371 GLvoid* data_ptr = 0; 15372 GLsizeiptr data_size = 0; 15373 15374 switch (test_case.m_type) 15375 { 15376 case Utils::FLOAT: 15377 data_ptr = (GLvoid*)float_data; 15378 data_size = sizeof(float_data); 15379 break; 15380 case Utils::INT: 15381 data_ptr = (GLvoid*)int_data; 15382 data_size = sizeof(int_data); 15383 break; 15384 case Utils::UINT: 15385 data_ptr = (GLvoid*)uint_data; 15386 data_size = sizeof(uint_data); 15387 break; 15388 default: 15389 TCU_FAIL("Invalid enum"); 15390 } 15391 15392 buffer.update(data_size, data_ptr, GL_STATIC_DRAW); 15393 15394 /* GL entry points */ 15395 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 15396 15397 /* Set up vao */ 15398 switch (test_case.m_type) 15399 { 15400 case Utils::FLOAT: 15401 for (GLuint col = 0; col < test_case.m_n_cols; ++col) 15402 { 15403 const GLuint index = variable_loc + col; 15404 const GLint size = test_case.m_n_rows; 15405 const GLvoid* offset = (const GLvoid*)(test_case.m_n_rows * sizeof(GLfloat) * col); 15406 15407 gl.vertexAttribPointer(index, size, GL_FLOAT /* type */, GL_FALSE /* normalized*/, 0, offset); 15408 GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribPointer"); 15409 } 15410 break; 15411 case Utils::INT: 15412 gl.vertexAttribIPointer(variable_loc, test_case.m_n_rows /* size */, GL_INT /* type */, 0 /* stride */, 15413 0 /* offset */); 15414 GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribIPointer"); 15415 break; 15416 case Utils::UINT: 15417 gl.vertexAttribIPointer(variable_loc, test_case.m_n_rows /* size */, GL_UNSIGNED_INT /* type */, 0 /* stride */, 15418 0 /* offset */); 15419 GLU_EXPECT_NO_ERROR(gl.getError(), "VertexAttribIPointer"); 15420 break; 15421 default: 15422 DE_ASSERT(0); 15423 break; 15424 } 15425 15426 /* Enable attribute */ 15427 for (GLuint col = 0; col < test_case.m_n_cols; ++col) 15428 { 15429 gl.enableVertexAttribArray(variable_loc + col); 15430 GLU_EXPECT_NO_ERROR(gl.getError(), "EnableVertexAttribArray"); 15431 } 15432 } 15433 15434 /** Prepare test cases 15435 * 15436 * @return true 15437 **/ 15438 bool LengthOfVectorAndMatrixTest::testInit() 15439 { 15440 /* Vectors */ 15441 for (GLuint row = 2; row <= 4; ++row) 15442 { 15443 testCase test_case = { Utils::UINT, 1 /* n_cols */, row }; 15444 15445 m_test_cases.push_back(test_case); 15446 } 15447 15448 for (GLuint row = 2; row <= 4; ++row) 15449 { 15450 testCase test_case = { Utils::INT, 1 /* n_cols */, row }; 15451 15452 m_test_cases.push_back(test_case); 15453 } 15454 15455 for (GLuint row = 2; row <= 4; ++row) 15456 { 15457 testCase test_case = { Utils::FLOAT, 1 /* n_cols */, row }; 15458 15459 m_test_cases.push_back(test_case); 15460 } 15461 15462 /* Matrices */ 15463 for (GLuint col = 2; col <= 4; ++col) 15464 { 15465 for (GLuint row = 2; row <= 4; ++row) 15466 { 15467 testCase test_case = { Utils::FLOAT, col, row }; 15468 15469 m_test_cases.push_back(test_case); 15470 } 15471 } 15472 15473 return true; 15474 } 15475 15476 /** Get string representing value that should be placed at token EXPECTED_VALUE 15477 * 15478 * @param in_stage Shader stage 15479 * 15480 * @return String with value 15481 **/ 15482 std::string LengthOfVectorAndMatrixTest::getExpectedValue(Utils::SHADER_STAGES in_stage) 15483 { 15484 const testCase& test_case = m_test_cases[m_current_test_case_index]; 15485 15486 GLuint count = 0; 15487 15488 switch (in_stage) 15489 { 15490 case Utils::FRAGMENT_SHADER: 15491 count = 3; 15492 break; 15493 case Utils::COMPUTE_SHADER: 15494 count = 2; 15495 break; 15496 default: 15497 count = 4; 15498 } 15499 15500 if (1 == test_case.m_n_cols) 15501 { 15502 count *= test_case.m_n_rows; 15503 } 15504 else 15505 { 15506 count *= test_case.m_n_cols; 15507 } 15508 15509 std::string expected_value; 15510 expected_value.resize(64, 0); 15511 15512 switch (test_case.m_type) 15513 { 15514 case Utils::FLOAT: 15515 { 15516 GLfloat value = 0.125f * (GLfloat)count; 15517 sprintf(&expected_value[0], "%f", value); 15518 } 15519 break; 15520 case Utils::INT: 15521 { 15522 GLint value = -1 * (GLint)count; 15523 sprintf(&expected_value[0], "%d", value); 15524 } 15525 break; 15526 case Utils::UINT: 15527 { 15528 GLuint value = 1 * (GLuint)count; 15529 sprintf(&expected_value[0], "%d", value); 15530 } 15531 break; 15532 default: 15533 DE_ASSERT(0); 15534 break; 15535 } 15536 15537 return expected_value; 15538 } 15539 15540 /** Get string reresenting initialization of local variables for current test case 15541 * 15542 * @return String with initialization 15543 **/ 15544 std::string LengthOfVectorAndMatrixTest::getInitialization() 15545 { 15546 const testCase& test_case = m_test_cases[m_current_test_case_index]; 15547 15548 std::string initialization; 15549 15550 if (1 == test_case.m_n_cols) 15551 { 15552 initialization = getVectorInitializer(test_case.m_type, test_case.m_n_rows); 15553 } 15554 else 15555 { 15556 initialization = getMatrixInitializer(test_case.m_n_cols, test_case.m_n_rows); 15557 } 15558 15559 return initialization; 15560 } 15561 15562 /** Get string reresenting initialization of local matrix variables 15563 * 15564 * @param n_cols Number of columns 15565 * @param n_rows Number of rows 15566 * 15567 * @return String with initialization 15568 **/ 15569 std::string LengthOfVectorAndMatrixTest::getMatrixInitializer(GLuint n_cols, GLuint n_rows) 15570 { 15571 std::string result; 15572 15573 result.append("{ "); 15574 15575 for (GLuint col = 0; col < n_cols; ++col) 15576 { 15577 result.append(getVectorInitializer(Utils::FLOAT, n_rows)); 15578 15579 if (col + 1 < n_cols) 15580 { 15581 result.append(", "); 15582 } 15583 } 15584 15585 result.append(" }"); 15586 15587 return result; 15588 } 15589 15590 /** Get string reresenting initialization of local vector variables 15591 * 15592 * @param type Basic type of vector 15593 * @param n_rows Number of rows 15594 * 15595 * @return String with initialization 15596 **/ 15597 std::string LengthOfVectorAndMatrixTest::getVectorInitializer(Utils::TYPES type, glw::GLuint n_rows) 15598 { 15599 std::string result; 15600 const GLchar* value = 0; 15601 15602 switch (type) 15603 { 15604 case Utils::FLOAT: 15605 value = "0.125"; 15606 break; 15607 case Utils::UINT: 15608 value = "1"; 15609 break; 15610 case Utils::INT: 15611 value = "-1"; 15612 break; 15613 default: 15614 TCU_FAIL("Invalid enum"); 15615 } 15616 15617 result.append("{"); 15618 15619 for (GLuint row = 0; row < n_rows; ++row) 15620 { 15621 result.append(value); 15622 15623 if (row + 1 < n_rows) 15624 { 15625 result.append(", "); 15626 } 15627 } 15628 15629 result.append("}"); 15630 15631 return result; 15632 } 15633 15634 /** Prepare source for given shader stage 15635 * 15636 * @param in_stage Shader stage, compute shader will use 430 15637 * @param in_use_version_400 Select if 400 or 420 should be used 15638 * @param out_source Prepared shader source instance 15639 **/ 15640 void LengthOfVectorAndMatrixTest::prepareDrawShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 15641 Utils::shaderSource& out_source) 15642 { 15643 static const GLchar* verification_snippet = 15644 " VARIABLE_TYPE variable = INITIALIZATION;\n" 15645 " Structure structure = { { 0, 1, 0, 1 } , INITIALIZATION };\n" 15646 "\n" 15647 " const uint variable_length = variable.length();\n" 15648 " const uint structure_member_b_length = structure.member_b.length();\n" 15649 " const uint input_member_length = INPUT_VARIABLE_NAME.length();\n" 15650 "#ifndef FRAGMENT\n" 15651 " const uint output_member_length = OUTPUT_VARIABLE_NAME.length();\n" 15652 "#endif // FRAGMENT\n" 15653 "\n" 15654 " BASE_TYPE array_var[variable.length()];\n" 15655 " BASE_TYPE array_str[structure.member_b.length()];\n" 15656 " BASE_TYPE array_in [INPUT_VARIABLE_NAME.length()];\n" 15657 "#ifndef FRAGMENT\n" 15658 " BASE_TYPE array_out[OUTPUT_VARIABLE_NAME.length()];\n" 15659 "#endif // FRAGMENT\n" 15660 "\n" 15661 " BASE_TYPE sum = 0;\n" 15662 "\n" 15663 " for (uint i = 0; i < variable_length; ++i)\n" 15664 " {\n" 15665 " array_var[i] = variableARRAY_INDEX.x;\n" 15666 " }\n" 15667 "\n" 15668 " for (uint i = 0; i < structure_member_b_length; ++i)\n" 15669 " {\n" 15670 " array_str[i] = structure.member_bARRAY_INDEX.y;\n" 15671 " }\n" 15672 "\n" 15673 " for (uint i = 0; i < input_member_length; ++i)\n" 15674 " {\n" 15675 " array_in[i] = INPUT_VARIABLE_NAMEARRAY_INDEX.x;\n" 15676 " }\n" 15677 "\n" 15678 "#ifndef FRAGMENT\n" 15679 " for (uint i = 0; i < output_member_length; ++i)\n" 15680 " {\n" 15681 " array_out[i] = INPUT_VARIABLE_NAMEARRAY_INDEX.y;\n" 15682 " }\n" 15683 "#endif // FRAGMENT\n" 15684 "\n" 15685 " for (uint i = 0; i < array_var.length(); ++i)\n" 15686 " {\n" 15687 " sum += array_var[i];\n" 15688 " }\n" 15689 "\n" 15690 " for (uint i = 0; i < array_str.length(); ++i)\n" 15691 " {\n" 15692 " sum += array_str[i];\n" 15693 " }\n" 15694 "\n" 15695 " for (uint i = 0; i < array_in.length(); ++i)\n" 15696 " {\n" 15697 " sum += array_in[i];\n" 15698 " }\n" 15699 "\n" 15700 "#ifndef FRAGMENT\n" 15701 " for (uint i = 0; i < array_out.length(); ++i)\n" 15702 " {\n" 15703 " sum += array_out[i];\n" 15704 " }\n" 15705 "#endif // FRAGMENT\n" 15706 "\n" 15707 " if (EXPECTED_VALUE != sum)\n" 15708 " {\n" 15709 " result = vec4(1, 0, 0, 1);\n" 15710 " }\n"; 15711 15712 static const GLchar* fragment_shader_template = "VERSION\n" 15713 "\n" 15714 "#define FRAGMENT\n" 15715 "\n" 15716 "in vec4 gs_fs_result;\n" 15717 "out vec4 fs_out_result;\n" 15718 "\n" 15719 "in GSOutputBlock {\n" 15720 " VARIABLE_DECLARATION;\n" 15721 "} input_block;\n" 15722 "\n" 15723 "struct Structure {\n" 15724 " vec4 member_a;\n" 15725 " TYPE_NAME member_b;\n" 15726 "};\n" 15727 "\n" 15728 "void main()\n" 15729 "{\n" 15730 " vec4 result = vec4(0, 1, 0, 1);\n" 15731 "\n" 15732 "VERIFICATION" 15733 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 15734 " {\n" 15735 " result = vec4(1, 0, 0, 1);\n" 15736 " }\n" 15737 "\n" 15738 " fs_out_result = result;\n" 15739 "}\n" 15740 "\n"; 15741 15742 static const GLchar* geometry_shader_template = "VERSION\n" 15743 "\n" 15744 "layout(points) in;\n" 15745 "layout(triangle_strip, max_vertices = 4) out;\n" 15746 "\n" 15747 "in vec4 tes_gs_result[];\n" 15748 "out vec4 gs_fs_result;\n" 15749 "\n" 15750 "in TCSOutputBlock {\n" 15751 " VARIABLE_DECLARATION;\n" 15752 "} input_block[];\n" 15753 "out GSOutputBlock {\n" 15754 " VARIABLE_DECLARATION;\n" 15755 "} output_block;\n" 15756 "\n" 15757 "struct Structure {\n" 15758 " vec4 member_a;\n" 15759 " TYPE_NAME member_b;\n" 15760 "};\n" 15761 "\n" 15762 "void main()\n" 15763 "{\n" 15764 " vec4 result = vec4(0, 1, 0, 1);\n" 15765 "\n" 15766 "VERIFICATION" 15767 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 15768 " {\n" 15769 " result = vec4(1, 0, 0, 1);\n" 15770 " }\n" 15771 "\n" 15772 " gs_fs_result = result;\n" 15773 " gl_Position = vec4(-1, -1, 0, 1);\n" 15774 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 15775 " EmitVertex();\n" 15776 " gs_fs_result = result;\n" 15777 " gl_Position = vec4(-1, 1, 0, 1);\n" 15778 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 15779 " EmitVertex();\n" 15780 " gs_fs_result = result;\n" 15781 " gl_Position = vec4(1, -1, 0, 1);\n" 15782 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 15783 " EmitVertex();\n" 15784 " gs_fs_result = result;\n" 15785 " gl_Position = vec4(1, 1, 0, 1);\n" 15786 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 15787 " EmitVertex();\n" 15788 "}\n" 15789 "\n"; 15790 15791 static const GLchar* tess_ctrl_shader_template = 15792 "VERSION\n" 15793 "\n" 15794 "layout(vertices = 1) out;\n" 15795 "\n" 15796 "in vec4 vs_tcs_result[];\n" 15797 "out vec4 tcs_tes_result[];\n" 15798 "\n" 15799 "in VSOutputBlock {\n" 15800 " VARIABLE_DECLARATION;\n" 15801 "} input_block[];\n" 15802 "out TCSOutputBlock {\n" 15803 " VARIABLE_DECLARATION;\n" 15804 "} output_block[];\n" 15805 "\n" 15806 "struct Structure {\n" 15807 " vec4 member_a;\n" 15808 " TYPE_NAME member_b;\n" 15809 "};\n" 15810 "\n" 15811 "void main()\n" 15812 "{\n" 15813 " vec4 result = vec4(0, 1, 0, 1);\n" 15814 "\n" 15815 "VERIFICATION" 15816 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 15817 " {\n" 15818 " result = vec4(1, 0, 0, 1);\n" 15819 " }\n" 15820 "\n" 15821 " tcs_tes_result[gl_InvocationID] = result;\n" 15822 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 15823 "\n" 15824 " gl_TessLevelOuter[0] = 1.0;\n" 15825 " gl_TessLevelOuter[1] = 1.0;\n" 15826 " gl_TessLevelOuter[2] = 1.0;\n" 15827 " gl_TessLevelOuter[3] = 1.0;\n" 15828 " gl_TessLevelInner[0] = 1.0;\n" 15829 " gl_TessLevelInner[1] = 1.0;\n" 15830 "}\n" 15831 "\n"; 15832 15833 static const GLchar* tess_eval_shader_template = "VERSION\n" 15834 "\n" 15835 "layout(isolines, point_mode) in;\n" 15836 "\n" 15837 "in vec4 tcs_tes_result[];\n" 15838 "out vec4 tes_gs_result;\n" 15839 "\n" 15840 "in TCSOutputBlock {\n" 15841 " VARIABLE_DECLARATION;\n" 15842 "} input_block[];\n" 15843 "out TCSOutputBlock {\n" 15844 " VARIABLE_DECLARATION;\n" 15845 "} output_block;\n" 15846 "\n" 15847 "struct Structure {\n" 15848 " vec4 member_a;\n" 15849 " TYPE_NAME member_b;\n" 15850 "};\n" 15851 "\n" 15852 "void main()\n" 15853 "{\n" 15854 " vec4 result = vec4(0, 1, 0, 1);\n" 15855 "\n" 15856 "VERIFICATION" 15857 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 15858 " {\n" 15859 " result = vec4(1, 0, 0, 1);\n" 15860 " }\n" 15861 "\n" 15862 " tes_gs_result = result;\n" 15863 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 15864 "}\n" 15865 "\n"; 15866 15867 static const GLchar* vertex_shader_template = "VERSION\n" 15868 "\n" 15869 "out vec4 vs_tcs_result;\n" 15870 "\n" 15871 "in VARIABLE_DECLARATION;\n" 15872 "out VSOutputBlock {\n" 15873 " VARIABLE_DECLARATION;\n" 15874 "} output_block;\n" 15875 "\n" 15876 "struct Structure {\n" 15877 " vec4 member_a;\n" 15878 " TYPE_NAME member_b;\n" 15879 "};\n" 15880 "\n" 15881 "void main()\n" 15882 "{\n" 15883 " vec4 result = vec4(0, 1, 0, 1);\n" 15884 "\n" 15885 "VERIFICATION" 15886 "\n" 15887 " vs_tcs_result = result;\n" 15888 " OUTPUT_VARIABLE_NAME = INPUT_VARIABLE_NAME;\n" 15889 "}\n" 15890 "\n"; 15891 15892 const GLchar* array_index = ""; 15893 const testCase& test_case = m_test_cases[m_current_test_case_index]; 15894 const GLchar* shader_template = 0; 15895 const GLchar* input_block_name = "input_block"; 15896 const GLchar* output_block_name = "output_block"; 15897 15898 const std::string& base_type_name = Utils::getTypeName(test_case.m_type, 1 /* cols */, 1 /* rows */); 15899 const std::string& expected_value = getExpectedValue(in_stage); 15900 const std::string& initialization = getInitialization(); 15901 const std::string& type_name = Utils::getTypeName(test_case.m_type, test_case.m_n_cols, test_case.m_n_rows); 15902 15903 std::string input_decl; 15904 std::string input_ref; 15905 std::string output_decl; 15906 std::string output_ref; 15907 15908 Utils::qualifierSet in_qualifiers; 15909 Utils::qualifierSet out_qualifiers; 15910 15911 if ((Utils::UINT == test_case.m_type) || (Utils::INT == test_case.m_type)) 15912 { 15913 if (Utils::VERTEX_SHADER != in_stage) 15914 { 15915 in_qualifiers.push_back(Utils::QUAL_FLAT); 15916 } 15917 15918 out_qualifiers.push_back(Utils::QUAL_FLAT); 15919 } 15920 15921 switch (in_stage) 15922 { 15923 case Utils::COMPUTE_SHADER: 15924 shader_template = 0; 15925 break; 15926 case Utils::FRAGMENT_SHADER: 15927 shader_template = fragment_shader_template; 15928 break; 15929 case Utils::GEOMETRY_SHADER: 15930 shader_template = geometry_shader_template; 15931 break; 15932 case Utils::TESS_CTRL_SHADER: 15933 shader_template = tess_ctrl_shader_template; 15934 break; 15935 case Utils::TESS_EVAL_SHADER: 15936 shader_template = tess_eval_shader_template; 15937 break; 15938 case Utils::VERTEX_SHADER: 15939 shader_template = vertex_shader_template; 15940 break; 15941 default: 15942 TCU_FAIL("Invalid enum"); 15943 break; 15944 } 15945 15946 if (Utils::VERTEX_SHADER != in_stage) 15947 { 15948 Utils::prepareBlockVariableStrings(in_stage, Utils::INPUT, in_qualifiers, type_name.c_str(), "variable", 15949 input_block_name, input_decl, input_ref); 15950 } 15951 else 15952 { 15953 Utils::prepareVariableStrings(in_stage, Utils::INPUT, in_qualifiers, type_name.c_str(), "variable", input_decl, 15954 input_ref); 15955 } 15956 if (Utils::FRAGMENT_SHADER != in_stage) 15957 { 15958 Utils::prepareBlockVariableStrings(in_stage, Utils::OUTPUT, out_qualifiers, type_name.c_str(), "variable", 15959 output_block_name, output_decl, output_ref); 15960 } 15961 else 15962 { 15963 Utils::prepareVariableStrings(in_stage, Utils::OUTPUT, out_qualifiers, type_name.c_str(), "variable", 15964 output_decl, output_ref); 15965 } 15966 15967 if (1 != test_case.m_n_cols) 15968 { 15969 array_index = "[i]"; 15970 } 15971 15972 out_source.m_parts[0].m_code = shader_template; 15973 15974 size_t position = 0; 15975 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 15976 out_source.m_parts[0].m_code); 15977 15978 Utils::replaceToken("VARIABLE_DECLARATION", position, input_decl.c_str(), out_source.m_parts[0].m_code); 15979 15980 if (Utils::FRAGMENT_SHADER != in_stage) 15981 { 15982 Utils::replaceToken("VARIABLE_DECLARATION", position, output_decl.c_str(), out_source.m_parts[0].m_code); 15983 } 15984 15985 Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code); 15986 15987 size_t temp = position; 15988 15989 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 15990 15991 position = temp; 15992 15993 Utils::replaceToken("VARIABLE_TYPE", position, type_name.c_str(), out_source.m_parts[0].m_code); 15994 15995 Utils::replaceToken("INITIALIZATION", position, initialization.c_str(), out_source.m_parts[0].m_code); 15996 15997 Utils::replaceToken("INITIALIZATION", position, initialization.c_str(), out_source.m_parts[0].m_code); 15998 15999 Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code); 16000 16001 Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code); 16002 16003 Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code); 16004 16005 Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code); 16006 16007 Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code); 16008 16009 Utils::replaceToken("EXPECTED_VALUE", position, expected_value.c_str(), out_source.m_parts[0].m_code); 16010 16011 Utils::replaceAllTokens("INPUT_VARIABLE_NAME", input_ref.c_str(), out_source.m_parts[0].m_code); 16012 16013 Utils::replaceAllTokens("OUTPUT_VARIABLE_NAME", output_ref.c_str(), out_source.m_parts[0].m_code); 16014 16015 Utils::replaceAllTokens("ARRAY_INDEX", array_index, out_source.m_parts[0].m_code); 16016 } 16017 16018 /** Prepare source for compute shader stage 16019 * 16020 * @param out_source Prepared shader source instance 16021 **/ 16022 void LengthOfVectorAndMatrixTest::prepareComputeShaderSource(Utils::shaderSource& out_source) 16023 { 16024 static const GLchar* verification_snippet = 16025 " VARIABLE_TYPE variable = uni_variable;\n" 16026 " Structure structure = { { 0, 1, 0, 1 } , uni_variable };\n" 16027 "\n" 16028 " const uint variable_length = variable.length();\n" 16029 " const uint structure_member_b_length = structure.member_b.length();\n" 16030 "\n" 16031 " BASE_TYPE array_var[variable.length()];\n" 16032 " BASE_TYPE array_str[structure.member_b.length()];\n" 16033 "\n" 16034 " BASE_TYPE sum = 0;\n" 16035 "\n" 16036 " for (uint i = 0; i < variable_length; ++i)\n" 16037 " {\n" 16038 " array_var[i] = variableARRAY_INDEX.x;\n" 16039 " }\n" 16040 "\n" 16041 " for (uint i = 0; i < structure_member_b_length; ++i)\n" 16042 " {\n" 16043 " array_str[i] = structure.member_bARRAY_INDEX.y;\n" 16044 " }\n" 16045 "\n" 16046 " for (uint i = 0; i < array_var.length(); ++i)\n" 16047 " {\n" 16048 " sum += array_var[i];\n" 16049 " }\n" 16050 "\n" 16051 " for (uint i = 0; i < array_str.length(); ++i)\n" 16052 " {\n" 16053 " sum += array_str[i];\n" 16054 " }\n" 16055 "\n" 16056 " if (EXPECTED_VALUE != sum)\n" 16057 " {\n" 16058 " result = vec4(1, 0, 0, 1);\n" 16059 " }\n"; 16060 16061 static const GLchar* compute_shader_template = 16062 "VERSION\n" 16063 "\n" 16064 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 16065 "\n" 16066 "writeonly uniform image2D uni_image;\n" 16067 " uniform TYPE_NAME uni_variable;\n" 16068 "\n" 16069 "struct Structure {\n" 16070 " vec4 member_a;\n" 16071 " TYPE_NAME member_b;\n" 16072 "};\n" 16073 "\n" 16074 "void main()\n" 16075 "{\n" 16076 " vec4 result = vec4(0, 1, 0, 1);\n" 16077 "\n" 16078 "VERIFICATION" 16079 "\n" 16080 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 16081 "}\n" 16082 "\n"; 16083 16084 const testCase& test_case = m_test_cases[m_current_test_case_index]; 16085 const GLchar* array_index = ""; 16086 16087 const std::string& base_type_name = Utils::getTypeName(test_case.m_type, 1 /* cols */, 1 /* rows */); 16088 const std::string& expected_value = getExpectedValue(Utils::COMPUTE_SHADER); 16089 const std::string& type_name = Utils::getTypeName(test_case.m_type, test_case.m_n_cols, test_case.m_n_rows); 16090 16091 if (1 != test_case.m_n_cols) 16092 { 16093 array_index = "[i]"; 16094 } 16095 16096 out_source.m_parts[0].m_code = compute_shader_template; 16097 16098 size_t position = 0; 16099 Utils::replaceToken("VERSION", position, getVersionString(Utils::COMPUTE_SHADER, false), 16100 out_source.m_parts[0].m_code); 16101 16102 Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code); 16103 16104 Utils::replaceToken("TYPE_NAME", position, type_name.c_str(), out_source.m_parts[0].m_code); 16105 16106 size_t temp = position; 16107 16108 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 16109 16110 position = temp; 16111 16112 Utils::replaceToken("VARIABLE_TYPE", position, type_name.c_str(), out_source.m_parts[0].m_code); 16113 16114 Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code); 16115 16116 Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code); 16117 16118 Utils::replaceToken("BASE_TYPE", position, base_type_name.c_str(), out_source.m_parts[0].m_code); 16119 16120 Utils::replaceToken("ARRAY_INDEX", position, array_index, out_source.m_parts[0].m_code); 16121 16122 Utils::replaceToken("ARRAY_INDEX", position, array_index, out_source.m_parts[0].m_code); 16123 16124 Utils::replaceToken("EXPECTED_VALUE", position, expected_value.c_str(), out_source.m_parts[0].m_code); 16125 } 16126 16127 /** Constructor 16128 * 16129 * @param context Test context 16130 **/ 16131 LengthOfComputeResultTest::LengthOfComputeResultTest(deqp::Context& context) 16132 : GLSLTestBase(context, "length_of_compute_result", "Test verifies .length() for results of computation") 16133 { 16134 /* Nothing to be done here */ 16135 } 16136 16137 /** Prepare source for given shader stage 16138 * 16139 * @param in_stage Shader stage, compute shader will use 430 16140 * @param in_use_version_400 Select if 400 or 420 should be used 16141 * @param out_source Prepared shader source instance 16142 **/ 16143 void LengthOfComputeResultTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 16144 Utils::shaderSource& out_source) 16145 { 16146 static const GLchar* uniforms = "uniform mat2x4 goten;\n" 16147 "uniform uvec4 indices;\n" 16148 "uniform uvec4 expected_lengths;\n" 16149 "uniform mat4x3 gohan;\n" 16150 "uniform vec3 vegeta;\n" 16151 "uniform vec3 trunks;\n" 16152 "uniform uint variable;\n" 16153 "uniform float expected_sum;\n"; 16154 16155 static const GLchar* verification_snippet = 16156 " uint lengths[4];\n" 16157 " float x[(gohan * goten).length()];\n" 16158 " float y[(gohan * goten)[variable - 1].length()];\n" 16159 "\n" 16160 " lengths[indices.x] = gohan[variable].length();\n" 16161 " lengths[indices.y] = (gohan * goten).length();\n" 16162 " lengths[indices.z] = (gohan * goten)[variable].length();\n" 16163 " lengths[indices.w] = (vegeta * trunks).length();\n" 16164 "\n" 16165 " float dot_result = dot(vegeta, trunks);\n" 16166 " mat2x3 mul_result = gohan * goten;\n" 16167 "\n" 16168 "#ifdef TESS_CTRL\n" 16169 " const uint position_length = gl_out[gl_InvocationID].gl_Position.length();\n" 16170 "#endif\n" 16171 "#ifndef COMPUTE\n" 16172 "#ifndef FRAGMENT\n" 16173 "#ifndef TESS_CTRL\n" 16174 " const uint position_length = gl_Position.length();\n" 16175 "#endif /*TESS_CTRL */\n" 16176 "#endif /* FRAGMENT */\n" 16177 "#endif /* COMPUTE */\n" 16178 "#ifdef FRAGMENT\n" 16179 " const uint point_coord_length = gl_PointCoord.length();\n" 16180 " const uint sample_position_length = gl_SamplePosition.length();\n" 16181 "#endif /* FRAGMENT */\n" 16182 " const uint outer_length = outerProduct(vegeta, trunks).length();\n" 16183 "\n" 16184 " for (uint i = 0; i < x.length(); ++i)\n" 16185 " {\n" 16186 " x[i] = mul_result[i].x;\n" 16187 " }\n" 16188 "\n" 16189 " for (uint i = 0; i < y.length(); ++i)\n" 16190 " {\n" 16191 " y[i] = mul_result[0][i];\n" 16192 " }\n" 16193 "\n" 16194 " if ( (expected_lengths.x != lengths[0]) ||\n" 16195 " (expected_lengths.y != lengths[1]) ||\n" 16196 " (expected_lengths.z != lengths[2]) ||\n" 16197 " (expected_lengths.w != lengths[3]) ||\n" 16198 "#ifndef COMPUTE\n" 16199 "#ifndef FRAGMENT\n" 16200 " (4 /* vec4 */ != position_length) ||\n" 16201 "#endif /* FRAGMENT */\n" 16202 "#endif /* COMPUTE */\n" 16203 "#ifdef FRAGMENT\n" 16204 " (2 /* vec2 */ != point_coord_length) ||\n" 16205 " (2 /* vec2 */ != sample_position_length) ||\n" 16206 "#endif /* FRAGMENT */\n" 16207 " (0.5 != dot_result) ||\n" 16208 " (3 /* mat3 */ != outer_length) ||\n" 16209 " (expected_sum != x[variable] + y[variable]) )\n" 16210 " {\n" 16211 " result = vec4(1, 0, 0, 1);\n" 16212 " }\n"; 16213 16214 static const GLchar* compute_shader_template = 16215 "VERSION\n" 16216 "\n" 16217 "#define COMPUTE\n" 16218 "\n" 16219 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 16220 "\n" 16221 "writeonly uniform image2D uni_image;\n" 16222 "\n" 16223 "UNIFORMS" 16224 "\n" 16225 "void main()\n" 16226 "{\n" 16227 " vec4 result = vec4(0, 1, 0, 1);\n" 16228 "\n" 16229 "VERIFICATION" 16230 "\n" 16231 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 16232 "}\n" 16233 "\n"; 16234 16235 static const GLchar* fragment_shader_template = "VERSION\n" 16236 "\n" 16237 "#define FRAGMENT\n" 16238 "\n" 16239 "in vec4 gs_fs_result;\n" 16240 "out vec4 fs_out_result;\n" 16241 "\n" 16242 "UNIFORMS" 16243 "\n" 16244 "void main()\n" 16245 "{\n" 16246 " vec4 result = vec4(0, 1, 0, 1);\n" 16247 "\n" 16248 "VERIFICATION" 16249 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 16250 " {\n" 16251 " result = vec4(1, 0, 0, 1);\n" 16252 " }\n" 16253 "\n" 16254 " fs_out_result = result;\n" 16255 "}\n" 16256 "\n"; 16257 16258 static const GLchar* geometry_shader_template = "VERSION\n" 16259 "\n" 16260 "layout(points) in;\n" 16261 "layout(triangle_strip, max_vertices = 4) out;\n" 16262 "\n" 16263 "in vec4 tes_gs_result[];\n" 16264 "out vec4 gs_fs_result;\n" 16265 "\n" 16266 "UNIFORMS" 16267 "\n" 16268 "void main()\n" 16269 "{\n" 16270 " vec4 result = vec4(0, 1, 0, 1);\n" 16271 "\n" 16272 "VERIFICATION" 16273 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 16274 " {\n" 16275 " result = vec4(1, 0, 0, 1);\n" 16276 " }\n" 16277 "\n" 16278 " gs_fs_result = result;\n" 16279 " gl_Position = vec4(-1, -1, 0, 1);\n" 16280 " EmitVertex();\n" 16281 " gs_fs_result = result;\n" 16282 " gl_Position = vec4(-1, 1, 0, 1);\n" 16283 " EmitVertex();\n" 16284 " gs_fs_result = result;\n" 16285 " gl_Position = vec4(1, -1, 0, 1);\n" 16286 " EmitVertex();\n" 16287 " gs_fs_result = result;\n" 16288 " gl_Position = vec4(1, 1, 0, 1);\n" 16289 " EmitVertex();\n" 16290 "}\n" 16291 "\n"; 16292 16293 static const GLchar* tess_ctrl_shader_template = 16294 "VERSION\n" 16295 "#define TESS_CTRL\n" 16296 "\n" 16297 "layout(vertices = 1) out;\n" 16298 "\n" 16299 "in vec4 vs_tcs_result[];\n" 16300 "out vec4 tcs_tes_result[];\n" 16301 "\n" 16302 "UNIFORMS" 16303 "\n" 16304 "void main()\n" 16305 "{\n" 16306 " vec4 result = vec4(0, 1, 0, 1);\n" 16307 "\n" 16308 "VERIFICATION" 16309 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 16310 " {\n" 16311 " result = vec4(1, 0, 0, 1);\n" 16312 " }\n" 16313 "\n" 16314 " tcs_tes_result[gl_InvocationID] = result;\n" 16315 "\n" 16316 " gl_TessLevelOuter[0] = 1.0;\n" 16317 " gl_TessLevelOuter[1] = 1.0;\n" 16318 " gl_TessLevelOuter[2] = 1.0;\n" 16319 " gl_TessLevelOuter[3] = 1.0;\n" 16320 " gl_TessLevelInner[0] = 1.0;\n" 16321 " gl_TessLevelInner[1] = 1.0;\n" 16322 "}\n" 16323 "\n"; 16324 16325 static const GLchar* tess_eval_shader_template = "VERSION\n" 16326 "\n" 16327 "layout(isolines, point_mode) in;\n" 16328 "\n" 16329 "in vec4 tcs_tes_result[];\n" 16330 "out vec4 tes_gs_result;\n" 16331 "\n" 16332 "UNIFORMS" 16333 "\n" 16334 "void main()\n" 16335 "{\n" 16336 " vec4 result = vec4(0, 1, 0, 1);\n" 16337 "\n" 16338 "VERIFICATION" 16339 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 16340 " {\n" 16341 " result = vec4(1, 0, 0, 1);\n" 16342 " }\n" 16343 "\n" 16344 " tes_gs_result = result;\n" 16345 "}\n" 16346 "\n"; 16347 16348 static const GLchar* vertex_shader_template = "VERSION\n" 16349 "\n" 16350 "out vec4 vs_tcs_result;\n" 16351 "\n" 16352 "UNIFORMS" 16353 "\n" 16354 "void main()\n" 16355 "{\n" 16356 " vec4 result = vec4(0, 1, 0, 1);\n" 16357 "\n" 16358 "VERIFICATION" 16359 "\n" 16360 " vs_tcs_result = result;\n" 16361 "}\n" 16362 "\n"; 16363 16364 const GLchar* shader_template = 0; 16365 16366 switch (in_stage) 16367 { 16368 case Utils::COMPUTE_SHADER: 16369 shader_template = compute_shader_template; 16370 break; 16371 case Utils::FRAGMENT_SHADER: 16372 shader_template = fragment_shader_template; 16373 break; 16374 case Utils::GEOMETRY_SHADER: 16375 shader_template = geometry_shader_template; 16376 break; 16377 case Utils::TESS_CTRL_SHADER: 16378 shader_template = tess_ctrl_shader_template; 16379 break; 16380 case Utils::TESS_EVAL_SHADER: 16381 shader_template = tess_eval_shader_template; 16382 break; 16383 case Utils::VERTEX_SHADER: 16384 shader_template = vertex_shader_template; 16385 break; 16386 default: 16387 TCU_FAIL("Invalid enum"); 16388 break; 16389 } 16390 16391 out_source.m_parts[0].m_code = shader_template; 16392 16393 size_t position = 0; 16394 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 16395 out_source.m_parts[0].m_code); 16396 16397 Utils::replaceToken("UNIFORMS", position, uniforms, out_source.m_parts[0].m_code); 16398 16399 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 16400 } 16401 16402 /** Overwritte of prepareUniforms method 16403 * 16404 * @param program Current program 16405 **/ 16406 void LengthOfComputeResultTest::prepareUniforms(Utils::program& program) 16407 { 16408 static const GLfloat gohan_data[12] = { 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 16409 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f }; 16410 16411 static const GLfloat goten_data[8] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; 16412 16413 static const GLfloat vegeta_data[3] = { 0.5f, 0.5f, 0.0f }; 16414 16415 static const GLfloat trunks_data[3] = { 0.5f, 0.5f, 0.0f }; 16416 16417 static const GLuint indices_data[4] = { 2, 1, 0, 3 }; 16418 16419 static const GLuint variable_data[1] = { 1 }; 16420 16421 static const GLuint expected_lengths_data[4] = { 3, 2, 3, 3 }; 16422 16423 static const GLfloat expected_sum_data[1] = { 1.0f }; 16424 16425 program.uniform("gohan", Utils::FLOAT, 4 /* n_cols */, 3 /* n_rows */, gohan_data); 16426 program.uniform("goten", Utils::FLOAT, 2 /* n_cols */, 4 /* n_rows */, goten_data); 16427 program.uniform("vegeta", Utils::FLOAT, 1 /* n_cols */, 3 /* n_rows */, vegeta_data); 16428 program.uniform("trunks", Utils::FLOAT, 1 /* n_cols */, 3 /* n_rows */, trunks_data); 16429 program.uniform("indices", Utils::UINT, 1 /* n_cols */, 4 /* n_rows */, indices_data); 16430 program.uniform("variable", Utils::UINT, 1 /* n_cols */, 1 /* n_rows */, variable_data); 16431 program.uniform("expected_lengths", Utils::UINT, 1 /* n_cols */, 4 /* n_rows */, expected_lengths_data); 16432 program.uniform("expected_sum", Utils::FLOAT, 1 /* n_cols */, 1 /* n_rows */, expected_sum_data); 16433 } 16434 16435 /** Constructor 16436 * 16437 * @param context Test context 16438 **/ 16439 ScalarSwizzlersTest::ScalarSwizzlersTest(deqp::Context& context) 16440 : GLSLTestBase(context, "scalar_swizzlers", "Verifies that swizzlers can be used on scalars") 16441 { 16442 /* Nothing to be done here */ 16443 } 16444 16445 /** Prepare source for given shader stage 16446 * 16447 * @param in_stage Shader stage, compute shader will use 430 16448 * @param in_use_version_400 Select if 400 or 420 should be used 16449 * @param out_source Prepared shader source instance 16450 **/ 16451 void ScalarSwizzlersTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 16452 Utils::shaderSource& out_source) 16453 { 16454 static const GLchar* uniforms = "uniform float variable;\n" 16455 "uniform vec3 expected_values;\n"; 16456 16457 static const GLchar* literal = "#define LITERAL 0.375\n"; 16458 16459 static const GLchar* structure = "struct Structure {\n" 16460 " vec2 m_xx;\n" 16461 " vec3 m_xxx;\n" 16462 " vec4 m_xxxx;\n" 16463 " vec2 m_nested_xx;\n" 16464 " vec3 m_nested_xxx;\n" 16465 " vec4 m_nested_xxxx;\n" 16466 "};\n"; 16467 16468 static const GLchar* function = "bool check_values(in Structure structure, in float value)\n" 16469 "{\n" 16470 " const vec2 xx = vec2(value, value);\n" 16471 " const vec3 xxx = vec3(value, value, value);\n" 16472 " const vec4 xxxx = vec4(value, value, value, value);\n" 16473 "\n" 16474 " bool result = true;\n" 16475 "\n" 16476 " if ((xx != structure.m_xx) ||\n" 16477 " (xxx != structure.m_xxx) ||\n" 16478 " (xxxx != structure.m_xxxx) ||\n" 16479 " (xx != structure.m_nested_xx) ||\n" 16480 " (xxx != structure.m_nested_xxx) ||\n" 16481 " (xxxx != structure.m_nested_xxxx) )\n" 16482 " {\n" 16483 " result = false;\n" 16484 " }\n" 16485 "\n" 16486 " return result;\n" 16487 "}\n"; 16488 16489 static const GLchar* verification_snippet = 16490 " Structure literal_result;\n" 16491 " Structure constant_result;\n" 16492 " Structure variable_result;\n" 16493 "\n" 16494 " literal_result.m_xx = LITERAL.xx ;\n" 16495 " literal_result.m_xxx = LITERAL.xxx ;\n" 16496 " literal_result.m_xxxx = LITERAL.xxxx;\n" 16497 " literal_result.m_nested_xx = LITERAL.x.rr.sss.rr ;\n" 16498 " literal_result.m_nested_xxx = LITERAL.s.xx.rrr.xxx ;\n" 16499 " literal_result.m_nested_xxxx = LITERAL.r.ss.xxx.ssss;\n" 16500 "\n" 16501 " const float constant = 0.125;\n" 16502 "\n" 16503 " constant_result.m_xx = constant.xx ;\n" 16504 " constant_result.m_xxx = constant.xxx ;\n" 16505 " constant_result.m_xxxx = constant.xxxx;\n" 16506 " constant_result.m_nested_xx = constant.x.rr.sss.rr ;\n" 16507 " constant_result.m_nested_xxx = constant.s.xx.rrr.xxx ;\n" 16508 " constant_result.m_nested_xxxx = constant.r.ss.xxx.ssss;\n" 16509 "\n" 16510 " variable_result.m_xx = variable.xx ;\n" 16511 " variable_result.m_xxx = variable.xxx ;\n" 16512 " variable_result.m_xxxx = variable.xxxx;\n" 16513 " variable_result.m_nested_xx = variable.x.rr.sss.rr ;\n" 16514 " variable_result.m_nested_xxx = variable.s.xx.rrr.xxx ;\n" 16515 " variable_result.m_nested_xxxx = variable.r.ss.xxx.ssss;\n" 16516 "\n" 16517 " if ((false == check_values(literal_result, expected_values.x)) ||\n" 16518 " (false == check_values(constant_result, expected_values.y)) ||\n" 16519 " (false == check_values(variable_result, expected_values.z)) )\n" 16520 " {\n" 16521 " result = vec4(1, 0, 0, 1);\n" 16522 " }\n"; 16523 16524 static const GLchar* compute_shader_template = 16525 "VERSION\n" 16526 "\n" 16527 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 16528 "\n" 16529 "writeonly uniform image2D uni_image;\n" 16530 "\n" 16531 "STRUCTURE" 16532 "\n" 16533 "UNIFORMS" 16534 "\n" 16535 "FUNCTION" 16536 "\n" 16537 "LITERAL" 16538 "\n" 16539 "void main()\n" 16540 "{\n" 16541 " vec4 result = vec4(0, 1, 0, 1);\n" 16542 "\n" 16543 "VERIFICATION" 16544 "\n" 16545 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 16546 "}\n" 16547 "\n"; 16548 16549 static const GLchar* fragment_shader_template = "VERSION\n" 16550 "\n" 16551 "#define FRAGMENT\n" 16552 "\n" 16553 "in vec4 gs_fs_result;\n" 16554 "out vec4 fs_out_result;\n" 16555 "\n" 16556 "STRUCTURE" 16557 "\n" 16558 "UNIFORMS" 16559 "\n" 16560 "FUNCTION" 16561 "\n" 16562 "LITERAL" 16563 "\n" 16564 "void main()\n" 16565 "{\n" 16566 " vec4 result = vec4(0, 1, 0, 1);\n" 16567 "\n" 16568 "VERIFICATION" 16569 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 16570 " {\n" 16571 " result = vec4(1, 0, 0, 1);\n" 16572 " }\n" 16573 "\n" 16574 " fs_out_result = result;\n" 16575 "}\n" 16576 "\n"; 16577 16578 static const GLchar* geometry_shader_template = "VERSION\n" 16579 "\n" 16580 "layout(points) in;\n" 16581 "layout(triangle_strip, max_vertices = 4) out;\n" 16582 "\n" 16583 "in vec4 tes_gs_result[];\n" 16584 "out vec4 gs_fs_result;\n" 16585 "\n" 16586 "STRUCTURE" 16587 "\n" 16588 "UNIFORMS" 16589 "\n" 16590 "FUNCTION" 16591 "\n" 16592 "LITERAL" 16593 "\n" 16594 "void main()\n" 16595 "{\n" 16596 " vec4 result = vec4(0, 1, 0, 1);\n" 16597 "\n" 16598 "VERIFICATION" 16599 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 16600 " {\n" 16601 " result = vec4(1, 0, 0, 1);\n" 16602 " }\n" 16603 "\n" 16604 " gs_fs_result = result;\n" 16605 " gl_Position = vec4(-1, -1, 0, 1);\n" 16606 " EmitVertex();\n" 16607 " gs_fs_result = result;\n" 16608 " gl_Position = vec4(-1, 1, 0, 1);\n" 16609 " EmitVertex();\n" 16610 " gs_fs_result = result;\n" 16611 " gl_Position = vec4(1, -1, 0, 1);\n" 16612 " EmitVertex();\n" 16613 " gs_fs_result = result;\n" 16614 " gl_Position = vec4(1, 1, 0, 1);\n" 16615 " EmitVertex();\n" 16616 "}\n" 16617 "\n"; 16618 16619 static const GLchar* tess_ctrl_shader_template = 16620 "VERSION\n" 16621 "\n" 16622 "layout(vertices = 1) out;\n" 16623 "\n" 16624 "in vec4 vs_tcs_result[];\n" 16625 "out vec4 tcs_tes_result[];\n" 16626 "\n" 16627 "STRUCTURE" 16628 "\n" 16629 "UNIFORMS" 16630 "\n" 16631 "FUNCTION" 16632 "\n" 16633 "LITERAL" 16634 "\n" 16635 "void main()\n" 16636 "{\n" 16637 " vec4 result = vec4(0, 1, 0, 1);\n" 16638 "\n" 16639 "VERIFICATION" 16640 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 16641 " {\n" 16642 " result = vec4(1, 0, 0, 1);\n" 16643 " }\n" 16644 "\n" 16645 " tcs_tes_result[gl_InvocationID] = result;\n" 16646 "\n" 16647 " gl_TessLevelOuter[0] = 1.0;\n" 16648 " gl_TessLevelOuter[1] = 1.0;\n" 16649 " gl_TessLevelOuter[2] = 1.0;\n" 16650 " gl_TessLevelOuter[3] = 1.0;\n" 16651 " gl_TessLevelInner[0] = 1.0;\n" 16652 " gl_TessLevelInner[1] = 1.0;\n" 16653 "}\n" 16654 "\n"; 16655 16656 static const GLchar* tess_eval_shader_template = "VERSION\n" 16657 "\n" 16658 "layout(isolines, point_mode) in;\n" 16659 "\n" 16660 "in vec4 tcs_tes_result[];\n" 16661 "out vec4 tes_gs_result;\n" 16662 "\n" 16663 "STRUCTURE" 16664 "\n" 16665 "UNIFORMS" 16666 "\n" 16667 "FUNCTION" 16668 "\n" 16669 "LITERAL" 16670 "\n" 16671 "void main()\n" 16672 "{\n" 16673 " vec4 result = vec4(0, 1, 0, 1);\n" 16674 "\n" 16675 "VERIFICATION" 16676 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 16677 " {\n" 16678 " result = vec4(1, 0, 0, 1);\n" 16679 " }\n" 16680 "\n" 16681 " tes_gs_result = result;\n" 16682 "}\n" 16683 "\n"; 16684 16685 static const GLchar* vertex_shader_template = "VERSION\n" 16686 "\n" 16687 "out vec4 vs_tcs_result;\n" 16688 "\n" 16689 "STRUCTURE" 16690 "\n" 16691 "UNIFORMS" 16692 "\n" 16693 "FUNCTION" 16694 "\n" 16695 "LITERAL" 16696 "\n" 16697 "void main()\n" 16698 "{\n" 16699 " vec4 result = vec4(0, 1, 0, 1);\n" 16700 "\n" 16701 "VERIFICATION" 16702 "\n" 16703 " vs_tcs_result = result;\n" 16704 "}\n" 16705 "\n"; 16706 16707 const GLchar* shader_template = 0; 16708 16709 switch (in_stage) 16710 { 16711 case Utils::COMPUTE_SHADER: 16712 shader_template = compute_shader_template; 16713 break; 16714 case Utils::FRAGMENT_SHADER: 16715 shader_template = fragment_shader_template; 16716 break; 16717 case Utils::GEOMETRY_SHADER: 16718 shader_template = geometry_shader_template; 16719 break; 16720 case Utils::TESS_CTRL_SHADER: 16721 shader_template = tess_ctrl_shader_template; 16722 break; 16723 case Utils::TESS_EVAL_SHADER: 16724 shader_template = tess_eval_shader_template; 16725 break; 16726 case Utils::VERTEX_SHADER: 16727 shader_template = vertex_shader_template; 16728 break; 16729 default: 16730 TCU_FAIL("Invalid enum"); 16731 break; 16732 } 16733 16734 out_source.m_parts[0].m_code = shader_template; 16735 16736 size_t position = 0; 16737 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 16738 out_source.m_parts[0].m_code); 16739 16740 Utils::replaceToken("STRUCTURE", position, structure, out_source.m_parts[0].m_code); 16741 16742 Utils::replaceToken("UNIFORMS", position, uniforms, out_source.m_parts[0].m_code); 16743 16744 Utils::replaceToken("FUNCTION", position, function, out_source.m_parts[0].m_code); 16745 16746 Utils::replaceToken("LITERAL", position, literal, out_source.m_parts[0].m_code); 16747 16748 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 16749 } 16750 16751 /** Overwritte of prepareUniforms method 16752 * 16753 * @param program Current program 16754 **/ 16755 void ScalarSwizzlersTest::prepareUniforms(Utils::program& program) 16756 { 16757 static const GLfloat variable_data[4] = { 0.75f }; 16758 static const GLfloat expected_values_data[3] = { 0.375f, 0.125f, 0.75f }; 16759 16760 program.uniform("variable", Utils::FLOAT, 1 /* n_cols */, 1 /* n_rows */, variable_data); 16761 program.uniform("expected_values", Utils::FLOAT, 1 /* n_cols */, 3 /* n_rows */, expected_values_data); 16762 } 16763 16764 /** Constructor 16765 * 16766 * @param context Test context 16767 **/ 16768 ScalarSwizzlersInvalidTest::ScalarSwizzlersInvalidTest(deqp::Context& context) 16769 : NegativeTestBase(context, "scalar_swizzlers_invalid", 16770 "Verifies if invalid use of swizzlers on scalars is reported as error") 16771 { 16772 /* Nothing to be done here */ 16773 } 16774 16775 /** Set up next test case 16776 * 16777 * @param test_case_index Index of next test case 16778 * 16779 * @return false if there is no more test cases, true otherwise 16780 **/ 16781 bool ScalarSwizzlersInvalidTest::prepareNextTestCase(glw::GLuint test_case_index) 16782 { 16783 switch (test_case_index) 16784 { 16785 case (glw::GLuint)-1: 16786 case INVALID_Y: 16787 case INVALID_B: 16788 case INVALID_Q: 16789 case INVALID_XY: 16790 case INVALID_XRS: 16791 case WRONG: 16792 case MISSING_PARENTHESIS: 16793 m_case = (TESTED_CASES)test_case_index; 16794 break; 16795 default: 16796 return false; 16797 } 16798 16799 return true; 16800 } 16801 16802 /** Prepare source for given shader stage 16803 * 16804 * @param in_stage Shader stage, compute shader will use 430 16805 * @param in_use_version_400 Select if 400 or 420 should be used 16806 * @param out_source Prepared shader source instance 16807 **/ 16808 void ScalarSwizzlersInvalidTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 16809 Utils::shaderSource& out_source) 16810 { 16811 static const GLchar* uniforms = "uniform float variable;\n"; 16812 16813 static const GLchar* verification_invalid_y = "\n" 16814 " if (0.125 != variable.y) )\n" 16815 " {\n" 16816 " result = vec4(1, 0, 0, 1);\n" 16817 " }\n"; 16818 16819 static const GLchar* verification_invalid_b = "\n" 16820 " if (0.125 != variable.b) )\n" 16821 " {\n" 16822 " result = vec4(1, 0, 0, 1);\n" 16823 " }\n"; 16824 16825 static const GLchar* verification_invalid_q = "\n" 16826 " if (0.125 != variable.q) )\n" 16827 " {\n" 16828 " result = vec4(1, 0, 0, 1);\n" 16829 " }\n"; 16830 16831 static const GLchar* verification_invalid_xy = "\n" 16832 " if (vec2(0.125, 0.25) != variable.xy) )\n" 16833 " {\n" 16834 " result = vec4(1, 0, 0, 1);\n" 16835 " }\n"; 16836 16837 static const GLchar* verification_invalid_xrs = "\n" 16838 " if (vec3(0.125, 0.125, 0.25) != variable.xrs) )\n" 16839 " {\n" 16840 " result = vec4(1, 0, 0, 1);\n" 16841 " }\n"; 16842 16843 static const GLchar* verification_wrong_u = "\n" 16844 " if (0.125 != variable.u) )\n" 16845 " {\n" 16846 " result = vec4(1, 0, 0, 1);\n" 16847 " }\n"; 16848 16849 static const GLchar* verification_missing_parenthesis = "\n" 16850 " if (variable != 1.x) )\n" 16851 " {\n" 16852 " result = vec4(1, 0, 0, 1);\n" 16853 " }\n"; 16854 16855 static const GLchar* compute_shader_template = 16856 "VERSION\n" 16857 "\n" 16858 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 16859 "\n" 16860 "writeonly uniform image2D uni_image;\n" 16861 "\n" 16862 "UNIFORMS" 16863 "\n" 16864 "void main()\n" 16865 "{\n" 16866 " vec4 result = vec4(0, 1, 0, 1);\n" 16867 "\n" 16868 "VERIFICATION" 16869 "\n" 16870 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 16871 "}\n" 16872 "\n"; 16873 16874 static const GLchar* fragment_shader_template = "VERSION\n" 16875 "\n" 16876 "#define FRAGMENT\n" 16877 "\n" 16878 "in vec4 gs_fs_result;\n" 16879 "out vec4 fs_out_result;\n" 16880 "\n" 16881 "UNIFORMS" 16882 "\n" 16883 "void main()\n" 16884 "{\n" 16885 " vec4 result = vec4(0, 1, 0, 1);\n" 16886 "\n" 16887 "VERIFICATION" 16888 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 16889 " {\n" 16890 " result = vec4(1, 0, 0, 1);\n" 16891 " }\n" 16892 "\n" 16893 " fs_out_result = result;\n" 16894 "}\n" 16895 "\n"; 16896 16897 static const GLchar* geometry_shader_template = "VERSION\n" 16898 "\n" 16899 "layout(points) in;\n" 16900 "layout(triangle_strip, max_vertices = 4) out;\n" 16901 "\n" 16902 "in vec4 tes_gs_result[];\n" 16903 "out vec4 gs_fs_result;\n" 16904 "\n" 16905 "UNIFORMS" 16906 "\n" 16907 "void main()\n" 16908 "{\n" 16909 " vec4 result = vec4(0, 1, 0, 1);\n" 16910 "\n" 16911 "VERIFICATION" 16912 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 16913 " {\n" 16914 " result = vec4(1, 0, 0, 1);\n" 16915 " }\n" 16916 "\n" 16917 " gs_fs_result = result;\n" 16918 " gl_Position = vec4(-1, -1, 0, 1);\n" 16919 " EmitVertex();\n" 16920 " gs_fs_result = result;\n" 16921 " gl_Position = vec4(-1, 1, 0, 1);\n" 16922 " EmitVertex();\n" 16923 " gs_fs_result = result;\n" 16924 " gl_Position = vec4(1, -1, 0, 1);\n" 16925 " EmitVertex();\n" 16926 " gs_fs_result = result;\n" 16927 " gl_Position = vec4(1, 1, 0, 1);\n" 16928 " EmitVertex();\n" 16929 "}\n" 16930 "\n"; 16931 16932 static const GLchar* tess_ctrl_shader_template = 16933 "VERSION\n" 16934 "\n" 16935 "layout(vertices = 1) out;\n" 16936 "\n" 16937 "in vec4 vs_tcs_result[];\n" 16938 "out vec4 tcs_tes_result[];\n" 16939 "\n" 16940 "UNIFORMS" 16941 "\n" 16942 "void main()\n" 16943 "{\n" 16944 " vec4 result = vec4(0, 1, 0, 1);\n" 16945 "\n" 16946 "VERIFICATION" 16947 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 16948 " {\n" 16949 " result = vec4(1, 0, 0, 1);\n" 16950 " }\n" 16951 "\n" 16952 " tcs_tes_result[gl_InvocationID] = result;\n" 16953 "\n" 16954 " gl_TessLevelOuter[0] = 1.0;\n" 16955 " gl_TessLevelOuter[1] = 1.0;\n" 16956 " gl_TessLevelOuter[2] = 1.0;\n" 16957 " gl_TessLevelOuter[3] = 1.0;\n" 16958 " gl_TessLevelInner[0] = 1.0;\n" 16959 " gl_TessLevelInner[1] = 1.0;\n" 16960 "}\n" 16961 "\n"; 16962 16963 static const GLchar* tess_eval_shader_template = "VERSION\n" 16964 "\n" 16965 "layout(isolines, point_mode) in;\n" 16966 "\n" 16967 "in vec4 tcs_tes_result[];\n" 16968 "out vec4 tes_gs_result;\n" 16969 "\n" 16970 "UNIFORMS" 16971 "\n" 16972 "void main()\n" 16973 "{\n" 16974 " vec4 result = vec4(0, 1, 0, 1);\n" 16975 "\n" 16976 "VERIFICATION" 16977 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 16978 " {\n" 16979 " result = vec4(1, 0, 0, 1);\n" 16980 " }\n" 16981 "\n" 16982 " tes_gs_result = result;\n" 16983 "}\n" 16984 "\n"; 16985 16986 static const GLchar* vertex_shader_template = "VERSION\n" 16987 "\n" 16988 "out vec4 vs_tcs_result;\n" 16989 "\n" 16990 "UNIFORMS" 16991 "\n" 16992 "void main()\n" 16993 "{\n" 16994 " vec4 result = vec4(0, 1, 0, 1);\n" 16995 "\n" 16996 "VERIFICATION" 16997 "\n" 16998 " vs_tcs_result = result;\n" 16999 "}\n" 17000 "\n"; 17001 17002 const GLchar* shader_template = 0; 17003 const GLchar* verification_snippet = 0; 17004 17005 switch (in_stage) 17006 { 17007 case Utils::COMPUTE_SHADER: 17008 shader_template = compute_shader_template; 17009 break; 17010 case Utils::FRAGMENT_SHADER: 17011 shader_template = fragment_shader_template; 17012 break; 17013 case Utils::GEOMETRY_SHADER: 17014 shader_template = geometry_shader_template; 17015 break; 17016 case Utils::TESS_CTRL_SHADER: 17017 shader_template = tess_ctrl_shader_template; 17018 break; 17019 case Utils::TESS_EVAL_SHADER: 17020 shader_template = tess_eval_shader_template; 17021 break; 17022 case Utils::VERTEX_SHADER: 17023 shader_template = vertex_shader_template; 17024 break; 17025 default: 17026 TCU_FAIL("Invalid enum"); 17027 break; 17028 } 17029 17030 switch (m_case) 17031 { 17032 case INVALID_Y: 17033 verification_snippet = verification_invalid_y; 17034 break; 17035 case INVALID_B: 17036 verification_snippet = verification_invalid_b; 17037 break; 17038 case INVALID_Q: 17039 verification_snippet = verification_invalid_q; 17040 break; 17041 case INVALID_XY: 17042 verification_snippet = verification_invalid_xy; 17043 break; 17044 case INVALID_XRS: 17045 verification_snippet = verification_invalid_xrs; 17046 break; 17047 case WRONG: 17048 verification_snippet = verification_wrong_u; 17049 break; 17050 case MISSING_PARENTHESIS: 17051 verification_snippet = verification_missing_parenthesis; 17052 break; 17053 default: 17054 TCU_FAIL("Invalid enum"); 17055 break; 17056 }; 17057 17058 out_source.m_parts[0].m_code = shader_template; 17059 17060 size_t position = 0; 17061 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 17062 out_source.m_parts[0].m_code); 17063 17064 Utils::replaceToken("UNIFORMS", position, uniforms, out_source.m_parts[0].m_code); 17065 17066 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 17067 } 17068 17069 /* Constants used by BuiltInValuesTest */ 17070 const GLint BuiltInValuesTest::m_min_program_texel_offset_limit = -8; 17071 const GLint BuiltInValuesTest::m_max_program_texel_offset_limit = 7; 17072 17073 /** Constructor 17074 * 17075 * @param context Test context 17076 **/ 17077 BuiltInValuesTest::BuiltInValuesTest(deqp::Context& context) 17078 : GLSLTestBase(context, "built_in_values", "Test verifies values of gl_Min/Max_ProgramTexelOffset") 17079 { 17080 /* Nothing to be done here */ 17081 } 17082 17083 /** Prepare source for given shader stage 17084 * 17085 * @param in_stage Shader stage, compute shader will use 430 17086 * @param in_use_version_400 Select if 400 or 420 should be used 17087 * @param out_source Prepared shader source instance 17088 **/ 17089 void BuiltInValuesTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 17090 Utils::shaderSource& out_source) 17091 { 17092 static const GLchar* verification_snippet = " if ((expected_values.x != gl_MinProgramTexelOffset) ||\n" 17093 " (expected_values.y != gl_MaxProgramTexelOffset) )\n" 17094 " {\n" 17095 " result = vec4(1, 0, 0, 1);\n" 17096 " }\n"; 17097 17098 static const GLchar* compute_shader_template = 17099 "VERSION\n" 17100 "\n" 17101 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 17102 "\n" 17103 "writeonly uniform image2D uni_image;\n" 17104 " uniform ivec2 expected_values;\n" 17105 "\n" 17106 "void main()\n" 17107 "{\n" 17108 " vec4 result = vec4(0, 1, 0, 1);\n" 17109 "\n" 17110 "VERIFICATION" 17111 "\n" 17112 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 17113 "}\n" 17114 "\n"; 17115 17116 static const GLchar* fragment_shader_template = "VERSION\n" 17117 "\n" 17118 "in vec4 gs_fs_result;\n" 17119 "out vec4 fs_out_result;\n" 17120 "\n" 17121 "uniform ivec2 expected_values;\n" 17122 "\n" 17123 "void main()\n" 17124 "{\n" 17125 " vec4 result = vec4(0, 1, 0, 1);\n" 17126 "\n" 17127 "VERIFICATION" 17128 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 17129 " {\n" 17130 " result = vec4(1, 0, 0, 1);\n" 17131 " }\n" 17132 "\n" 17133 " fs_out_result = result;\n" 17134 "}\n" 17135 "\n"; 17136 17137 static const GLchar* geometry_shader_template = "VERSION\n" 17138 "\n" 17139 "layout(points) in;\n" 17140 "layout(triangle_strip, max_vertices = 4) out;\n" 17141 "\n" 17142 "in vec4 tes_gs_result[];\n" 17143 "out vec4 gs_fs_result;\n" 17144 "\n" 17145 "uniform ivec2 expected_values;\n" 17146 "\n" 17147 "void main()\n" 17148 "{\n" 17149 " vec4 result = vec4(0, 1, 0, 1);\n" 17150 "\n" 17151 "VERIFICATION" 17152 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 17153 " {\n" 17154 " result = vec4(1, 0, 0, 1);\n" 17155 " }\n" 17156 "\n" 17157 " gs_fs_result = result;\n" 17158 " gl_Position = vec4(-1, -1, 0, 1);\n" 17159 " EmitVertex();\n" 17160 " gs_fs_result = result;\n" 17161 " gl_Position = vec4(-1, 1, 0, 1);\n" 17162 " EmitVertex();\n" 17163 " gs_fs_result = result;\n" 17164 " gl_Position = vec4(1, -1, 0, 1);\n" 17165 " EmitVertex();\n" 17166 " gs_fs_result = result;\n" 17167 " gl_Position = vec4(1, 1, 0, 1);\n" 17168 " EmitVertex();\n" 17169 "}\n" 17170 "\n"; 17171 17172 static const GLchar* tess_ctrl_shader_template = 17173 "VERSION\n" 17174 "\n" 17175 "layout(vertices = 1) out;\n" 17176 "\n" 17177 "in vec4 vs_tcs_result[];\n" 17178 "out vec4 tcs_tes_result[];\n" 17179 "\n" 17180 "uniform ivec2 expected_values;\n" 17181 "\n" 17182 "void main()\n" 17183 "{\n" 17184 " vec4 result = vec4(0, 1, 0, 1);\n" 17185 "\n" 17186 "VERIFICATION" 17187 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 17188 " {\n" 17189 " result = vec4(1, 0, 0, 1);\n" 17190 " }\n" 17191 "\n" 17192 " tcs_tes_result[gl_InvocationID] = result;\n" 17193 "\n" 17194 " gl_TessLevelOuter[0] = 1.0;\n" 17195 " gl_TessLevelOuter[1] = 1.0;\n" 17196 " gl_TessLevelOuter[2] = 1.0;\n" 17197 " gl_TessLevelOuter[3] = 1.0;\n" 17198 " gl_TessLevelInner[0] = 1.0;\n" 17199 " gl_TessLevelInner[1] = 1.0;\n" 17200 "}\n" 17201 "\n"; 17202 17203 static const GLchar* tess_eval_shader_template = "VERSION\n" 17204 "\n" 17205 "layout(isolines, point_mode) in;\n" 17206 "\n" 17207 "in vec4 tcs_tes_result[];\n" 17208 "out vec4 tes_gs_result;\n" 17209 "\n" 17210 "uniform ivec2 expected_values;\n" 17211 "\n" 17212 "void main()\n" 17213 "{\n" 17214 " vec4 result = vec4(0, 1, 0, 1);\n" 17215 "\n" 17216 "VERIFICATION" 17217 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 17218 " {\n" 17219 " result = vec4(1, 0, 0, 1);\n" 17220 " }\n" 17221 "\n" 17222 " tes_gs_result = result;\n" 17223 "}\n" 17224 "\n"; 17225 17226 static const GLchar* vertex_shader_template = "VERSION\n" 17227 "\n" 17228 "out vec4 vs_tcs_result;\n" 17229 "\n" 17230 "uniform ivec2 expected_values;\n" 17231 "\n" 17232 "void main()\n" 17233 "{\n" 17234 " vec4 result = vec4(0, 1, 0, 1);\n" 17235 "\n" 17236 "VERIFICATION" 17237 "\n" 17238 " vs_tcs_result = result;\n" 17239 "}\n" 17240 "\n"; 17241 17242 const GLchar* shader_template = 0; 17243 17244 switch (in_stage) 17245 { 17246 case Utils::COMPUTE_SHADER: 17247 shader_template = compute_shader_template; 17248 break; 17249 case Utils::FRAGMENT_SHADER: 17250 shader_template = fragment_shader_template; 17251 break; 17252 case Utils::GEOMETRY_SHADER: 17253 shader_template = geometry_shader_template; 17254 break; 17255 case Utils::TESS_CTRL_SHADER: 17256 shader_template = tess_ctrl_shader_template; 17257 break; 17258 case Utils::TESS_EVAL_SHADER: 17259 shader_template = tess_eval_shader_template; 17260 break; 17261 case Utils::VERTEX_SHADER: 17262 shader_template = vertex_shader_template; 17263 break; 17264 default: 17265 TCU_FAIL("Invalid enum"); 17266 break; 17267 } 17268 17269 out_source.m_parts[0].m_code = shader_template; 17270 17271 size_t position = 0; 17272 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 17273 out_source.m_parts[0].m_code); 17274 17275 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 17276 } 17277 17278 /** Overwritte of prepareUniforms method 17279 * 17280 * @param program Current program 17281 **/ 17282 void BuiltInValuesTest::prepareUniforms(Utils::program& program) 17283 { 17284 const GLint expected_values_data[2] = { m_min_program_texel_offset, m_max_program_texel_offset }; 17285 17286 program.uniform("expected_values", Utils::INT, 1 /* n_cols */, 2 /* n_rows */, expected_values_data); 17287 } 17288 17289 /** Prepare test cases 17290 * 17291 * @return true 17292 **/ 17293 bool BuiltInValuesTest::testInit() 17294 { 17295 const Functions& gl = m_context.getRenderContext().getFunctions(); 17296 17297 gl.getIntegerv(GL_MIN_PROGRAM_TEXEL_OFFSET, &m_min_program_texel_offset); 17298 GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv"); 17299 17300 gl.getIntegerv(GL_MAX_PROGRAM_TEXEL_OFFSET, &m_max_program_texel_offset); 17301 GLU_EXPECT_NO_ERROR(gl.getError(), "GetIntegerv"); 17302 17303 if ((m_min_program_texel_offset_limit > m_min_program_texel_offset) || 17304 (m_max_program_texel_offset_limit > m_max_program_texel_offset)) 17305 { 17306 m_context.getTestContext().getLog() 17307 << tcu::TestLog::Message << "Invalid GL_PROGRAM_TEXEL_OFFSET values." 17308 << " Min: " << m_min_program_texel_offset << " expected at top: " << m_min_program_texel_offset_limit 17309 << " Max: " << m_min_program_texel_offset << " expected at least: " << m_max_program_texel_offset_limit 17310 << tcu::TestLog::EndMessage; 17311 17312 return false; 17313 } 17314 17315 return true; 17316 } 17317 17318 /** Constructor 17319 * 17320 * @param context Test context 17321 **/ 17322 BuiltInAssignmentTest::BuiltInAssignmentTest(deqp::Context& context) 17323 : NegativeTestBase(context, "built_in_assignment", 17324 "Test verifies that built in gl_Min/MaxProgramTexelOffset cannot be assigned") 17325 { 17326 /* Nothing to be done here */ 17327 } 17328 17329 /** Set up next test case 17330 * 17331 * @param test_case_index Index of next test case 17332 * 17333 * @return false if there is no more test cases, true otherwise 17334 **/ 17335 bool BuiltInAssignmentTest::prepareNextTestCase(glw::GLuint test_case_index) 17336 { 17337 const GLchar* description = 0; 17338 17339 switch (test_case_index) 17340 { 17341 case (glw::GLuint)-1: 17342 case 0: 17343 description = "Testing gl_MinProgramTexelOffset"; 17344 break; 17345 case 1: 17346 description = "Testing gl_MaxProgramTexelOffset"; 17347 break; 17348 default: 17349 return false; 17350 } 17351 17352 m_case = test_case_index; 17353 17354 m_context.getTestContext().getLog() << tcu::TestLog::Message << description << tcu::TestLog::EndMessage; 17355 17356 return true; 17357 } 17358 17359 /** Prepare source for given shader stage 17360 * 17361 * @param in_stage Shader stage, compute shader will use 430 17362 * @param in_use_version_400 Select if 400 or 420 should be used 17363 * @param out_source Prepared shader source instance 17364 **/ 17365 void BuiltInAssignmentTest::prepareShaderSource(Utils::SHADER_STAGES in_stage, bool in_use_version_400, 17366 Utils::shaderSource& out_source) 17367 { 17368 static const GLchar* min_verification_snippet = " gl_MinProgramTexelOffset += gl_MaxProgramTexelOffset\n" 17369 "\n" 17370 " if (expected_value != gl_MinProgramTexelOffset)\n" 17371 " {\n" 17372 " result = vec4(1, 0, 0, 1);\n" 17373 " }\n"; 17374 17375 static const GLchar* max_verification_snippet = " gl_MaxProgramTexelOffset += gl_MinProgramTexelOffset\n" 17376 "\n" 17377 " if (expected_value != gl_MaxProgramTexelOffset)\n" 17378 " {\n" 17379 " result = vec4(1, 0, 0, 1);\n" 17380 " }\n"; 17381 17382 static const GLchar* compute_shader_template = 17383 "VERSION\n" 17384 "\n" 17385 "layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n" 17386 "\n" 17387 "writeonly uniform image2D uni_image;\n" 17388 " uniform ivec2 expected_values;\n" 17389 "\n" 17390 "void main()\n" 17391 "{\n" 17392 " vec4 result = vec4(0, 1, 0, 1);\n" 17393 "\n" 17394 "VERIFICATION" 17395 "\n" 17396 " imageStore(uni_image, ivec2(gl_GlobalInvocationID.xy), result);\n" 17397 "}\n" 17398 "\n"; 17399 17400 static const GLchar* fragment_shader_template = "VERSION\n" 17401 "\n" 17402 "in vec4 gs_fs_result;\n" 17403 "out vec4 fs_out_result;\n" 17404 "\n" 17405 "uniform ivec2 expected_values;\n" 17406 "\n" 17407 "void main()\n" 17408 "{\n" 17409 " vec4 result = vec4(0, 1, 0, 1);\n" 17410 "\n" 17411 "VERIFICATION" 17412 " else if (vec4(0, 1, 0, 1) != gs_fs_result)\n" 17413 " {\n" 17414 " result = vec4(1, 0, 0, 1);\n" 17415 " }\n" 17416 "\n" 17417 " fs_out_result = result;\n" 17418 "}\n" 17419 "\n"; 17420 17421 static const GLchar* geometry_shader_template = "VERSION\n" 17422 "\n" 17423 "layout(points) in;\n" 17424 "layout(triangle_strip, max_vertices = 4) out;\n" 17425 "\n" 17426 "in vec4 tes_gs_result[];\n" 17427 "out vec4 gs_fs_result;\n" 17428 "\n" 17429 "uniform ivec2 expected_values;\n" 17430 "\n" 17431 "void main()\n" 17432 "{\n" 17433 " vec4 result = vec4(0, 1, 0, 1);\n" 17434 "\n" 17435 "VERIFICATION" 17436 " else if (vec4(0, 1, 0, 1) != tes_gs_result[0])\n" 17437 " {\n" 17438 " result = vec4(1, 0, 0, 1);\n" 17439 " }\n" 17440 "\n" 17441 " gs_fs_result = result;\n" 17442 " gl_Position = vec4(-1, -1, 0, 1);\n" 17443 " EmitVertex();\n" 17444 " gs_fs_result = result;\n" 17445 " gl_Position = vec4(-1, 1, 0, 1);\n" 17446 " EmitVertex();\n" 17447 " gs_fs_result = result;\n" 17448 " gl_Position = vec4(1, -1, 0, 1);\n" 17449 " EmitVertex();\n" 17450 " gs_fs_result = result;\n" 17451 " gl_Position = vec4(1, 1, 0, 1);\n" 17452 " EmitVertex();\n" 17453 "}\n" 17454 "\n"; 17455 17456 static const GLchar* tess_ctrl_shader_template = 17457 "VERSION\n" 17458 "\n" 17459 "layout(vertices = 1) out;\n" 17460 "\n" 17461 "in vec4 vs_tcs_result[];\n" 17462 "out vec4 tcs_tes_result[];\n" 17463 "\n" 17464 "uniform ivec2 expected_values;\n" 17465 "\n" 17466 "void main()\n" 17467 "{\n" 17468 " vec4 result = vec4(0, 1, 0, 1);\n" 17469 "\n" 17470 "VERIFICATION" 17471 " else if (vec4(0, 1, 0, 1) != vs_tcs_result[gl_InvocationID])\n" 17472 " {\n" 17473 " result = vec4(1, 0, 0, 1);\n" 17474 " }\n" 17475 "\n" 17476 " tcs_tes_result[gl_InvocationID] = result;\n" 17477 "\n" 17478 " gl_TessLevelOuter[0] = 1.0;\n" 17479 " gl_TessLevelOuter[1] = 1.0;\n" 17480 " gl_TessLevelOuter[2] = 1.0;\n" 17481 " gl_TessLevelOuter[3] = 1.0;\n" 17482 " gl_TessLevelInner[0] = 1.0;\n" 17483 " gl_TessLevelInner[1] = 1.0;\n" 17484 "}\n" 17485 "\n"; 17486 17487 static const GLchar* tess_eval_shader_template = "VERSION\n" 17488 "\n" 17489 "layout(isolines, point_mode) in;\n" 17490 "\n" 17491 "in vec4 tcs_tes_result[];\n" 17492 "out vec4 tes_gs_result;\n" 17493 "\n" 17494 "uniform ivec2 expected_values;\n" 17495 "\n" 17496 "void main()\n" 17497 "{\n" 17498 " vec4 result = vec4(0, 1, 0, 1);\n" 17499 "\n" 17500 "VERIFICATION" 17501 " else if (vec4(0, 1, 0, 1) != tcs_tes_result[0])\n" 17502 " {\n" 17503 " result = vec4(1, 0, 0, 1);\n" 17504 " }\n" 17505 "\n" 17506 " tes_gs_result = result;\n" 17507 "}\n" 17508 "\n"; 17509 17510 static const GLchar* vertex_shader_template = "VERSION\n" 17511 "\n" 17512 "out vec4 vs_tcs_result;\n" 17513 "\n" 17514 "uniform ivec2 expected_values;\n" 17515 "\n" 17516 "void main()\n" 17517 "{\n" 17518 " vec4 result = vec4(0, 1, 0, 1);\n" 17519 "\n" 17520 "VERIFICATION" 17521 "\n" 17522 " vs_tcs_result = result;\n" 17523 "}\n" 17524 "\n"; 17525 17526 const GLchar* shader_template = 0; 17527 const GLchar* verification_snippet = 0; 17528 17529 switch (in_stage) 17530 { 17531 case Utils::COMPUTE_SHADER: 17532 shader_template = compute_shader_template; 17533 break; 17534 case Utils::FRAGMENT_SHADER: 17535 shader_template = fragment_shader_template; 17536 break; 17537 case Utils::GEOMETRY_SHADER: 17538 shader_template = geometry_shader_template; 17539 break; 17540 case Utils::TESS_CTRL_SHADER: 17541 shader_template = tess_ctrl_shader_template; 17542 break; 17543 case Utils::TESS_EVAL_SHADER: 17544 shader_template = tess_eval_shader_template; 17545 break; 17546 case Utils::VERTEX_SHADER: 17547 shader_template = vertex_shader_template; 17548 break; 17549 default: 17550 TCU_FAIL("Invalid enum"); 17551 break; 17552 } 17553 17554 switch (m_case) 17555 { 17556 case (glw::GLuint)-1: 17557 case 0: 17558 verification_snippet = min_verification_snippet; 17559 break; 17560 case 1: 17561 verification_snippet = max_verification_snippet; 17562 break; 17563 } 17564 17565 out_source.m_parts[0].m_code = shader_template; 17566 17567 size_t position = 0; 17568 Utils::replaceToken("VERSION", position, getVersionString(in_stage, in_use_version_400), 17569 out_source.m_parts[0].m_code); 17570 17571 Utils::replaceToken("VERIFICATION", position, verification_snippet, out_source.m_parts[0].m_code); 17572 } 17573 17574 /** Constructor. 17575 * 17576 * @param context CTS context. 17577 **/ 17578 Utils::buffer::buffer(deqp::Context& context) : m_id(0), m_context(context), m_target(0) 17579 { 17580 } 17581 17582 /** Destructor 17583 * 17584 **/ 17585 Utils::buffer::~buffer() 17586 { 17587 release(); 17588 } 17589 17590 /** Execute BindBuffer 17591 * 17592 **/ 17593 void Utils::buffer::bind() const 17594 { 17595 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17596 17597 gl.bindBuffer(m_target, m_id); 17598 GLU_EXPECT_NO_ERROR(gl.getError(), "BindBuffer"); 17599 } 17600 17601 /** Execute BindBufferRange 17602 * 17603 * @param index <index> parameter 17604 * @param offset <offset> parameter 17605 * @param size <size> parameter 17606 **/ 17607 void Utils::buffer::bindRange(glw::GLuint index, glw::GLintptr offset, glw::GLsizeiptr size) 17608 { 17609 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17610 17611 gl.bindBufferRange(m_target, index, m_id, offset, size); 17612 GLU_EXPECT_NO_ERROR(gl.getError(), "BindBufferRange"); 17613 } 17614 17615 /** Execute GenBuffer 17616 * 17617 * @param target Target that will be used by this buffer 17618 **/ 17619 void Utils::buffer::generate(glw::GLenum target) 17620 { 17621 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17622 17623 m_target = target; 17624 17625 gl.genBuffers(1, &m_id); 17626 GLU_EXPECT_NO_ERROR(gl.getError(), "GenBuffers"); 17627 } 17628 17629 /** Maps buffer content 17630 * 17631 * @param access Access rights for mapped region 17632 * 17633 * @return Mapped memory 17634 **/ 17635 void* Utils::buffer::map(GLenum access) const 17636 { 17637 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17638 17639 gl.bindBuffer(m_target, m_id); 17640 GLU_EXPECT_NO_ERROR(gl.getError(), "bindBuffer"); 17641 17642 void* result = gl.mapBuffer(m_target, access); 17643 GLU_EXPECT_NO_ERROR(gl.getError(), "MapBuffer"); 17644 17645 return result; 17646 } 17647 17648 /** Unmaps buffer 17649 * 17650 **/ 17651 void Utils::buffer::unmap() const 17652 { 17653 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17654 17655 gl.bindBuffer(m_target, m_id); 17656 GLU_EXPECT_NO_ERROR(gl.getError(), "bindBuffer"); 17657 17658 gl.unmapBuffer(m_target); 17659 GLU_EXPECT_NO_ERROR(gl.getError(), "UnmapBuffer"); 17660 } 17661 17662 /** Execute BufferData 17663 * 17664 * @param size <size> parameter 17665 * @param data <data> parameter 17666 * @param usage <usage> parameter 17667 **/ 17668 void Utils::buffer::update(glw::GLsizeiptr size, glw::GLvoid* data, glw::GLenum usage) 17669 { 17670 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17671 17672 gl.bindBuffer(m_target, m_id); 17673 GLU_EXPECT_NO_ERROR(gl.getError(), "bindBuffer"); 17674 17675 gl.bufferData(m_target, size, data, usage); 17676 GLU_EXPECT_NO_ERROR(gl.getError(), "bufferData"); 17677 } 17678 17679 /** Release buffer 17680 * 17681 **/ 17682 void Utils::buffer::release() 17683 { 17684 if (0 != m_id) 17685 { 17686 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17687 17688 gl.deleteBuffers(1, &m_id); 17689 m_id = 0; 17690 } 17691 } 17692 17693 /** Constructor 17694 * 17695 * @param context CTS context 17696 **/ 17697 Utils::framebuffer::framebuffer(deqp::Context& context) : m_id(0), m_context(context) 17698 { 17699 /* Nothing to be done here */ 17700 } 17701 17702 /** Destructor 17703 * 17704 **/ 17705 Utils::framebuffer::~framebuffer() 17706 { 17707 if (0 != m_id) 17708 { 17709 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17710 17711 gl.deleteFramebuffers(1, &m_id); 17712 m_id = 0; 17713 } 17714 } 17715 17716 /** Attach texture to specified attachment 17717 * 17718 * @param attachment Attachment 17719 * @param texture_id Texture id 17720 * @param width Texture width 17721 * @param height Texture height 17722 **/ 17723 void Utils::framebuffer::attachTexture(glw::GLenum attachment, glw::GLuint texture_id, glw::GLuint width, 17724 glw::GLuint height) 17725 { 17726 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17727 17728 bind(); 17729 17730 gl.bindTexture(GL_TEXTURE_2D, texture_id); 17731 GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 17732 17733 gl.framebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, GL_TEXTURE_2D, texture_id, 0 /* level */); 17734 GLU_EXPECT_NO_ERROR(gl.getError(), "FramebufferTexture2D"); 17735 17736 gl.viewport(0 /* x */, 0 /* y */, width, height); 17737 GLU_EXPECT_NO_ERROR(gl.getError(), "Viewport"); 17738 } 17739 17740 /** Binds framebuffer to DRAW_FRAMEBUFFER 17741 * 17742 **/ 17743 void Utils::framebuffer::bind() 17744 { 17745 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17746 17747 gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_id); 17748 GLU_EXPECT_NO_ERROR(gl.getError(), "BindFramebuffer"); 17749 } 17750 17751 /** Clear framebuffer 17752 * 17753 * @param mask <mask> parameter of glClear. Decides which shall be cleared 17754 **/ 17755 void Utils::framebuffer::clear(glw::GLenum mask) 17756 { 17757 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17758 17759 gl.clear(mask); 17760 GLU_EXPECT_NO_ERROR(gl.getError(), "Clear"); 17761 } 17762 17763 /** Specifies clear color 17764 * 17765 * @param red Red channel 17766 * @param green Green channel 17767 * @param blue Blue channel 17768 * @param alpha Alpha channel 17769 **/ 17770 void Utils::framebuffer::clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) 17771 { 17772 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17773 17774 gl.clearColor(red, green, blue, alpha); 17775 GLU_EXPECT_NO_ERROR(gl.getError(), "ClearColor"); 17776 } 17777 17778 /** Generate framebuffer 17779 * 17780 **/ 17781 void Utils::framebuffer::generate() 17782 { 17783 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17784 17785 gl.genFramebuffers(1, &m_id); 17786 GLU_EXPECT_NO_ERROR(gl.getError(), "GenFramebuffers"); 17787 } 17788 17789 Utils::shaderSource::shaderSource() 17790 { 17791 } 17792 17793 Utils::shaderSource::shaderSource(const shaderSource& source) : m_parts(source.m_parts) 17794 { 17795 } 17796 17797 Utils::shaderSource::shaderSource(const glw::GLchar* source_code) 17798 { 17799 if (0 != source_code) 17800 { 17801 m_parts.resize(1); 17802 17803 m_parts[0].m_code = source_code; 17804 } 17805 } 17806 17807 Utils::shaderCompilationException::shaderCompilationException(const shaderSource& source, const glw::GLchar* message) 17808 : m_shader_source(source), m_error_message(message) 17809 { 17810 /* Nothing to be done */ 17811 } 17812 17813 const char* Utils::shaderCompilationException::what() const throw() 17814 { 17815 return "Shader compilation failed"; 17816 } 17817 17818 Utils::programLinkageException::programLinkageException(const glw::GLchar* message) : m_error_message(message) 17819 { 17820 /* Nothing to be done */ 17821 } 17822 17823 const char* Utils::programLinkageException::what() const throw() 17824 { 17825 return "Program linking failed"; 17826 } 17827 17828 const glw::GLenum Utils::program::ARB_COMPUTE_SHADER = 0x91B9; 17829 17830 /** Constructor. 17831 * 17832 * @param context CTS context. 17833 **/ 17834 Utils::program::program(deqp::Context& context) 17835 : m_compute_shader_id(0) 17836 , m_fragment_shader_id(0) 17837 , m_geometry_shader_id(0) 17838 , m_program_object_id(0) 17839 , m_tesselation_control_shader_id(0) 17840 , m_tesselation_evaluation_shader_id(0) 17841 , m_vertex_shader_id(0) 17842 , m_context(context) 17843 { 17844 /* Nothing to be done here */ 17845 } 17846 17847 /** Destructor 17848 * 17849 **/ 17850 Utils::program::~program() 17851 { 17852 remove(); 17853 } 17854 17855 /** Build program 17856 * 17857 * @param compute_shader_code Compute shader source code 17858 * @param fragment_shader_code Fragment shader source code 17859 * @param geometry_shader_code Geometry shader source code 17860 * @param tesselation_control_shader_code Tesselation control shader source code 17861 * @param tesselation_evaluation_shader_code Tesselation evaluation shader source code 17862 * @param vertex_shader_code Vertex shader source code 17863 * @param varying_names Array of strings containing names of varyings to be captured with transfrom feedback 17864 * @param n_varying_names Number of varyings to be captured with transfrom feedback 17865 * @param is_separable Selects if monolithis or separable program should be built. Defaults to false 17866 **/ 17867 void Utils::program::build(const glw::GLchar* compute_shader_code, const glw::GLchar* fragment_shader_code, 17868 const glw::GLchar* geometry_shader_code, const glw::GLchar* tesselation_control_shader_code, 17869 const glw::GLchar* tesselation_evaluation_shader_code, const glw::GLchar* vertex_shader_code, 17870 const glw::GLchar* const* varying_names, glw::GLuint n_varying_names, bool is_separable) 17871 { 17872 const shaderSource compute_shader(compute_shader_code); 17873 const shaderSource fragment_shader(fragment_shader_code); 17874 const shaderSource geometry_shader(geometry_shader_code); 17875 const shaderSource tesselation_control_shader(tesselation_control_shader_code); 17876 const shaderSource tesselation_evaluation_shader(tesselation_evaluation_shader_code); 17877 const shaderSource vertex_shader(vertex_shader_code); 17878 17879 build(compute_shader, fragment_shader, geometry_shader, tesselation_control_shader, tesselation_evaluation_shader, 17880 vertex_shader, varying_names, n_varying_names, is_separable); 17881 } 17882 17883 /** Build program 17884 * 17885 * @param compute_shader_code Compute shader source code 17886 * @param fragment_shader_code Fragment shader source code 17887 * @param geometry_shader_code Geometry shader source code 17888 * @param tesselation_control_shader_code Tesselation control shader source code 17889 * @param tesselation_evaluation_shader_code Tesselation evaluation shader source code 17890 * @param vertex_shader_code Vertex shader source code 17891 * @param varying_names Array of strings containing names of varyings to be captured with transfrom feedback 17892 * @param n_varying_names Number of varyings to be captured with transfrom feedback 17893 * @param is_separable Selects if monolithis or separable program should be built. Defaults to false 17894 **/ 17895 void Utils::program::build(const shaderSource& compute_shader, const shaderSource& fragment_shader, 17896 const shaderSource& geometry_shader, const shaderSource& tesselation_control_shader, 17897 const shaderSource& tesselation_evaluation_shader, const shaderSource& vertex_shader, 17898 const glw::GLchar* const* varying_names, glw::GLuint n_varying_names, bool is_separable) 17899 { 17900 /* GL entry points */ 17901 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17902 17903 /* Create shader objects and compile */ 17904 if (false == compute_shader.m_parts.empty()) 17905 { 17906 m_compute_shader_id = gl.createShader(ARB_COMPUTE_SHADER); 17907 GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader"); 17908 17909 compile(m_compute_shader_id, compute_shader); 17910 } 17911 17912 if (false == fragment_shader.m_parts.empty()) 17913 { 17914 m_fragment_shader_id = gl.createShader(GL_FRAGMENT_SHADER); 17915 GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader"); 17916 17917 compile(m_fragment_shader_id, fragment_shader); 17918 } 17919 17920 if (false == geometry_shader.m_parts.empty()) 17921 { 17922 m_geometry_shader_id = gl.createShader(GL_GEOMETRY_SHADER); 17923 GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader"); 17924 17925 compile(m_geometry_shader_id, geometry_shader); 17926 } 17927 17928 if (false == tesselation_control_shader.m_parts.empty()) 17929 { 17930 m_tesselation_control_shader_id = gl.createShader(GL_TESS_CONTROL_SHADER); 17931 GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader"); 17932 17933 compile(m_tesselation_control_shader_id, tesselation_control_shader); 17934 } 17935 17936 if (false == tesselation_evaluation_shader.m_parts.empty()) 17937 { 17938 m_tesselation_evaluation_shader_id = gl.createShader(GL_TESS_EVALUATION_SHADER); 17939 GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader"); 17940 17941 compile(m_tesselation_evaluation_shader_id, tesselation_evaluation_shader); 17942 } 17943 17944 if (false == vertex_shader.m_parts.empty()) 17945 { 17946 m_vertex_shader_id = gl.createShader(GL_VERTEX_SHADER); 17947 GLU_EXPECT_NO_ERROR(gl.getError(), "CreateShader"); 17948 17949 compile(m_vertex_shader_id, vertex_shader); 17950 } 17951 17952 /* Create program object */ 17953 m_program_object_id = gl.createProgram(); 17954 GLU_EXPECT_NO_ERROR(gl.getError(), "CreateProgram"); 17955 17956 /* Set up captyured varyings' names */ 17957 if (0 != n_varying_names) 17958 { 17959 gl.transformFeedbackVaryings(m_program_object_id, n_varying_names, varying_names, GL_INTERLEAVED_ATTRIBS); 17960 GLU_EXPECT_NO_ERROR(gl.getError(), "TransformFeedbackVaryings"); 17961 } 17962 17963 /* Set separable parameter */ 17964 if (true == is_separable) 17965 { 17966 gl.programParameteri(m_program_object_id, GL_PROGRAM_SEPARABLE, GL_TRUE); 17967 GLU_EXPECT_NO_ERROR(gl.getError(), "ProgramParameteri"); 17968 } 17969 17970 /* Link program */ 17971 link(); 17972 } 17973 17974 void Utils::program::compile(glw::GLuint shader_id, const Utils::shaderSource& source) const 17975 { 17976 /* GL entry points */ 17977 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 17978 17979 /* Compilation status */ 17980 glw::GLint status = GL_FALSE; 17981 17982 /* Source parts and lengths vectors */ 17983 std::vector<const GLchar*> parts; 17984 std::vector<GLint> lengths_vector; 17985 GLint* lengths = 0; 17986 17987 /* Prepare storage */ 17988 parts.resize(source.m_parts.size()); 17989 17990 /* Prepare arrays */ 17991 for (GLuint i = 0; i < source.m_parts.size(); ++i) 17992 { 17993 parts[i] = source.m_parts[i].m_code.c_str(); 17994 } 17995 17996 if (true == source.m_use_lengths) 17997 { 17998 lengths_vector.resize(source.m_parts.size()); 17999 18000 for (GLuint i = 0; i < source.m_parts.size(); ++i) 18001 { 18002 lengths_vector[i] = source.m_parts[i].m_length; 18003 } 18004 18005 lengths = &lengths_vector[0]; 18006 } 18007 18008 /* Set source code */ 18009 gl.shaderSource(shader_id, static_cast<GLsizei>(source.m_parts.size()), &parts[0], lengths); 18010 GLU_EXPECT_NO_ERROR(gl.getError(), "ShaderSource"); 18011 18012 /* Compile */ 18013 gl.compileShader(shader_id); 18014 GLU_EXPECT_NO_ERROR(gl.getError(), "CompileShader"); 18015 18016 /* Get compilation status */ 18017 gl.getShaderiv(shader_id, GL_COMPILE_STATUS, &status); 18018 GLU_EXPECT_NO_ERROR(gl.getError(), "GetShaderiv"); 18019 18020 /* Log compilation error */ 18021 if (GL_TRUE != status) 18022 { 18023 glw::GLint length = 0; 18024 std::vector<glw::GLchar> message; 18025 18026 /* Error log length */ 18027 gl.getShaderiv(shader_id, GL_INFO_LOG_LENGTH, &length); 18028 GLU_EXPECT_NO_ERROR(gl.getError(), "GetShaderiv"); 18029 18030 /* Prepare storage */ 18031 message.resize(length); 18032 18033 /* Get error log */ 18034 gl.getShaderInfoLog(shader_id, length, 0, &message[0]); 18035 GLU_EXPECT_NO_ERROR(gl.getError(), "GetShaderInfoLog"); 18036 18037 throw shaderCompilationException(source, &message[0]); 18038 } 18039 } 18040 18041 /** Create program from provided binary 18042 * 18043 * @param binary Buffer with binary form of program 18044 * @param binary_format Format of <binary> data 18045 **/ 18046 void Utils::program::createFromBinary(const std::vector<GLubyte>& binary, GLenum binary_format) 18047 { 18048 /* GL entry points */ 18049 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18050 18051 /* Create program object */ 18052 m_program_object_id = gl.createProgram(); 18053 GLU_EXPECT_NO_ERROR(gl.getError(), "CreateProgram"); 18054 18055 gl.programBinary(m_program_object_id, binary_format, &binary[0], static_cast<GLsizei>(binary.size())); 18056 GLU_EXPECT_NO_ERROR(gl.getError(), "ProgramBinary"); 18057 } 18058 18059 glw::GLint Utils::program::getAttribLocation(const glw::GLchar* name) const 18060 { 18061 /* GL entry points */ 18062 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18063 18064 GLint location = gl.getAttribLocation(m_program_object_id, name); 18065 GLU_EXPECT_NO_ERROR(gl.getError(), "GetAttribLocation"); 18066 18067 return location; 18068 } 18069 18070 /** Get binary form of program 18071 * 18072 * @param binary Buffer for binary data 18073 * @param binary_format Format of binary data 18074 **/ 18075 void Utils::program::getBinary(std::vector<GLubyte>& binary, GLenum& binary_format) const 18076 { 18077 /* GL entry points */ 18078 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18079 18080 /* Get binary size */ 18081 GLint length = 0; 18082 gl.getProgramiv(m_program_object_id, GL_PROGRAM_BINARY_LENGTH, &length); 18083 GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramiv"); 18084 18085 /* Allocate storage */ 18086 binary.resize(length); 18087 18088 /* Get binary */ 18089 gl.getProgramBinary(m_program_object_id, static_cast<GLsizei>(binary.size()), &length, &binary_format, &binary[0]); 18090 GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramBinary"); 18091 } 18092 18093 /** Get subroutine index 18094 * 18095 * @param subroutine_name Subroutine name 18096 * 18097 * @return Index of subroutine 18098 **/ 18099 GLuint Utils::program::getSubroutineIndex(const glw::GLchar* subroutine_name, glw::GLenum shader_stage) const 18100 { 18101 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18102 GLuint index = -1; 18103 18104 index = gl.getSubroutineIndex(m_program_object_id, shader_stage, subroutine_name); 18105 GLU_EXPECT_NO_ERROR(gl.getError(), "GetSubroutineIndex"); 18106 18107 if (GL_INVALID_INDEX == index) 18108 { 18109 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Subroutine: " << subroutine_name 18110 << " is not available" << tcu::TestLog::EndMessage; 18111 18112 TCU_FAIL("Subroutine is not available"); 18113 } 18114 18115 return index; 18116 } 18117 18118 /** Get subroutine uniform location 18119 * 18120 * @param uniform_name Subroutine uniform name 18121 * 18122 * @return Location of subroutine uniform 18123 **/ 18124 GLint Utils::program::getSubroutineUniformLocation(const glw::GLchar* uniform_name, glw::GLenum shader_stage) const 18125 { 18126 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18127 GLint location = -1; 18128 18129 location = gl.getSubroutineUniformLocation(m_program_object_id, shader_stage, uniform_name); 18130 GLU_EXPECT_NO_ERROR(gl.getError(), "GetSubroutineUniformLocation"); 18131 18132 if (-1 == location) 18133 { 18134 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Subroutine uniform: " << uniform_name 18135 << " is not available" << tcu::TestLog::EndMessage; 18136 18137 TCU_FAIL("Subroutine uniform is not available"); 18138 } 18139 18140 return location; 18141 } 18142 18143 /** Get integer uniform at given location 18144 * 18145 * @param location Uniform location 18146 * 18147 * @return Value 18148 **/ 18149 GLint Utils::program::getUniform1i(GLuint location) const 18150 { 18151 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18152 18153 GLint result; 18154 18155 gl.getUniformiv(m_program_object_id, location, &result); 18156 GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformiv"); 18157 18158 return result; 18159 } 18160 18161 /** Get uniform location 18162 * 18163 * @param uniform_name Subroutine uniform name 18164 * 18165 * @return Location of uniform 18166 **/ 18167 GLint Utils::program::getUniformLocation(const glw::GLchar* uniform_name) const 18168 { 18169 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18170 GLint location = -1; 18171 18172 location = gl.getUniformLocation(m_program_object_id, uniform_name); 18173 GLU_EXPECT_NO_ERROR(gl.getError(), "GetUniformLocation"); 18174 18175 if (-1 == location) 18176 { 18177 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Uniform: " << uniform_name 18178 << " is not available" << tcu::TestLog::EndMessage; 18179 18180 TCU_FAIL("Uniform is not available"); 18181 } 18182 18183 return location; 18184 } 18185 18186 /** Attach shaders and link program 18187 * 18188 **/ 18189 void Utils::program::link() const 18190 { 18191 /* GL entry points */ 18192 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18193 18194 /* Link status */ 18195 glw::GLint status = GL_FALSE; 18196 18197 /* Attach shaders */ 18198 if (0 != m_compute_shader_id) 18199 { 18200 gl.attachShader(m_program_object_id, m_compute_shader_id); 18201 GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader"); 18202 } 18203 18204 if (0 != m_fragment_shader_id) 18205 { 18206 gl.attachShader(m_program_object_id, m_fragment_shader_id); 18207 GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader"); 18208 } 18209 18210 if (0 != m_geometry_shader_id) 18211 { 18212 gl.attachShader(m_program_object_id, m_geometry_shader_id); 18213 GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader"); 18214 } 18215 18216 if (0 != m_tesselation_control_shader_id) 18217 { 18218 gl.attachShader(m_program_object_id, m_tesselation_control_shader_id); 18219 GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader"); 18220 } 18221 18222 if (0 != m_tesselation_evaluation_shader_id) 18223 { 18224 gl.attachShader(m_program_object_id, m_tesselation_evaluation_shader_id); 18225 GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader"); 18226 } 18227 18228 if (0 != m_vertex_shader_id) 18229 { 18230 gl.attachShader(m_program_object_id, m_vertex_shader_id); 18231 GLU_EXPECT_NO_ERROR(gl.getError(), "AttachShader"); 18232 } 18233 18234 /* Link */ 18235 gl.linkProgram(m_program_object_id); 18236 GLU_EXPECT_NO_ERROR(gl.getError(), "LinkProgram"); 18237 18238 /* Get link status */ 18239 gl.getProgramiv(m_program_object_id, GL_LINK_STATUS, &status); 18240 GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramiv"); 18241 18242 /* Log link error */ 18243 if (GL_TRUE != status) 18244 { 18245 glw::GLint length = 0; 18246 std::vector<glw::GLchar> message; 18247 18248 /* Get error log length */ 18249 gl.getProgramiv(m_program_object_id, GL_INFO_LOG_LENGTH, &length); 18250 GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramiv"); 18251 18252 message.resize(length); 18253 18254 /* Get error log */ 18255 gl.getProgramInfoLog(m_program_object_id, length, 0, &message[0]); 18256 GLU_EXPECT_NO_ERROR(gl.getError(), "GetProgramInfoLog"); 18257 18258 throw programLinkageException(&message[0]); 18259 } 18260 } 18261 18262 /** Delete program object and all attached shaders 18263 * 18264 **/ 18265 void Utils::program::remove() 18266 { 18267 /* GL entry points */ 18268 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18269 18270 /* Make sure program object is no longer used by GL */ 18271 gl.useProgram(0); 18272 18273 /* Clean program object */ 18274 if (0 != m_program_object_id) 18275 { 18276 gl.deleteProgram(m_program_object_id); 18277 m_program_object_id = 0; 18278 } 18279 18280 /* Clean shaders */ 18281 if (0 != m_compute_shader_id) 18282 { 18283 gl.deleteShader(m_compute_shader_id); 18284 m_compute_shader_id = 0; 18285 } 18286 18287 if (0 != m_fragment_shader_id) 18288 { 18289 gl.deleteShader(m_fragment_shader_id); 18290 m_fragment_shader_id = 0; 18291 } 18292 18293 if (0 != m_geometry_shader_id) 18294 { 18295 gl.deleteShader(m_geometry_shader_id); 18296 m_geometry_shader_id = 0; 18297 } 18298 18299 if (0 != m_tesselation_control_shader_id) 18300 { 18301 gl.deleteShader(m_tesselation_control_shader_id); 18302 m_tesselation_control_shader_id = 0; 18303 } 18304 18305 if (0 != m_tesselation_evaluation_shader_id) 18306 { 18307 gl.deleteShader(m_tesselation_evaluation_shader_id); 18308 m_tesselation_evaluation_shader_id = 0; 18309 } 18310 18311 if (0 != m_vertex_shader_id) 18312 { 18313 gl.deleteShader(m_vertex_shader_id); 18314 m_vertex_shader_id = 0; 18315 } 18316 } 18317 18318 void Utils::program::uniform(const glw::GLchar* uniform_name, TYPES type, glw::GLuint n_columns, glw::GLuint n_rows, 18319 const void* data) const 18320 { 18321 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18322 18323 GLuint location = getUniformLocation(uniform_name); 18324 18325 if ((glw::GLuint)-1 == location) 18326 { 18327 TCU_FAIL("Uniform is inactive"); 18328 } 18329 18330 switch (type) 18331 { 18332 case DOUBLE: 18333 if (1 == n_columns) 18334 { 18335 getUniformNdv(gl, n_rows)(location, 1 /* count */, (const GLdouble*)data); 18336 GLU_EXPECT_NO_ERROR(gl.getError(), "UniformNdv"); 18337 } 18338 else 18339 { 18340 getUniformMatrixNdv(gl, n_columns, n_rows)(location, 1 /* count */, false, (const GLdouble*)data); 18341 GLU_EXPECT_NO_ERROR(gl.getError(), "UniformMatrixNdv"); 18342 } 18343 break; 18344 case FLOAT: 18345 if (1 == n_columns) 18346 { 18347 getUniformNfv(gl, n_rows)(location, 1 /* count */, (const GLfloat*)data); 18348 GLU_EXPECT_NO_ERROR(gl.getError(), "UniformNfv"); 18349 } 18350 else 18351 { 18352 getUniformMatrixNfv(gl, n_columns, n_rows)(location, 1 /* count */, false, (const GLfloat*)data); 18353 GLU_EXPECT_NO_ERROR(gl.getError(), "UniformMatrixNfv"); 18354 } 18355 break; 18356 case INT: 18357 getUniformNiv(gl, n_rows)(location, 1 /* count */, (const GLint*)data); 18358 GLU_EXPECT_NO_ERROR(gl.getError(), "UniformNiv"); 18359 break; 18360 case UINT: 18361 getUniformNuiv(gl, n_rows)(location, 1 /* count */, (const GLuint*)data); 18362 GLU_EXPECT_NO_ERROR(gl.getError(), "UniformNuiv"); 18363 break; 18364 default: 18365 TCU_FAIL("Invalid enum"); 18366 } 18367 } 18368 18369 /** Execute UseProgram 18370 * 18371 **/ 18372 void Utils::program::use() const 18373 { 18374 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18375 18376 gl.useProgram(m_program_object_id); 18377 GLU_EXPECT_NO_ERROR(gl.getError(), "UseProgram"); 18378 } 18379 18380 void Utils::program::printShaderSource(const shaderSource& source, tcu::MessageBuilder& log) 18381 { 18382 GLuint line_number = 0; 18383 18384 log << "Shader source."; 18385 18386 for (GLuint i = 0; i < source.m_parts.size(); ++i) 18387 { 18388 log << "\nLine||Part: " << (i + 1) << "/" << source.m_parts.size(); 18389 18390 if (true == source.m_use_lengths) 18391 { 18392 log << " Length: " << source.m_parts[i].m_length; 18393 } 18394 18395 log << "\n"; 18396 18397 const GLchar* part = source.m_parts[i].m_code.c_str(); 18398 18399 while (0 != part) 18400 { 18401 std::string line; 18402 const GLchar* next_line = strchr(part, '\n'); 18403 18404 if (0 != next_line) 18405 { 18406 next_line += 1; 18407 line.assign(part, next_line - part); 18408 } 18409 else 18410 { 18411 line = part; 18412 } 18413 18414 if (0 != *part) 18415 { 18416 log << std::setw(4) << line_number << "||" << line; 18417 } 18418 18419 part = next_line; 18420 line_number += 1; 18421 } 18422 } 18423 } 18424 18425 /** Constructor. 18426 * 18427 * @param context CTS context. 18428 **/ 18429 Utils::texture::texture(deqp::Context& context) : m_id(0), m_context(context), m_texture_type(TEX_2D) 18430 { 18431 /* Nothing to done here */ 18432 } 18433 18434 /** Destructor 18435 * 18436 **/ 18437 Utils::texture::~texture() 18438 { 18439 release(); 18440 } 18441 18442 /** Bind texture to GL_TEXTURE_2D 18443 * 18444 **/ 18445 void Utils::texture::bind() const 18446 { 18447 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18448 18449 GLenum target = getTextureTartet(m_texture_type); 18450 18451 gl.bindTexture(target, m_id); 18452 GLU_EXPECT_NO_ERROR(gl.getError(), "BindTexture"); 18453 } 18454 18455 /** Create 2d texture 18456 * 18457 * @param width Width of texture 18458 * @param height Height of texture 18459 * @param internal_format Internal format of texture 18460 **/ 18461 void Utils::texture::create(glw::GLuint width, glw::GLuint height, glw::GLenum internal_format) 18462 { 18463 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18464 18465 release(); 18466 18467 m_texture_type = TEX_2D; 18468 18469 gl.genTextures(1, &m_id); 18470 GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures"); 18471 18472 bind(); 18473 18474 gl.texStorage2D(GL_TEXTURE_2D, 1 /* levels */, internal_format, width, height); 18475 GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage2D"); 18476 } 18477 18478 /** Create texture of given type 18479 * 18480 * @param width Width of texture 18481 * @param height Height of texture 18482 * @param depth Depth of texture 18483 * @param internal_format Internal format of texture 18484 * @param texture_type Type of texture 18485 **/ 18486 void Utils::texture::create(GLuint width, GLuint height, GLuint depth, GLenum internal_format, 18487 TEXTURE_TYPES texture_type) 18488 { 18489 static const GLuint levels = 1; 18490 18491 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18492 18493 release(); 18494 18495 m_texture_type = texture_type; 18496 18497 GLenum target = getTextureTartet(m_texture_type); 18498 18499 gl.genTextures(1, &m_id); 18500 GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures"); 18501 18502 bind(); 18503 18504 switch (m_texture_type) 18505 { 18506 case TEX_1D: 18507 gl.texStorage1D(target, levels, internal_format, width); 18508 GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage1D"); 18509 break; 18510 case TEX_2D: 18511 case TEX_1D_ARRAY: 18512 case TEX_2D_RECT: 18513 case TEX_CUBE: 18514 gl.texStorage2D(target, levels, internal_format, width, height); 18515 GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage2D"); 18516 break; 18517 case TEX_3D: 18518 case TEX_2D_ARRAY: 18519 gl.texStorage3D(target, levels, internal_format, width, height, depth); 18520 GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage3D"); 18521 break; 18522 default: 18523 TCU_FAIL("Invliad enum"); 18524 break; 18525 } 18526 } 18527 18528 /** Create buffer texture 18529 * 18530 * @param internal_format Internal format of texture 18531 * @param buffer_id Id of buffer that will be used as data source 18532 **/ 18533 void Utils::texture::createBuffer(GLenum internal_format, GLuint buffer_id) 18534 { 18535 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18536 18537 release(); 18538 18539 m_texture_type = TEX_BUFFER; 18540 m_buffer_id = buffer_id; 18541 18542 gl.genTextures(1, &m_id); 18543 GLU_EXPECT_NO_ERROR(gl.getError(), "GenTextures"); 18544 18545 bind(); 18546 18547 gl.texBuffer(GL_TEXTURE_BUFFER, internal_format, buffer_id); 18548 GLU_EXPECT_NO_ERROR(gl.getError(), "TexBuffer"); 18549 } 18550 18551 /** Get contents of texture 18552 * 18553 * @param format Format of image 18554 * @param type Type of image 18555 * @param out_data Buffer for image 18556 **/ 18557 void Utils::texture::get(glw::GLenum format, glw::GLenum type, glw::GLvoid* out_data) const 18558 { 18559 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18560 18561 GLenum target = getTextureTartet(m_texture_type); 18562 18563 bind(); 18564 18565 gl.memoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT); 18566 GLU_EXPECT_NO_ERROR(gl.getError(), "MemoryBarrier"); 18567 18568 if (TEX_CUBE != m_texture_type) 18569 { 18570 gl.getTexImage(target, 0 /* level */, format, type, out_data); 18571 GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexImage"); 18572 } 18573 else 18574 { 18575 GLint width; 18576 GLint height; 18577 18578 if ((GL_RGBA != format) && (GL_UNSIGNED_BYTE != type)) 18579 { 18580 TCU_FAIL("Not implemented"); 18581 } 18582 18583 GLuint texel_size = 4; 18584 18585 gl.getTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0 /* level */, GL_TEXTURE_WIDTH, &width); 18586 GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexLevelParameteriv"); 18587 18588 gl.getTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0 /* level */, GL_TEXTURE_HEIGHT, &height); 18589 GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexLevelParameteriv"); 18590 18591 const GLuint image_size = width * height * texel_size; 18592 18593 gl.getTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0 /* level */, format, type, 18594 (GLvoid*)((GLchar*)out_data + (image_size * 0))); 18595 gl.getTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0 /* level */, format, type, 18596 (GLvoid*)((GLchar*)out_data + (image_size * 1))); 18597 gl.getTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0 /* level */, format, type, 18598 (GLvoid*)((GLchar*)out_data + (image_size * 2))); 18599 gl.getTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0 /* level */, format, type, 18600 (GLvoid*)((GLchar*)out_data + (image_size * 3))); 18601 gl.getTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0 /* level */, format, type, 18602 (GLvoid*)((GLchar*)out_data + (image_size * 4))); 18603 gl.getTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0 /* level */, format, type, 18604 (GLvoid*)((GLchar*)out_data + (image_size * 5))); 18605 GLU_EXPECT_NO_ERROR(gl.getError(), "GetTexImage"); 18606 } 18607 } 18608 18609 /** Delete texture 18610 * 18611 **/ 18612 void Utils::texture::release() 18613 { 18614 if (0 != m_id) 18615 { 18616 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18617 18618 gl.deleteTextures(1, &m_id); 18619 m_id = 0; 18620 18621 if ((m_texture_type == TEX_BUFFER) && (0 != m_buffer_id)) 18622 { 18623 gl.deleteBuffers(1, &m_buffer_id); 18624 m_buffer_id = 0; 18625 } 18626 } 18627 } 18628 18629 /** Update contents of texture 18630 * 18631 * @param width Width of texture 18632 * @param height Height of texture 18633 * @param format Format of data 18634 * @param type Type of data 18635 * @param data Buffer with image 18636 **/ 18637 void Utils::texture::update(glw::GLuint width, glw::GLuint height, glw::GLuint depth, glw::GLenum format, 18638 glw::GLenum type, glw::GLvoid* data) 18639 { 18640 static const GLuint level = 0; 18641 18642 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18643 18644 GLenum target = getTextureTartet(m_texture_type); 18645 18646 bind(); 18647 18648 switch (m_texture_type) 18649 { 18650 case TEX_1D: 18651 gl.texSubImage1D(target, level, 0 /* x */, width, format, type, data); 18652 GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage1D"); 18653 break; 18654 case TEX_2D: 18655 case TEX_1D_ARRAY: 18656 case TEX_2D_RECT: 18657 gl.texSubImage2D(target, level, 0 /* x */, 0 /* y */, width, height, format, type, data); 18658 GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage2D"); 18659 break; 18660 case TEX_CUBE: 18661 gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, level, 0 /* x */, 0 /* y */, width, height, format, type, 18662 data); 18663 gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, level, 0 /* x */, 0 /* y */, width, height, format, type, 18664 data); 18665 gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, level, 0 /* x */, 0 /* y */, width, height, format, type, 18666 data); 18667 gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, level, 0 /* x */, 0 /* y */, width, height, format, type, 18668 data); 18669 gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, level, 0 /* x */, 0 /* y */, width, height, format, type, 18670 data); 18671 gl.texSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, level, 0 /* x */, 0 /* y */, width, height, format, type, 18672 data); 18673 GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage2D"); 18674 break; 18675 case TEX_3D: 18676 case TEX_2D_ARRAY: 18677 gl.texSubImage3D(target, level, 0 /* x */, 0 /* y */, 0 /* z */, width, height, depth, format, type, data); 18678 GLU_EXPECT_NO_ERROR(gl.getError(), "TexStorage3D"); 18679 break; 18680 default: 18681 TCU_FAIL("Invliad enum"); 18682 break; 18683 } 18684 } 18685 18686 /** Constructor. 18687 * 18688 * @param context CTS context. 18689 **/ 18690 Utils::vertexArray::vertexArray(deqp::Context& context) : m_id(0), m_context(context) 18691 { 18692 } 18693 18694 /** Destructor 18695 * 18696 **/ 18697 Utils::vertexArray::~vertexArray() 18698 { 18699 if (0 != m_id) 18700 { 18701 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18702 18703 gl.deleteVertexArrays(1, &m_id); 18704 18705 m_id = 0; 18706 } 18707 } 18708 18709 /** Execute BindVertexArray 18710 * 18711 **/ 18712 void Utils::vertexArray::bind() 18713 { 18714 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18715 18716 gl.bindVertexArray(m_id); 18717 GLU_EXPECT_NO_ERROR(gl.getError(), "BindVertexArray"); 18718 } 18719 18720 /** Execute GenVertexArrays 18721 * 18722 **/ 18723 void Utils::vertexArray::generate() 18724 { 18725 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18726 18727 gl.genVertexArrays(1, &m_id); 18728 GLU_EXPECT_NO_ERROR(gl.getError(), "GenVertexArrays"); 18729 } 18730 } /* GLSL420Pack namespace */ 18731 18732 /** Constructor. 18733 * 18734 * @param context Rendering context. 18735 **/ 18736 ShadingLanguage420PackTests::ShadingLanguage420PackTests(deqp::Context& context) 18737 : TestCaseGroup(context, "shading_language_420pack", "Verifies \"shading_language_420pack\" functionality") 18738 { 18739 /* Left blank on purpose */ 18740 } 18741 18742 /** Initializes a texture_storage_multisample test group. 18743 * 18744 **/ 18745 void ShadingLanguage420PackTests::init(void) 18746 { 18747 addChild(new GLSL420Pack::BindingSamplerSingleTest(m_context)); 18748 addChild(new GLSL420Pack::BindingImageSingleTest(m_context)); 18749 addChild(new GLSL420Pack::UTF8CharactersTest(m_context)); 18750 addChild(new GLSL420Pack::UTF8InSourceTest(m_context)); 18751 addChild(new GLSL420Pack::QualifierOrderTest(m_context)); 18752 addChild(new GLSL420Pack::QualifierOrderBlockTest(m_context)); 18753 addChild(new GLSL420Pack::LineContinuationTest(m_context)); 18754 addChild(new GLSL420Pack::LineNumberingTest(m_context)); 18755 addChild(new GLSL420Pack::ImplicitConversionsValidTest(m_context)); 18756 addChild(new GLSL420Pack::ImplicitConversionsInvalidTest(m_context)); 18757 addChild(new GLSL420Pack::ConstDynamicValueTest(m_context)); 18758 addChild(new GLSL420Pack::ConstAssignmentTest(m_context)); 18759 addChild(new GLSL420Pack::ConstDynamicValueAsConstExprTest(m_context)); 18760 addChild(new GLSL420Pack::QualifierOrderUniformTest(m_context)); 18761 addChild(new GLSL420Pack::QualifierOrderFunctionInoutTest(m_context)); 18762 addChild(new GLSL420Pack::QualifierOrderFunctionInputTest(m_context)); 18763 addChild(new GLSL420Pack::QualifierOrderFunctionOutputTest(m_context)); 18764 addChild(new GLSL420Pack::QualifierOverrideLayoutTest(m_context)); 18765 addChild(new GLSL420Pack::BindingUniformBlocksTest(m_context)); 18766 addChild(new GLSL420Pack::BindingUniformSingleBlockTest(m_context)); 18767 addChild(new GLSL420Pack::BindingUniformBlockArrayTest(m_context)); 18768 addChild(new GLSL420Pack::BindingUniformDefaultTest(m_context)); 18769 addChild(new GLSL420Pack::BindingUniformAPIOverirdeTest(m_context)); 18770 addChild(new GLSL420Pack::BindingUniformGlobalBlockTest(m_context)); 18771 addChild(new GLSL420Pack::BindingUniformInvalidTest(m_context)); 18772 addChild(new GLSL420Pack::BindingSamplersTest(m_context)); 18773 addChild(new GLSL420Pack::BindingSamplerArrayTest(m_context)); 18774 addChild(new GLSL420Pack::BindingSamplerDefaultTest(m_context)); 18775 addChild(new GLSL420Pack::BindingSamplerAPIOverrideTest(m_context)); 18776 addChild(new GLSL420Pack::BindingSamplerInvalidTest(m_context)); 18777 addChild(new GLSL420Pack::BindingImagesTest(m_context)); 18778 addChild(new GLSL420Pack::BindingImageArrayTest(m_context)); 18779 addChild(new GLSL420Pack::BindingImageDefaultTest(m_context)); 18780 addChild(new GLSL420Pack::BindingImageAPIOverrideTest(m_context)); 18781 addChild(new GLSL420Pack::BindingImageInvalidTest(m_context)); 18782 addChild(new GLSL420Pack::InitializerListTest(m_context)); 18783 addChild(new GLSL420Pack::InitializerListNegativeTest(m_context)); 18784 addChild(new GLSL420Pack::LengthOfVectorAndMatrixTest(m_context)); 18785 addChild(new GLSL420Pack::LengthOfComputeResultTest(m_context)); 18786 addChild(new GLSL420Pack::ScalarSwizzlersTest(m_context)); 18787 addChild(new GLSL420Pack::ScalarSwizzlersInvalidTest(m_context)); 18788 addChild(new GLSL420Pack::BuiltInValuesTest(m_context)); 18789 addChild(new GLSL420Pack::BuiltInAssignmentTest(m_context)); 18790 } 18791 18792 } /* gl4cts namespace */ 18793