1 /*------------------------------------------------------------------------- 2 * OpenGL Conformance Test Suite 3 * ----------------------------- 4 * 5 * Copyright (c) 2015-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 /* Includes. */ 25 #include "gl4cES31CompatibilityTests.hpp" 26 #include "gluContextInfo.hpp" 27 #include "gluDefs.hpp" 28 #include "gluRenderContext.hpp" 29 #include "gluStrUtil.hpp" 30 #include "tcuTestLog.hpp" 31 32 /******************************** Test Group Implementation ********************************/ 33 34 /** @brief ES3.1 Compatibility tests group constructor. 35 * 36 * @param [in] context OpenGL context. 37 */ 38 gl4cts::es31compatibility::Tests::Tests(deqp::Context& context) 39 : TestCaseGroup(context, "es_31_compatibility", "ES3.1 Compatibility Test Suite") 40 { 41 /* Intentionally left blank */ 42 } 43 44 /** @brief ES3.1 Compatibility Tests initializer. */ 45 void gl4cts::es31compatibility::Tests::init() 46 { 47 /* New tests. */ 48 addChild(new gl4cts::es31compatibility::ShaderCompilationCompatibilityTests(m_context)); 49 addChild(new gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest(m_context)); 50 51 /* Ported tests. */ 52 addChild(new gl4cts::es31compatibility::SampleVariablesTests(m_context, glu::GLSL_VERSION_310_ES)); 53 addChild(new gl4cts::es31compatibility::ShaderImageLoadStoreTests(m_context)); 54 addChild(new gl4cts::es31compatibility::ShaderStorageBufferObjectTests(m_context)); 55 } 56 57 /******************************** Shader Compilation Compatibility Tests Implementation ********************************/ 58 59 /** @brief ShaderCompilationCompatibilityTests constructor. 60 * 61 * @param [in] context OpenGL context. 62 */ 63 gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::ShaderCompilationCompatibilityTests( 64 deqp::Context& context) 65 : deqp::TestCase(context, "shader_compilation", "Shader Compilation Compatibility Test") 66 { 67 } 68 69 /** @brief ShaderCompilationCompatibilityTests test cases iterations. 70 */ 71 tcu::TestNode::IterateResult gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::iterate() 72 { 73 /* Shortcut for GL functionality. */ 74 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 75 76 /* OpenGL support query. */ 77 bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5))); 78 bool is_arb_es31_compatibility = m_context.getContextInfo().isExtensionSupported("GL_ARB_ES3_1_compatibility"); 79 80 /* Running tests. */ 81 bool is_ok = true; 82 bool is_error = false; 83 84 glw::GLuint shader = 0; 85 86 /* Test */ 87 try 88 { 89 if (is_at_least_gl_45 || is_arb_es31_compatibility) 90 { 91 for (glw::GLsizei i = 0; i < s_shaders_count; ++i) 92 { 93 /* Shader compilation. */ 94 shader = gl.createShader(s_shaders[i].type); 95 96 GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed."); 97 98 if (0 == shader) 99 { 100 throw 0; 101 } 102 103 gl.shaderSource(shader, 1, &(s_shaders[i].source), NULL); 104 105 GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed."); 106 107 gl.compileShader(shader); 108 109 GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed."); 110 111 /* Checking for errors. */ 112 glw::GLint status = GL_FALSE; 113 114 gl.getShaderiv(shader, GL_COMPILE_STATUS, &status); 115 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed."); 116 117 if (GL_FALSE == status) 118 { 119 /* Setup result. */ 120 is_ok = false; 121 122 /* Getting compilation informations. */ 123 glw::GLint log_size = 0; 124 125 gl.getShaderiv(shader, GL_INFO_LOG_LENGTH, &log_size); 126 127 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv() call failed."); 128 129 if (log_size) 130 { 131 glw::GLchar* log = new glw::GLchar[log_size]; 132 133 if (log) 134 { 135 memset(log, 0, log_size); 136 137 gl.getShaderInfoLog(shader, log_size, DE_NULL, log); 138 139 /* Logging. */ 140 m_context.getTestContext().getLog() << tcu::TestLog::Message << "Compilation of " 141 << s_shaders[i].type_name 142 << " shader have failed.\n Shader source was:\n" 143 << s_shaders[i].source << "\nCompillation log:\n" 144 << log << tcu::TestLog::EndMessage; 145 146 delete[] log; 147 148 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog() call failed."); 149 } 150 } 151 } 152 153 /* Cleanup. */ 154 gl.deleteShader(shader); 155 156 shader = 0; 157 158 GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteShader call failed."); 159 } 160 } 161 } 162 catch (...) 163 { 164 is_ok = false; 165 is_error = true; 166 } 167 168 /* Cleanup. */ 169 if (0 != shader) 170 { 171 gl.deleteShader(shader); 172 173 shader = 0; 174 } 175 176 /* Result's setup and logging. */ 177 if (is_ok) 178 { 179 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 180 } 181 else 182 { 183 if (is_error) 184 { 185 m_context.getTestContext().getLog() << tcu::TestLog::Message 186 << "Internal error has occured during the Shader Version Test." 187 << tcu::TestLog::EndMessage; 188 189 m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Test error."); 190 } 191 else 192 { 193 m_context.getTestContext().getLog() << tcu::TestLog::Message << "The Shader Version Test has failed." 194 << tcu::TestLog::EndMessage; 195 196 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 197 } 198 } 199 200 return STOP; 201 } 202 203 const gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::TestShader 204 gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::s_shaders[] = { 205 { /* Shader for testing ES 3.1 version string support.*/ 206 GL_VERTEX_SHADER, "vertex", "#version 310 es\n" 207 "\n" 208 "void main()\n" 209 "{\n" 210 " gl_Position = vec4(1.0);\n" 211 "}\n" }, 212 { /* Shader for testing ES 3.1 version string support.*/ 213 GL_FRAGMENT_SHADER, "fragment", "#version 310 es\n" 214 "\n" 215 "out highp vec4 color;" 216 "\n" 217 "void main()\n" 218 "{\n" 219 " color = vec4(1.0);\n" 220 "}\n" }, 221 { /* Shader for testing that gl_HelperInvocation variable is supported.*/ 222 GL_FRAGMENT_SHADER, "fragment", "#version 310 es\n" 223 "\n" 224 "out highp vec4 color;" 225 "\n" 226 "void main()\n" 227 "{\n" 228 " if(gl_HelperInvocation)\n" 229 " {\n" 230 " color = vec4(1.0);\n" 231 " }\n" 232 " else\n" 233 " {\n" 234 " color = vec4(0.0);\n" 235 " }\n" 236 "}\n" }, 237 { /* Shader for testing ES 3.1 version string support.*/ 238 GL_COMPUTE_SHADER, "compute", 239 "#version 310 es\n" 240 "\n" 241 "layout(local_size_x = 128) in;\n" 242 "layout(std140, binding = 0) buffer Output\n" 243 "{\n" 244 " uint elements[];\n" 245 "} output_data;\n" 246 "\n" 247 "void main()\n" 248 "{\n" 249 " output_data.elements[gl_GlobalInvocationID.x] = gl_GlobalInvocationID.x * gl_GlobalInvocationID.x;\n" 250 "}\n" } 251 }; 252 253 const glw::GLsizei gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::s_shaders_count = 254 sizeof(s_shaders) / sizeof(s_shaders[0]); 255 256 /******************************** Shader Functional Compatibility Test Implementation ********************************/ 257 258 /** @brief Shader Functional Compatibility Test constructor. 259 * 260 * @param [in] context OpenGL context. 261 */ 262 gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::ShaderFunctionalCompatibilityTest(deqp::Context& context) 263 : deqp::TestCase(context, "shader_functional", "Shader Functional Compatibility Test") 264 , m_po_id(0) 265 , m_fbo_id(0) 266 , m_rbo_id(0) 267 , m_vao_id(0) 268 { 269 } 270 271 /** @brief ShaderCompilationCompatibilityTests test cases iterations. 272 */ 273 tcu::TestNode::IterateResult gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::iterate() 274 { 275 /* OpenGL support query. */ 276 bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5))); 277 bool is_arb_es31_compatibility = m_context.getContextInfo().isExtensionSupported("GL_ARB_ES3_1_compatibility"); 278 279 /* Running tests. */ 280 bool is_ok = true; 281 bool is_error = false; 282 283 /* Test */ 284 try 285 { 286 if (is_at_least_gl_45 || is_arb_es31_compatibility) 287 { 288 createFramebufferAndVertexArrayObject(); 289 290 for (glw::GLsizei i = 0; i < s_shaders_count; ++i) 291 { 292 if (!createProgram(s_shaders[i])) 293 { 294 is_ok = false; 295 296 continue; /* if createProgram failed we shall omit this iteration */ 297 } 298 299 is_ok &= test(); 300 301 cleanProgram(); 302 } 303 304 cleanFramebufferAndVertexArrayObject(); 305 } 306 } 307 catch (...) 308 { 309 /* Result setup. */ 310 is_ok = false; 311 is_error = true; 312 313 /* Cleanup. */ 314 cleanProgram(); 315 cleanFramebufferAndVertexArrayObject(); 316 } 317 318 /* Result's setup. */ 319 if (is_ok) 320 { 321 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 322 } 323 else 324 { 325 if (is_error) 326 { 327 m_context.getTestContext().getLog() << tcu::TestLog::Message 328 << "Internal error has occured during the Shader Version Test." 329 << tcu::TestLog::EndMessage; 330 331 m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Test error."); 332 } 333 else 334 { 335 m_context.getTestContext().getLog() << tcu::TestLog::Message << "The Shader Version Test has failed." 336 << tcu::TestLog::EndMessage; 337 338 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 339 } 340 } 341 342 return STOP; 343 } 344 345 /** @brief Create program object 346 * 347 * @note Program object is going to be stored into m_po_id. 348 * If building succeeded program will be set current (glUseProgram). 349 * 350 * @param [in] shader_source Shader source to be builded. 351 * 352 * @return True if succeeded, false otherwise. 353 */ 354 bool gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::createProgram(const struct Shader shader_source) 355 { 356 /* Shortcut for GL functionality. */ 357 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 358 359 struct _Shader 360 { 361 const glw::GLchar* const* source; 362 const glw::GLenum type; 363 glw::GLuint id; 364 } shader[] = { { shader_source.vertex, GL_VERTEX_SHADER, 0 }, { shader_source.fragment, GL_FRAGMENT_SHADER, 0 } }; 365 366 glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]); 367 368 try 369 { 370 /* Make sure m_po_id is cleaned. */ 371 if (m_po_id) 372 { 373 cleanProgram(); 374 } 375 376 /* Create program. */ 377 m_po_id = gl.createProgram(); 378 GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram call failed."); 379 380 /* Shader compilation. */ 381 382 for (glw::GLuint i = 0; i < shader_count; ++i) 383 { 384 if (DE_NULL != shader[i].source) 385 { 386 shader[i].id = gl.createShader(shader[i].type); 387 388 GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed."); 389 390 gl.attachShader(m_po_id, shader[i].id); 391 392 GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader call failed."); 393 394 gl.shaderSource(shader[i].id, 3, shader[i].source, NULL); 395 396 GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed."); 397 398 gl.compileShader(shader[i].id); 399 400 GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed."); 401 402 glw::GLint status = GL_FALSE; 403 404 gl.getShaderiv(shader[i].id, GL_COMPILE_STATUS, &status); 405 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed."); 406 407 if (GL_FALSE == status) 408 { 409 glw::GLint log_size = 0; 410 411 gl.getShaderiv(shader[i].id, GL_INFO_LOG_LENGTH, &log_size); 412 413 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv() call failed."); 414 415 if (log_size) 416 { 417 glw::GLchar* log = new glw::GLchar[log_size]; 418 419 if (log) 420 { 421 memset(log, 0, log_size); 422 423 gl.getShaderInfoLog(shader[i].id, log_size, DE_NULL, log); 424 425 m_context.getTestContext().getLog() 426 << tcu::TestLog::Message << "Compilation of shader has failed.\nShader source:\n" 427 << shader[i].source[0] << shader[i].source[1] << shader[i].source[2] 428 << "\nCompillation log:\n" 429 << log << tcu::TestLog::EndMessage; 430 431 delete[] log; 432 433 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog() call failed."); 434 } 435 } 436 437 throw 0; 438 } 439 } 440 } 441 442 /* Link. */ 443 gl.linkProgram(m_po_id); 444 445 GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram call failed."); 446 447 glw::GLint status = GL_FALSE; 448 449 gl.getProgramiv(m_po_id, GL_LINK_STATUS, &status); 450 451 if (GL_TRUE == status) 452 { 453 for (glw::GLuint i = 0; i < shader_count; ++i) 454 { 455 if (shader[i].id) 456 { 457 gl.detachShader(m_po_id, shader[i].id); 458 459 GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader call failed."); 460 } 461 } 462 } 463 else 464 { 465 glw::GLint log_size = 0; 466 467 gl.getProgramiv(m_po_id, GL_INFO_LOG_LENGTH, &log_size); 468 469 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() call failed."); 470 471 if (log_size) 472 { 473 glw::GLchar* log = new glw::GLchar[log_size]; 474 475 if (log) 476 { 477 memset(log, 0, log_size); 478 479 gl.getProgramInfoLog(m_po_id, log_size, DE_NULL, log); 480 481 m_context.getTestContext().getLog() << tcu::TestLog::Message 482 << "Linkage of shader program has failed.\nLinkage log:\n" 483 << log << tcu::TestLog::EndMessage; 484 485 delete[] log; 486 487 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog() call failed."); 488 } 489 } 490 491 throw 0; 492 } 493 } 494 catch (...) 495 { 496 if (m_po_id) 497 { 498 gl.deleteProgram(m_po_id); 499 500 m_po_id = 0; 501 } 502 } 503 504 for (glw::GLuint i = 0; i < shader_count; ++i) 505 { 506 if (0 != shader[i].id) 507 { 508 gl.deleteShader(shader[i].id); 509 510 shader[i].id = 0; 511 } 512 } 513 514 if (m_po_id) 515 { 516 gl.useProgram(m_po_id); 517 518 GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed."); 519 520 return true; 521 } 522 523 return false; 524 } 525 526 /** @brief Create framebuffer and vertex array object. 527 * 528 * @note Frembuffer will be stored in m_fbo_id and m_rbo_id. 529 * Vertex array object will be stored in m_vao_id. 530 * Function will throw 0 if erro has occured. 531 */ 532 void gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::createFramebufferAndVertexArrayObject() 533 { 534 /* Shortcut for GL functionality. */ 535 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 536 537 /* Prepare framebuffer. */ 538 gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f); 539 GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor call failed."); 540 541 gl.genFramebuffers(1, &m_fbo_id); 542 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers call failed."); 543 544 gl.genRenderbuffers(1, &m_rbo_id); 545 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenRenderbuffers call failed."); 546 547 gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo_id); 548 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer call failed."); 549 550 gl.bindRenderbuffer(GL_RENDERBUFFER, m_rbo_id); 551 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer call failed."); 552 553 gl.renderbufferStorage(GL_RENDERBUFFER, GL_R8, 1 /* x size */, 1 /* y size */); 554 GLU_EXPECT_NO_ERROR(gl.getError(), "glRenderbufferStorage call failed."); 555 556 gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rbo_id); 557 GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferRenderbuffer call failed."); 558 559 /* Check if all went ok. */ 560 if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 561 { 562 throw 0; 563 } 564 565 /* View Setup. */ 566 gl.viewport(0, 0, 1 /* x size */, 1 /* y size */); 567 GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport call failed."); 568 569 /* Create and bind empty vertex array object. */ 570 gl.genVertexArrays(1, &m_vao_id); 571 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() call failed."); 572 573 if (0 == m_vao_id) 574 { 575 throw 0; 576 } 577 578 gl.bindVertexArray(m_vao_id); 579 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() call failed."); 580 } 581 582 /** @brief Run test case. 583 * 584 * @note Test case run in following order: 585 * * clear screen with 0 value (color setup in createFramebufferAndVertexArrayObject); 586 * * draw full screen quad; 587 * * fetch pixel from screen using glReadPixel (view is 1x1 pixel in size); 588 * * compare results (1.0f is expected as the result of the shader). 589 */ 590 bool gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::test() 591 { 592 /* Shortcut for GL functionality. */ 593 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 594 595 /* Make sure objects are cleaned. */ 596 if (m_fbo_id || m_rbo_id || m_vao_id) 597 { 598 cleanFramebufferAndVertexArrayObject(); 599 } 600 601 /* Drawing quad which shall output result. */ 602 gl.clear(GL_COLOR_BUFFER_BIT); 603 GLU_EXPECT_NO_ERROR(gl.getError(), "glClear() call failed."); 604 605 gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4); 606 GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() call failed."); 607 608 /* Fetching result. */ 609 glw::GLfloat red = -1.f; 610 611 gl.readPixels(0, 0, 1, 1, GL_RED, GL_FLOAT, &red); 612 GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() call failed."); 613 614 if (de::abs(1.f - red) <= 0.125 /* Precision. */) 615 { 616 return true; 617 } 618 619 return false; 620 } 621 622 /** @brief Release program object. 623 */ 624 void gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::cleanProgram() 625 { 626 /* Shortcut for GL functionality. */ 627 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 628 629 /* Deleting program. */ 630 if (m_po_id) 631 { 632 gl.useProgram(0); 633 634 gl.deleteProgram(m_po_id); 635 636 m_po_id = 0; 637 } 638 } 639 640 /** @brief Release framebuffer, renderbuffer and vertex array objects. 641 */ 642 void gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::cleanFramebufferAndVertexArrayObject() 643 { 644 /* Shortcut for GL functionality. */ 645 const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 646 647 /* Deleting view. */ 648 if (m_fbo_id) 649 { 650 gl.deleteFramebuffers(1, &m_fbo_id); 651 652 m_fbo_id = 0; 653 } 654 655 if (m_rbo_id) 656 { 657 gl.deleteRenderbuffers(1, &m_rbo_id); 658 659 m_rbo_id = 0; 660 } 661 662 if (m_vao_id) 663 { 664 gl.deleteVertexArrays(1, &m_vao_id); 665 666 m_vao_id = 0; 667 } 668 } 669 670 const glw::GLchar* gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_shader_version = "#version 310 es\n"; 671 672 const glw::GLchar* gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_vertex_shader_body = 673 "\n" 674 "out highp float dummy;\n" 675 "\n" 676 "void main()\n" 677 "{\n" 678 " switch(gl_VertexID % 4)\n" 679 " {\n" 680 " case 0:\n" 681 " gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);\n" 682 " break;\n" 683 " case 1:\n" 684 " gl_Position = vec4( 1.0, -1.0, 0.0, 1.0);\n" 685 " break;\n" 686 " case 2:\n" 687 " gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);\n" 688 " break;\n" 689 " case 3:\n" 690 " gl_Position = vec4( 1.0, 1.0, 0.0, 1.0);\n" 691 " break;\n" 692 " }\n" 693 "\n" 694 " dummy = float(gl_VertexID % 4);\n /* Always less than 4. */" 695 "}\n"; 696 697 const glw::GLchar* gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_fragment_shader_body = 698 "\n" 699 "in highp float dummy;\n" 700 "\n" 701 "out highp vec4 result;\n" 702 "\n" 703 "void main()\n" 704 "{\n" 705 " TTYPE a = LEFT;\n" 706 " TTYPE b = RIGHT;\n" 707 " BTYPE c = BDATA && BTYPE(dummy < 4.0);\n /* Making sure that expression is not compile time constant. */" 708 "\n" 709 " TTYPE mixed = mix(a, b, c);\n" 710 "\n" 711 " if(REFERENCE == mixed)\n" 712 " {\n" 713 " result = vec4(1.0);\n" 714 " }\n" 715 " else\n" 716 " {\n" 717 " result = vec4(0.0);\n" 718 " }\n" 719 "}\n"; 720 721 const struct gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::Shader 722 gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_shaders[] = { 723 { { s_shader_version, "", s_vertex_shader_body }, 724 { s_shader_version, "#define TTYPE highp int\n" 725 "#define BTYPE bool\n" 726 "#define LEFT -1\n" 727 "#define RIGHT -2\n" 728 "#define BDATA true\n" 729 "#define REFERENCE -2\n", 730 s_fragment_shader_body } }, 731 { { s_shader_version, "", s_vertex_shader_body }, 732 { s_shader_version, "#define TTYPE highp uint\n" 733 "#define BTYPE bool\n" 734 "#define LEFT 1u\n" 735 "#define RIGHT 2u\n" 736 "#define BDATA true\n" 737 "#define REFERENCE 2u\n", 738 s_fragment_shader_body } }, 739 { { s_shader_version, "", s_vertex_shader_body }, 740 { s_shader_version, "#define TTYPE mediump int\n" 741 "#define BTYPE bool\n" 742 "#define LEFT -1\n" 743 "#define RIGHT -2\n" 744 "#define BDATA true\n" 745 "#define REFERENCE -2\n", 746 s_fragment_shader_body } }, 747 { { s_shader_version, "", s_vertex_shader_body }, 748 { s_shader_version, "#define TTYPE mediump uint\n" 749 "#define BTYPE bool\n" 750 "#define LEFT 1u\n" 751 "#define RIGHT 2u\n" 752 "#define BDATA true\n" 753 "#define REFERENCE 2u\n", 754 s_fragment_shader_body } }, 755 { { s_shader_version, "", s_vertex_shader_body }, 756 { s_shader_version, "#define TTYPE lowp int\n" 757 "#define BTYPE bool\n" 758 "#define LEFT -1\n" 759 "#define RIGHT -2\n" 760 "#define BDATA true\n" 761 "#define REFERENCE -2\n", 762 s_fragment_shader_body } }, 763 { { s_shader_version, "", s_vertex_shader_body }, 764 { s_shader_version, "#define TTYPE lowp uint\n" 765 "#define BTYPE bool\n" 766 "#define LEFT 1u\n" 767 "#define RIGHT 2u\n" 768 "#define BDATA true\n" 769 "#define REFERENCE 2u\n", 770 s_fragment_shader_body } }, 771 { { s_shader_version, "", s_vertex_shader_body }, 772 { s_shader_version, "#define TTYPE bool\n" 773 "#define BTYPE bool\n" 774 "#define LEFT false\n" 775 "#define RIGHT true\n" 776 "#define BDATA true\n" 777 "#define REFERENCE true\n", 778 s_fragment_shader_body } }, 779 { { s_shader_version, "", s_vertex_shader_body }, 780 { s_shader_version, "#define TTYPE highp ivec2\n" 781 "#define BTYPE bvec2\n" 782 "#define LEFT ivec2(-1, -2)\n" 783 "#define RIGHT ivec2(-3, -4)\n" 784 "#define BDATA bvec2(true, false)\n" 785 "#define REFERENCE ivec2(-3, -2)\n", 786 s_fragment_shader_body } }, 787 { { s_shader_version, "", s_vertex_shader_body }, 788 { s_shader_version, "#define TTYPE highp uvec2\n" 789 "#define BTYPE bvec2\n" 790 "#define LEFT uvec2(1, 2)\n" 791 "#define RIGHT uvec2(3, 4)\n" 792 "#define BDATA bvec2(true, false)\n" 793 "#define REFERENCE uvec2(3, 2)\n", 794 s_fragment_shader_body } }, 795 { { s_shader_version, "", s_vertex_shader_body }, 796 { s_shader_version, "#define TTYPE mediump ivec2\n" 797 "#define BTYPE bvec2\n" 798 "#define LEFT ivec2(-1, -2)\n" 799 "#define RIGHT ivec2(-3, -4)\n" 800 "#define BDATA bvec2(true, false)\n" 801 "#define REFERENCE ivec2(-3, -2)\n", 802 s_fragment_shader_body } }, 803 { { s_shader_version, "", s_vertex_shader_body }, 804 { s_shader_version, "#define TTYPE mediump uvec2\n" 805 "#define BTYPE bvec2\n" 806 "#define LEFT uvec2(1, 2)\n" 807 "#define RIGHT uvec2(3, 4)\n" 808 "#define BDATA bvec2(true, false)\n" 809 "#define REFERENCE uvec2(3, 2)\n", 810 s_fragment_shader_body } }, 811 { { s_shader_version, "", s_vertex_shader_body }, 812 { s_shader_version, "#define TTYPE lowp ivec2\n" 813 "#define BTYPE bvec2\n" 814 "#define LEFT ivec2(-1, -2)\n" 815 "#define RIGHT ivec2(-3, -4)\n" 816 "#define BDATA bvec2(true, false)\n" 817 "#define REFERENCE ivec2(-3, -2)\n", 818 s_fragment_shader_body } }, 819 { { s_shader_version, "", s_vertex_shader_body }, 820 { s_shader_version, "#define TTYPE lowp uvec2\n" 821 "#define BTYPE bvec2\n" 822 "#define LEFT uvec2(1, 2)\n" 823 "#define RIGHT uvec2(3, 4)\n" 824 "#define BDATA bvec2(true, false)\n" 825 "#define REFERENCE uvec2(3, 2)\n", 826 s_fragment_shader_body } }, 827 { { s_shader_version, "", s_vertex_shader_body }, 828 { s_shader_version, "#define TTYPE bvec2\n" 829 "#define BTYPE bvec2\n" 830 "#define LEFT bvec2(true, true)\n" 831 "#define RIGHT bvec2(false, false)\n" 832 "#define BDATA bvec2(true, false)\n" 833 "#define REFERENCE bvec2(false, true)\n", 834 s_fragment_shader_body } }, 835 { { s_shader_version, "", s_vertex_shader_body }, 836 { s_shader_version, "#define TTYPE highp ivec3\n" 837 "#define BTYPE bvec3\n" 838 "#define LEFT ivec3(-1, -2, -3)\n" 839 "#define RIGHT ivec3(-4, -5, -6)\n" 840 "#define BDATA bvec3(true, false, true)\n" 841 "#define REFERENCE ivec3(-4, -2, -6)\n", 842 s_fragment_shader_body } }, 843 { { s_shader_version, "", s_vertex_shader_body }, 844 { s_shader_version, "#define TTYPE highp uvec3\n" 845 "#define BTYPE bvec3\n" 846 "#define LEFT uvec3(1, 2, 3)\n" 847 "#define RIGHT uvec3(4, 5, 6)\n" 848 "#define BDATA bvec3(true, false, true)\n" 849 "#define REFERENCE uvec3(4, 2, 6)\n", 850 s_fragment_shader_body } }, 851 { { s_shader_version, "", s_vertex_shader_body }, 852 { s_shader_version, "#define TTYPE mediump ivec3\n" 853 "#define BTYPE bvec3\n" 854 "#define LEFT ivec3(-1, -2, -3)\n" 855 "#define RIGHT ivec3(-4, -5, -6)\n" 856 "#define BDATA bvec3(true, false, true)\n" 857 "#define REFERENCE ivec3(-4, -2, -6)\n", 858 s_fragment_shader_body } }, 859 { { s_shader_version, "", s_vertex_shader_body }, 860 { s_shader_version, "#define TTYPE mediump uvec3\n" 861 "#define BTYPE bvec3\n" 862 "#define LEFT uvec3(1, 2, 3)\n" 863 "#define RIGHT uvec3(4, 5, 6)\n" 864 "#define BDATA bvec3(true, false, true)\n" 865 "#define REFERENCE uvec3(4, 2, 6)\n", 866 s_fragment_shader_body } }, 867 { { s_shader_version, "", s_vertex_shader_body }, 868 { s_shader_version, "#define TTYPE lowp ivec3\n" 869 "#define BTYPE bvec3\n" 870 "#define LEFT ivec3(-1, -2, -3)\n" 871 "#define RIGHT ivec3(-4, -5, -6)\n" 872 "#define BDATA bvec3(true, false, true)\n" 873 "#define REFERENCE ivec3(-4, -2, -6)\n", 874 s_fragment_shader_body } }, 875 { { s_shader_version, "", s_vertex_shader_body }, 876 { s_shader_version, "#define TTYPE lowp uvec3\n" 877 "#define BTYPE bvec3\n" 878 "#define LEFT uvec3(1, 2, 3)\n" 879 "#define RIGHT uvec3(4, 5, 6)\n" 880 "#define BDATA bvec3(true, false, true)\n" 881 "#define REFERENCE uvec3(4, 2, 6)\n", 882 s_fragment_shader_body } }, 883 { { s_shader_version, "", s_vertex_shader_body }, 884 { s_shader_version, "#define TTYPE bvec3\n" 885 "#define BTYPE bvec3\n" 886 "#define LEFT bvec3(true, true, true)\n" 887 "#define RIGHT bvec3(false, false, false)\n" 888 "#define BDATA bvec3(true, false, true)\n" 889 "#define REFERENCE bvec3(false, true, false)\n", 890 s_fragment_shader_body } }, 891 { { s_shader_version, "", s_vertex_shader_body }, 892 { s_shader_version, "#define TTYPE highp ivec4\n" 893 "#define BTYPE bvec4\n" 894 "#define LEFT ivec4(-1, -2, -3, -4)\n" 895 "#define RIGHT ivec4(-5, -6, -7, -8)\n" 896 "#define BDATA bvec4(true, false, true, false)\n" 897 "#define REFERENCE ivec4(-5, -2, -7, -4)\n", 898 s_fragment_shader_body } }, 899 { { s_shader_version, "", s_vertex_shader_body }, 900 { s_shader_version, "#define TTYPE highp uvec4\n" 901 "#define BTYPE bvec4\n" 902 "#define LEFT uvec4(1, 2, 3, 4)\n" 903 "#define RIGHT uvec4(5, 6, 7, 8)\n" 904 "#define BDATA bvec4(true, false, true, false)\n" 905 "#define REFERENCE uvec4(5, 2, 7, 4)\n", 906 s_fragment_shader_body } }, 907 { { s_shader_version, "", s_vertex_shader_body }, 908 { s_shader_version, "#define TTYPE mediump ivec4\n" 909 "#define BTYPE bvec4\n" 910 "#define LEFT ivec4(-1, -2, -3, -4)\n" 911 "#define RIGHT ivec4(-5, -6, -7, -8)\n" 912 "#define BDATA bvec4(true, false, true, false)\n" 913 "#define REFERENCE ivec4(-5, -2, -7, -4)\n", 914 s_fragment_shader_body } }, 915 { { s_shader_version, "", s_vertex_shader_body }, 916 { s_shader_version, "#define TTYPE mediump uvec4\n" 917 "#define BTYPE bvec4\n" 918 "#define LEFT uvec4(1, 2, 3, 4)\n" 919 "#define RIGHT uvec4(5, 6, 7, 8)\n" 920 "#define BDATA bvec4(true, false, true, false)\n" 921 "#define REFERENCE uvec4(5, 2, 7, 4)\n", 922 s_fragment_shader_body } }, 923 { { s_shader_version, "", s_vertex_shader_body }, 924 { s_shader_version, "#define TTYPE lowp ivec4\n" 925 "#define BTYPE bvec4\n" 926 "#define LEFT ivec4(-1, -2, -3, -4)\n" 927 "#define RIGHT ivec4(-5, -6, -7, -8)\n" 928 "#define BDATA bvec4(true, false, true, false)\n" 929 "#define REFERENCE ivec4(-5, -2, -7, -4)\n", 930 s_fragment_shader_body } }, 931 { { s_shader_version, "", s_vertex_shader_body }, 932 { s_shader_version, "#define TTYPE lowp uvec4\n" 933 "#define BTYPE bvec4\n" 934 "#define LEFT uvec4(1, 2, 3, 4)\n" 935 "#define RIGHT uvec4(5, 6, 7, 8)\n" 936 "#define BDATA bvec4(true, false, true, false)\n" 937 "#define REFERENCE uvec4(5, 2, 7, 4)\n", 938 s_fragment_shader_body } }, 939 { { s_shader_version, "", s_vertex_shader_body }, 940 { s_shader_version, "#define TTYPE bvec4\n" 941 "#define BTYPE bvec4\n" 942 "#define LEFT bvec4(true, true, true, true)\n" 943 "#define RIGHT bvec4(false, false, false, false)\n" 944 "#define BDATA bvec4(true, false, true, false)\n" 945 "#define REFERENCE bvec4(false, true, false, true)\n", 946 s_fragment_shader_body } } 947 }; 948 949 const glw::GLsizei gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_shaders_count = 950 sizeof(s_shaders) / sizeof(s_shaders[0]); 951