| /*------------------------------------------------------------------------- |
| * OpenGL Conformance Test Suite |
| * ----------------------------- |
| * |
| * Copyright (c) 2015-2016 The Khronos Group Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ /*! |
| * \file |
| * \brief |
| */ /*-------------------------------------------------------------------*/ |
| |
| /* Includes. */ |
| #include "gl4cES31CompatibilityTests.hpp" |
| #include "gluContextInfo.hpp" |
| #include "gluDefs.hpp" |
| #include "gluRenderContext.hpp" |
| #include "gluStrUtil.hpp" |
| #include "tcuTestLog.hpp" |
| |
| /******************************** Test Group Implementation ********************************/ |
| |
| /** @brief ES3.1 Compatibility tests group constructor. |
| * |
| * @param [in] context OpenGL context. |
| */ |
| gl4cts::es31compatibility::Tests::Tests(deqp::Context &context) |
| : TestCaseGroup(context, "es_31_compatibility", "ES3.1 Compatibility Test Suite") |
| { |
| /* Intentionally left blank */ |
| } |
| |
| /** @brief ES3.1 Compatibility Tests initializer. */ |
| void gl4cts::es31compatibility::Tests::init() |
| { |
| /* New tests. */ |
| addChild(new gl4cts::es31compatibility::ShaderCompilationCompatibilityTests(m_context)); |
| addChild(new gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest(m_context)); |
| |
| /* Ported tests. */ |
| addChild(new gl4cts::es31compatibility::SampleVariablesTests(m_context, glu::GLSL_VERSION_310_ES)); |
| addChild(new gl4cts::es31compatibility::ShaderImageLoadStoreTests(m_context)); |
| addChild(new gl4cts::es31compatibility::ShaderStorageBufferObjectTests(m_context)); |
| } |
| |
| /******************************** Shader Compilation Compatibility Tests Implementation ********************************/ |
| |
| /** @brief ShaderCompilationCompatibilityTests constructor. |
| * |
| * @param [in] context OpenGL context. |
| */ |
| gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::ShaderCompilationCompatibilityTests( |
| deqp::Context &context) |
| : deqp::TestCase(context, "shader_compilation", "Shader Compilation Compatibility Test") |
| { |
| } |
| |
| /** @brief ShaderCompilationCompatibilityTests test cases iterations. |
| */ |
| tcu::TestNode::IterateResult gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::iterate() |
| { |
| /* Shortcut for GL functionality. */ |
| const glw::Functions &gl = m_context.getRenderContext().getFunctions(); |
| |
| /* OpenGL support query. */ |
| bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5))); |
| bool is_arb_es31_compatibility = m_context.getContextInfo().isExtensionSupported("GL_ARB_ES3_1_compatibility"); |
| |
| /* Running tests. */ |
| bool is_ok = true; |
| bool is_error = false; |
| |
| glw::GLuint shader = 0; |
| |
| /* Test */ |
| try |
| { |
| if (is_at_least_gl_45 || is_arb_es31_compatibility) |
| { |
| for (glw::GLsizei i = 0; i < s_shaders_count; ++i) |
| { |
| /* Shader compilation. */ |
| shader = gl.createShader(s_shaders[i].type); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed."); |
| |
| if (0 == shader) |
| { |
| throw 0; |
| } |
| |
| gl.shaderSource(shader, 1, &(s_shaders[i].source), NULL); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed."); |
| |
| gl.compileShader(shader); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed."); |
| |
| /* Checking for errors. */ |
| glw::GLint status = GL_FALSE; |
| |
| gl.getShaderiv(shader, GL_COMPILE_STATUS, &status); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed."); |
| |
| if (GL_FALSE == status) |
| { |
| /* Setup result. */ |
| is_ok = false; |
| |
| /* Getting compilation informations. */ |
| glw::GLint log_size = 0; |
| |
| gl.getShaderiv(shader, GL_INFO_LOG_LENGTH, &log_size); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv() call failed."); |
| |
| if (log_size) |
| { |
| glw::GLchar *log = new glw::GLchar[log_size]; |
| |
| if (log) |
| { |
| memset(log, 0, log_size); |
| |
| gl.getShaderInfoLog(shader, log_size, DE_NULL, log); |
| |
| /* Logging. */ |
| m_context.getTestContext().getLog() |
| << tcu::TestLog::Message << "Compilation of " << s_shaders[i].type_name |
| << " shader have failed.\n Shader source was:\n" |
| << s_shaders[i].source << "\nCompillation log:\n" |
| << log << tcu::TestLog::EndMessage; |
| |
| delete[] log; |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog() call failed."); |
| } |
| } |
| } |
| |
| /* Cleanup. */ |
| gl.deleteShader(shader); |
| |
| shader = 0; |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteShader call failed."); |
| } |
| } |
| } |
| catch (...) |
| { |
| is_ok = false; |
| is_error = true; |
| } |
| |
| /* Cleanup. */ |
| if (0 != shader) |
| { |
| gl.deleteShader(shader); |
| |
| shader = 0; |
| } |
| |
| /* Result's setup and logging. */ |
| if (is_ok) |
| { |
| m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); |
| } |
| else |
| { |
| if (is_error) |
| { |
| m_context.getTestContext().getLog() |
| << tcu::TestLog::Message << "Internal error has occured during the Shader Version Test." |
| << tcu::TestLog::EndMessage; |
| |
| m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Test error."); |
| } |
| else |
| { |
| m_context.getTestContext().getLog() |
| << tcu::TestLog::Message << "The Shader Version Test has failed." << tcu::TestLog::EndMessage; |
| |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); |
| } |
| } |
| |
| return STOP; |
| } |
| |
| const gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::TestShader |
| gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::s_shaders[] = { |
| {/* Shader for testing ES 3.1 version string support.*/ |
| GL_VERTEX_SHADER, "vertex", |
| "#version 310 es\n" |
| "\n" |
| "void main()\n" |
| "{\n" |
| " gl_Position = vec4(1.0);\n" |
| "}\n"}, |
| {/* Shader for testing ES 3.1 version string support.*/ |
| GL_FRAGMENT_SHADER, "fragment", |
| "#version 310 es\n" |
| "\n" |
| "out highp vec4 color;" |
| "\n" |
| "void main()\n" |
| "{\n" |
| " color = vec4(1.0);\n" |
| "}\n"}, |
| {/* Shader for testing that gl_HelperInvocation variable is supported.*/ |
| GL_FRAGMENT_SHADER, "fragment", |
| "#version 310 es\n" |
| "\n" |
| "out highp vec4 color;" |
| "\n" |
| "void main()\n" |
| "{\n" |
| " if(gl_HelperInvocation)\n" |
| " {\n" |
| " color = vec4(1.0);\n" |
| " }\n" |
| " else\n" |
| " {\n" |
| " color = vec4(0.0);\n" |
| " }\n" |
| "}\n"}, |
| {/* Shader for testing ES 3.1 version string support.*/ |
| GL_COMPUTE_SHADER, "compute", |
| "#version 310 es\n" |
| "\n" |
| "layout(local_size_x = 128) in;\n" |
| "layout(std140, binding = 0) buffer Output\n" |
| "{\n" |
| " uint elements[];\n" |
| "} output_data;\n" |
| "\n" |
| "void main()\n" |
| "{\n" |
| " output_data.elements[gl_GlobalInvocationID.x] = gl_GlobalInvocationID.x * gl_GlobalInvocationID.x;\n" |
| "}\n"}}; |
| |
| const glw::GLsizei gl4cts::es31compatibility::ShaderCompilationCompatibilityTests::s_shaders_count = |
| sizeof(s_shaders) / sizeof(s_shaders[0]); |
| |
| /******************************** Shader Functional Compatibility Test Implementation ********************************/ |
| |
| /** @brief Shader Functional Compatibility Test constructor. |
| * |
| * @param [in] context OpenGL context. |
| */ |
| gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::ShaderFunctionalCompatibilityTest(deqp::Context &context) |
| : deqp::TestCase(context, "shader_functional", "Shader Functional Compatibility Test") |
| , m_po_id(0) |
| , m_fbo_id(0) |
| , m_rbo_id(0) |
| , m_vao_id(0) |
| { |
| } |
| |
| /** @brief ShaderCompilationCompatibilityTests test cases iterations. |
| */ |
| tcu::TestNode::IterateResult gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::iterate() |
| { |
| /* OpenGL support query. */ |
| bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5))); |
| bool is_arb_es31_compatibility = m_context.getContextInfo().isExtensionSupported("GL_ARB_ES3_1_compatibility"); |
| |
| /* Running tests. */ |
| bool is_ok = true; |
| bool is_error = false; |
| |
| /* Test */ |
| try |
| { |
| if (is_at_least_gl_45 || is_arb_es31_compatibility) |
| { |
| createFramebufferAndVertexArrayObject(); |
| |
| for (glw::GLsizei i = 0; i < s_shaders_count; ++i) |
| { |
| if (!createProgram(s_shaders[i])) |
| { |
| is_ok = false; |
| |
| continue; /* if createProgram failed we shall omit this iteration */ |
| } |
| |
| is_ok &= test(); |
| |
| cleanProgram(); |
| } |
| |
| cleanFramebufferAndVertexArrayObject(); |
| } |
| } |
| catch (...) |
| { |
| /* Result setup. */ |
| is_ok = false; |
| is_error = true; |
| |
| /* Cleanup. */ |
| cleanProgram(); |
| cleanFramebufferAndVertexArrayObject(); |
| } |
| |
| /* Result's setup. */ |
| if (is_ok) |
| { |
| m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); |
| } |
| else |
| { |
| if (is_error) |
| { |
| m_context.getTestContext().getLog() |
| << tcu::TestLog::Message << "Internal error has occured during the Shader Version Test." |
| << tcu::TestLog::EndMessage; |
| |
| m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Test error."); |
| } |
| else |
| { |
| m_context.getTestContext().getLog() |
| << tcu::TestLog::Message << "The Shader Version Test has failed." << tcu::TestLog::EndMessage; |
| |
| m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); |
| } |
| } |
| |
| return STOP; |
| } |
| |
| /** @brief Create program object |
| * |
| * @note Program object is going to be stored into m_po_id. |
| * If building succeeded program will be set current (glUseProgram). |
| * |
| * @param [in] shader_source Shader source to be builded. |
| * |
| * @return True if succeeded, false otherwise. |
| */ |
| bool gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::createProgram(const struct Shader shader_source) |
| { |
| /* Shortcut for GL functionality. */ |
| const glw::Functions &gl = m_context.getRenderContext().getFunctions(); |
| |
| struct _Shader |
| { |
| const glw::GLchar *const *source; |
| const glw::GLenum type; |
| glw::GLuint id; |
| } shader[] = {{shader_source.vertex, GL_VERTEX_SHADER, 0}, {shader_source.fragment, GL_FRAGMENT_SHADER, 0}}; |
| |
| glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]); |
| |
| try |
| { |
| /* Make sure m_po_id is cleaned. */ |
| if (m_po_id) |
| { |
| cleanProgram(); |
| } |
| |
| /* Create program. */ |
| m_po_id = gl.createProgram(); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram call failed."); |
| |
| /* Shader compilation. */ |
| |
| for (glw::GLuint i = 0; i < shader_count; ++i) |
| { |
| if (DE_NULL != shader[i].source) |
| { |
| shader[i].id = gl.createShader(shader[i].type); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed."); |
| |
| gl.attachShader(m_po_id, shader[i].id); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader call failed."); |
| |
| gl.shaderSource(shader[i].id, 3, shader[i].source, NULL); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed."); |
| |
| gl.compileShader(shader[i].id); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed."); |
| |
| glw::GLint status = GL_FALSE; |
| |
| gl.getShaderiv(shader[i].id, GL_COMPILE_STATUS, &status); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed."); |
| |
| if (GL_FALSE == status) |
| { |
| glw::GLint log_size = 0; |
| |
| gl.getShaderiv(shader[i].id, GL_INFO_LOG_LENGTH, &log_size); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv() call failed."); |
| |
| if (log_size) |
| { |
| glw::GLchar *log = new glw::GLchar[log_size]; |
| |
| if (log) |
| { |
| memset(log, 0, log_size); |
| |
| gl.getShaderInfoLog(shader[i].id, log_size, DE_NULL, log); |
| |
| m_context.getTestContext().getLog() |
| << tcu::TestLog::Message << "Compilation of shader has failed.\nShader source:\n" |
| << shader[i].source[0] << shader[i].source[1] << shader[i].source[2] |
| << "\nCompillation log:\n" |
| << log << tcu::TestLog::EndMessage; |
| |
| delete[] log; |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog() call failed."); |
| } |
| } |
| |
| throw 0; |
| } |
| } |
| } |
| |
| /* Link. */ |
| gl.linkProgram(m_po_id); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram call failed."); |
| |
| glw::GLint status = GL_FALSE; |
| |
| gl.getProgramiv(m_po_id, GL_LINK_STATUS, &status); |
| |
| if (GL_TRUE == status) |
| { |
| for (glw::GLuint i = 0; i < shader_count; ++i) |
| { |
| if (shader[i].id) |
| { |
| gl.detachShader(m_po_id, shader[i].id); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader call failed."); |
| } |
| } |
| } |
| else |
| { |
| glw::GLint log_size = 0; |
| |
| gl.getProgramiv(m_po_id, GL_INFO_LOG_LENGTH, &log_size); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() call failed."); |
| |
| if (log_size) |
| { |
| glw::GLchar *log = new glw::GLchar[log_size]; |
| |
| if (log) |
| { |
| memset(log, 0, log_size); |
| |
| gl.getProgramInfoLog(m_po_id, log_size, DE_NULL, log); |
| |
| m_context.getTestContext().getLog() |
| << tcu::TestLog::Message << "Linkage of shader program has failed.\nLinkage log:\n" |
| << log << tcu::TestLog::EndMessage; |
| |
| delete[] log; |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog() call failed."); |
| } |
| } |
| |
| throw 0; |
| } |
| } |
| catch (...) |
| { |
| if (m_po_id) |
| { |
| gl.deleteProgram(m_po_id); |
| |
| m_po_id = 0; |
| } |
| } |
| |
| for (glw::GLuint i = 0; i < shader_count; ++i) |
| { |
| if (0 != shader[i].id) |
| { |
| gl.deleteShader(shader[i].id); |
| |
| shader[i].id = 0; |
| } |
| } |
| |
| if (m_po_id) |
| { |
| gl.useProgram(m_po_id); |
| |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed."); |
| |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** @brief Create framebuffer and vertex array object. |
| * |
| * @note Frembuffer will be stored in m_fbo_id and m_rbo_id. |
| * Vertex array object will be stored in m_vao_id. |
| * Function will throw 0 if erro has occured. |
| */ |
| void gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::createFramebufferAndVertexArrayObject() |
| { |
| /* Shortcut for GL functionality. */ |
| const glw::Functions &gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Prepare framebuffer. */ |
| gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor call failed."); |
| |
| gl.genFramebuffers(1, &m_fbo_id); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers call failed."); |
| |
| gl.genRenderbuffers(1, &m_rbo_id); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGenRenderbuffers call failed."); |
| |
| gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo_id); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer call failed."); |
| |
| gl.bindRenderbuffer(GL_RENDERBUFFER, m_rbo_id); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer call failed."); |
| |
| gl.renderbufferStorage(GL_RENDERBUFFER, GL_R8, 1 /* x size */, 1 /* y size */); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glRenderbufferStorage call failed."); |
| |
| gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rbo_id); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferRenderbuffer call failed."); |
| |
| /* Check if all went ok. */ |
| if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) |
| { |
| throw 0; |
| } |
| |
| /* View Setup. */ |
| gl.viewport(0, 0, 1 /* x size */, 1 /* y size */); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport call failed."); |
| |
| /* Create and bind empty vertex array object. */ |
| gl.genVertexArrays(1, &m_vao_id); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() call failed."); |
| |
| if (0 == m_vao_id) |
| { |
| throw 0; |
| } |
| |
| gl.bindVertexArray(m_vao_id); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() call failed."); |
| } |
| |
| /** @brief Run test case. |
| * |
| * @note Test case run in following order: |
| * * clear screen with 0 value (color setup in createFramebufferAndVertexArrayObject); |
| * * draw full screen quad; |
| * * fetch pixel from screen using glReadPixel (view is 1x1 pixel in size); |
| * * compare results (1.0f is expected as the result of the shader). |
| */ |
| bool gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::test() |
| { |
| /* Shortcut for GL functionality. */ |
| const glw::Functions &gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Make sure objects are cleaned. */ |
| if (m_fbo_id || m_rbo_id || m_vao_id) |
| { |
| cleanFramebufferAndVertexArrayObject(); |
| } |
| |
| /* Drawing quad which shall output result. */ |
| gl.clear(GL_COLOR_BUFFER_BIT); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glClear() call failed."); |
| |
| gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() call failed."); |
| |
| /* Fetching result. */ |
| glw::GLfloat red = -1.f; |
| |
| gl.readPixels(0, 0, 1, 1, GL_RED, GL_FLOAT, &red); |
| GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() call failed."); |
| |
| if (de::abs(1.f - red) <= 0.125 /* Precision. */) |
| { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** @brief Release program object. |
| */ |
| void gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::cleanProgram() |
| { |
| /* Shortcut for GL functionality. */ |
| const glw::Functions &gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Deleting program. */ |
| if (m_po_id) |
| { |
| gl.useProgram(0); |
| |
| gl.deleteProgram(m_po_id); |
| |
| m_po_id = 0; |
| } |
| } |
| |
| /** @brief Release framebuffer, renderbuffer and vertex array objects. |
| */ |
| void gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::cleanFramebufferAndVertexArrayObject() |
| { |
| /* Shortcut for GL functionality. */ |
| const glw::Functions &gl = m_context.getRenderContext().getFunctions(); |
| |
| /* Deleting view. */ |
| if (m_fbo_id) |
| { |
| gl.deleteFramebuffers(1, &m_fbo_id); |
| |
| m_fbo_id = 0; |
| } |
| |
| if (m_rbo_id) |
| { |
| gl.deleteRenderbuffers(1, &m_rbo_id); |
| |
| m_rbo_id = 0; |
| } |
| |
| if (m_vao_id) |
| { |
| gl.deleteVertexArrays(1, &m_vao_id); |
| |
| m_vao_id = 0; |
| } |
| } |
| |
| const glw::GLchar *gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_shader_version = "#version 310 es\n"; |
| |
| const glw::GLchar *gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_vertex_shader_body = |
| "\n" |
| "out highp float dummy;\n" |
| "\n" |
| "void main()\n" |
| "{\n" |
| " switch(gl_VertexID % 4)\n" |
| " {\n" |
| " case 0:\n" |
| " gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);\n" |
| " break;\n" |
| " case 1:\n" |
| " gl_Position = vec4( 1.0, -1.0, 0.0, 1.0);\n" |
| " break;\n" |
| " case 2:\n" |
| " gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);\n" |
| " break;\n" |
| " case 3:\n" |
| " gl_Position = vec4( 1.0, 1.0, 0.0, 1.0);\n" |
| " break;\n" |
| " }\n" |
| "\n" |
| " dummy = float(gl_VertexID % 4);\n /* Always less than 4. */" |
| "}\n"; |
| |
| const glw::GLchar *gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_fragment_shader_body = |
| "\n" |
| "in highp float dummy;\n" |
| "\n" |
| "out highp vec4 result;\n" |
| "\n" |
| "void main()\n" |
| "{\n" |
| " TTYPE a = LEFT;\n" |
| " TTYPE b = RIGHT;\n" |
| " BTYPE c = BDATA && BTYPE(dummy < 4.0);\n /* Making sure that expression is not compile time constant. */" |
| "\n" |
| " TTYPE mixed = mix(a, b, c);\n" |
| "\n" |
| " if(REFERENCE == mixed)\n" |
| " {\n" |
| " result = vec4(1.0);\n" |
| " }\n" |
| " else\n" |
| " {\n" |
| " result = vec4(0.0);\n" |
| " }\n" |
| "}\n"; |
| |
| const struct gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::Shader |
| gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_shaders[] = { |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE highp int\n" |
| "#define BTYPE bool\n" |
| "#define LEFT -1\n" |
| "#define RIGHT -2\n" |
| "#define BDATA true\n" |
| "#define REFERENCE -2\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE highp uint\n" |
| "#define BTYPE bool\n" |
| "#define LEFT 1u\n" |
| "#define RIGHT 2u\n" |
| "#define BDATA true\n" |
| "#define REFERENCE 2u\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE mediump int\n" |
| "#define BTYPE bool\n" |
| "#define LEFT -1\n" |
| "#define RIGHT -2\n" |
| "#define BDATA true\n" |
| "#define REFERENCE -2\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE mediump uint\n" |
| "#define BTYPE bool\n" |
| "#define LEFT 1u\n" |
| "#define RIGHT 2u\n" |
| "#define BDATA true\n" |
| "#define REFERENCE 2u\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE lowp int\n" |
| "#define BTYPE bool\n" |
| "#define LEFT -1\n" |
| "#define RIGHT -2\n" |
| "#define BDATA true\n" |
| "#define REFERENCE -2\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE lowp uint\n" |
| "#define BTYPE bool\n" |
| "#define LEFT 1u\n" |
| "#define RIGHT 2u\n" |
| "#define BDATA true\n" |
| "#define REFERENCE 2u\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE bool\n" |
| "#define BTYPE bool\n" |
| "#define LEFT false\n" |
| "#define RIGHT true\n" |
| "#define BDATA true\n" |
| "#define REFERENCE true\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE highp ivec2\n" |
| "#define BTYPE bvec2\n" |
| "#define LEFT ivec2(-1, -2)\n" |
| "#define RIGHT ivec2(-3, -4)\n" |
| "#define BDATA bvec2(true, false)\n" |
| "#define REFERENCE ivec2(-3, -2)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE highp uvec2\n" |
| "#define BTYPE bvec2\n" |
| "#define LEFT uvec2(1, 2)\n" |
| "#define RIGHT uvec2(3, 4)\n" |
| "#define BDATA bvec2(true, false)\n" |
| "#define REFERENCE uvec2(3, 2)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE mediump ivec2\n" |
| "#define BTYPE bvec2\n" |
| "#define LEFT ivec2(-1, -2)\n" |
| "#define RIGHT ivec2(-3, -4)\n" |
| "#define BDATA bvec2(true, false)\n" |
| "#define REFERENCE ivec2(-3, -2)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE mediump uvec2\n" |
| "#define BTYPE bvec2\n" |
| "#define LEFT uvec2(1, 2)\n" |
| "#define RIGHT uvec2(3, 4)\n" |
| "#define BDATA bvec2(true, false)\n" |
| "#define REFERENCE uvec2(3, 2)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE lowp ivec2\n" |
| "#define BTYPE bvec2\n" |
| "#define LEFT ivec2(-1, -2)\n" |
| "#define RIGHT ivec2(-3, -4)\n" |
| "#define BDATA bvec2(true, false)\n" |
| "#define REFERENCE ivec2(-3, -2)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE lowp uvec2\n" |
| "#define BTYPE bvec2\n" |
| "#define LEFT uvec2(1, 2)\n" |
| "#define RIGHT uvec2(3, 4)\n" |
| "#define BDATA bvec2(true, false)\n" |
| "#define REFERENCE uvec2(3, 2)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE bvec2\n" |
| "#define BTYPE bvec2\n" |
| "#define LEFT bvec2(true, true)\n" |
| "#define RIGHT bvec2(false, false)\n" |
| "#define BDATA bvec2(true, false)\n" |
| "#define REFERENCE bvec2(false, true)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE highp ivec3\n" |
| "#define BTYPE bvec3\n" |
| "#define LEFT ivec3(-1, -2, -3)\n" |
| "#define RIGHT ivec3(-4, -5, -6)\n" |
| "#define BDATA bvec3(true, false, true)\n" |
| "#define REFERENCE ivec3(-4, -2, -6)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE highp uvec3\n" |
| "#define BTYPE bvec3\n" |
| "#define LEFT uvec3(1, 2, 3)\n" |
| "#define RIGHT uvec3(4, 5, 6)\n" |
| "#define BDATA bvec3(true, false, true)\n" |
| "#define REFERENCE uvec3(4, 2, 6)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE mediump ivec3\n" |
| "#define BTYPE bvec3\n" |
| "#define LEFT ivec3(-1, -2, -3)\n" |
| "#define RIGHT ivec3(-4, -5, -6)\n" |
| "#define BDATA bvec3(true, false, true)\n" |
| "#define REFERENCE ivec3(-4, -2, -6)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE mediump uvec3\n" |
| "#define BTYPE bvec3\n" |
| "#define LEFT uvec3(1, 2, 3)\n" |
| "#define RIGHT uvec3(4, 5, 6)\n" |
| "#define BDATA bvec3(true, false, true)\n" |
| "#define REFERENCE uvec3(4, 2, 6)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE lowp ivec3\n" |
| "#define BTYPE bvec3\n" |
| "#define LEFT ivec3(-1, -2, -3)\n" |
| "#define RIGHT ivec3(-4, -5, -6)\n" |
| "#define BDATA bvec3(true, false, true)\n" |
| "#define REFERENCE ivec3(-4, -2, -6)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE lowp uvec3\n" |
| "#define BTYPE bvec3\n" |
| "#define LEFT uvec3(1, 2, 3)\n" |
| "#define RIGHT uvec3(4, 5, 6)\n" |
| "#define BDATA bvec3(true, false, true)\n" |
| "#define REFERENCE uvec3(4, 2, 6)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE bvec3\n" |
| "#define BTYPE bvec3\n" |
| "#define LEFT bvec3(true, true, true)\n" |
| "#define RIGHT bvec3(false, false, false)\n" |
| "#define BDATA bvec3(true, false, true)\n" |
| "#define REFERENCE bvec3(false, true, false)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE highp ivec4\n" |
| "#define BTYPE bvec4\n" |
| "#define LEFT ivec4(-1, -2, -3, -4)\n" |
| "#define RIGHT ivec4(-5, -6, -7, -8)\n" |
| "#define BDATA bvec4(true, false, true, false)\n" |
| "#define REFERENCE ivec4(-5, -2, -7, -4)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE highp uvec4\n" |
| "#define BTYPE bvec4\n" |
| "#define LEFT uvec4(1, 2, 3, 4)\n" |
| "#define RIGHT uvec4(5, 6, 7, 8)\n" |
| "#define BDATA bvec4(true, false, true, false)\n" |
| "#define REFERENCE uvec4(5, 2, 7, 4)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE mediump ivec4\n" |
| "#define BTYPE bvec4\n" |
| "#define LEFT ivec4(-1, -2, -3, -4)\n" |
| "#define RIGHT ivec4(-5, -6, -7, -8)\n" |
| "#define BDATA bvec4(true, false, true, false)\n" |
| "#define REFERENCE ivec4(-5, -2, -7, -4)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE mediump uvec4\n" |
| "#define BTYPE bvec4\n" |
| "#define LEFT uvec4(1, 2, 3, 4)\n" |
| "#define RIGHT uvec4(5, 6, 7, 8)\n" |
| "#define BDATA bvec4(true, false, true, false)\n" |
| "#define REFERENCE uvec4(5, 2, 7, 4)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE lowp ivec4\n" |
| "#define BTYPE bvec4\n" |
| "#define LEFT ivec4(-1, -2, -3, -4)\n" |
| "#define RIGHT ivec4(-5, -6, -7, -8)\n" |
| "#define BDATA bvec4(true, false, true, false)\n" |
| "#define REFERENCE ivec4(-5, -2, -7, -4)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE lowp uvec4\n" |
| "#define BTYPE bvec4\n" |
| "#define LEFT uvec4(1, 2, 3, 4)\n" |
| "#define RIGHT uvec4(5, 6, 7, 8)\n" |
| "#define BDATA bvec4(true, false, true, false)\n" |
| "#define REFERENCE uvec4(5, 2, 7, 4)\n", |
| s_fragment_shader_body}}, |
| {{s_shader_version, "", s_vertex_shader_body}, |
| {s_shader_version, |
| "#define TTYPE bvec4\n" |
| "#define BTYPE bvec4\n" |
| "#define LEFT bvec4(true, true, true, true)\n" |
| "#define RIGHT bvec4(false, false, false, false)\n" |
| "#define BDATA bvec4(true, false, true, false)\n" |
| "#define REFERENCE bvec4(false, true, false, true)\n", |
| s_fragment_shader_body}}}; |
| |
| const glw::GLsizei gl4cts::es31compatibility::ShaderFunctionalCompatibilityTest::s_shaders_count = |
| sizeof(s_shaders) / sizeof(s_shaders[0]); |