148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*------------------------------------------------------------------------- 248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite 348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ----------------------------- 448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2015-2016 The Khronos Group Inc. 648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License. 948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at 1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software 1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and 1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License. 1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*! 2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file 2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief 2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/ 2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Includes. */ 2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gl4cConditionalRenderInvertedTests.hpp" 2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluContextInfo.hpp" 2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDefs.hpp" 2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluRenderContext.hpp" 2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluStrUtil.hpp" 3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp" 3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/******************************** Test Group Implementation ********************************/ 3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Context Flush Control tests group constructor. 3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param [in] context OpenGL context. 3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::ConditionalRenderInverted::Tests::Tests(deqp::Context& context) 3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCaseGroup(context, "conditional_render_inverted", "Conditional Render Inverted Test Suite") 4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Intentionally left blank */ 4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Context Flush Control tests initializer. */ 4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::Tests::init() 4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new gl4cts::ConditionalRenderInverted::CoverageTest(m_context)); 4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new gl4cts::ConditionalRenderInverted::FunctionalTest(m_context)); 4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/******************************** Coverage Tests Implementation ********************************/ 5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief API coverage tests constructor. 5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param [in] context OpenGL context. 5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::ConditionalRenderInverted::CoverageTest::CoverageTest(deqp::Context& context) 5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : deqp::TestCase(context, "coverage", "Conditional Render Inverted Coverage Test"), m_qo_id(0) 5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Intentionally left blank. */ 6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Iterate API coverage tests. 6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Iteration result. 6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult gl4cts::ConditionalRenderInverted::CoverageTest::iterate() 6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* OpenGL support query. */ 7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5))); 7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_arb_conditional_render_inverted = 7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getContextInfo().isExtensionSupported("GL_ARB_conditional_render_inverted"); 7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Running tests. */ 7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_ok = true; 7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_error = false; 7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* This test should only be executed if we're running a GL4.5 context or related extension is available */ 7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (is_at_least_gl_45 || is_arb_conditional_render_inverted) 8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare common objects. */ 8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos createQueryObject(); 8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Test cases. */ 8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLenum modes[] = { GL_QUERY_WAIT_INVERTED, GL_QUERY_NO_WAIT_INVERTED, 8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_QUERY_BY_REGION_WAIT_INVERTED, 8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_QUERY_BY_REGION_NO_WAIT_INVERTED }; 9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLuint modes_count = sizeof(modes) / sizeof(modes[0]); 9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Iterate over the test cases. */ 9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (glw::GLuint i = 0; i < modes_count; ++i) 9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos is_ok &= test(modes[i]); 9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (...) 10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos is_ok = false; 10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos is_error = true; 10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Cleanup. */ 10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clean(); 10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Result's setup. */ 11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (is_ok) 11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (is_error) 11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "Internal error has occured during Conditional Render Inverted Coverage Test." 12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Test error."); 12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() << tcu::TestLog::Message 12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "The Conditional Render Inverted Coverage Test has failed." 12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return STOP; 13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Create query object. 13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::CoverageTest::createQueryObject() 14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Create valid query object. */ 14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genQueries(1, &m_qo_id); 14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries() call failed."); 14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.beginQuery(GL_SAMPLES_PASSED, m_qo_id); 15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginQuery() call failed."); 15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.endQuery(GL_SAMPLES_PASSED); 15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glEndQuery() call failed."); 15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Clean query object and error values. 15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::CoverageTest::clean() 15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean query object. */ 16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteQueries(1, &m_qo_id); 16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_qo_id = 0; 16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Make sure no errors are left. */ 16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos while (gl.getError()) 17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ; 17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Test that glBeginConditionalRender accept mode. 17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param [in] mode Render condition mode. 17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return True if glBeginConditionalRender did not generate an error, false otherwise. 17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::ConditionalRenderInverted::CoverageTest::test(glw::GLenum mode) 18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Default return value;*/ 18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_no_error = true; 18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Test. */ 18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.beginConditionalRender(m_qo_id, mode); 18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos while (GL_NO_ERROR != gl.getError()) 19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos is_no_error = false; 19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean up. */ 19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (is_no_error) 19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.endConditionalRender(); 19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glEndConditionalRender() call failed."); 20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Logging. */ 20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!is_no_error) 20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() << tcu::TestLog::Message 20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "glBeginConditionalRender failed when used with mode " 20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << Utilities::modeToChars(mode) << "." << tcu::TestLog::EndMessage; 20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Return test result. */ 21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return is_no_error; 21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/******************************** Functional Test Implementation ********************************/ 21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Functional test constructor. 21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param [in] context OpenGL context. 21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosgl4cts::ConditionalRenderInverted::FunctionalTest::FunctionalTest(deqp::Context& context) 22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : deqp::TestCase(context, "functional", "Conditional Render Inverted Functional Test") 22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_fbo_id(0) 22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_rbo_id(0) 22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_vao_id(0) 22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_po_id(0) 22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , m_qo_id(0) 22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Intentionally left blank. */ 22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Iterate Functional test cases. 23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Iteration result. 23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult gl4cts::ConditionalRenderInverted::FunctionalTest::iterate() 23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* OpenGL support query. */ 23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5))); 23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_arb_conditional_render_inverted = 24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getContextInfo().isExtensionSupported("GL_ARB_conditional_render_inverted"); 24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Running tests. */ 24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_ok = true; 24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool is_error = false; 24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* This test should only be executed if we're running a GL4.5 context or related extension is available */ 24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (is_at_least_gl_45 || is_arb_conditional_render_inverted) 25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Test cases. */ 25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const bool render_cases[] = { false, true }; 25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLuint render_cases_count = sizeof(render_cases) / sizeof(render_cases[0]); 25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLenum query_cases[] = { GL_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED }; 25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLuint query_cases_count = sizeof(query_cases) / sizeof(query_cases[0]); 25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLenum modes[] = { GL_QUERY_WAIT_INVERTED, GL_QUERY_NO_WAIT_INVERTED, 26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_QUERY_BY_REGION_WAIT_INVERTED, 26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GL_QUERY_BY_REGION_NO_WAIT_INVERTED }; 26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLuint modes_count = sizeof(modes) / sizeof(modes[0]); 26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Creating common objects. */ 26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos createProgram(); 26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos createView(); 26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos createVertexArrayObject(); 27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Iterating over test cases. */ 27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (glw::GLuint i = 0; i < render_cases_count; ++i) 27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (glw::GLuint j = 0; j < query_cases_count; ++j) 27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (glw::GLuint k = 0; k < modes_count; ++k) 27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos createQueryObject(); 27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos setupColor(1.f); 28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos setupPassSwitch(render_cases[i]); 28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos clearView(); 28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos draw(false, query_cases[j]); 28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (render_cases[i] == fragmentsPassed()) 28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos setupColor(0.f); 28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos setupPassSwitch(true); 28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos draw(true, modes[k]); 29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLfloat expected_value = (render_cases[i]) ? 1.f : 0.f; 29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLfloat resulted_value = readPixel(); 29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (de::abs(expected_value - resulted_value) > 0.0078125f /* Precission (1/128) */) 29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message << "The functional test's expected value (" 29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << expected_value << ") is different than resulted value (" << resulted_value 29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "). The tested mode was " << Utilities::modeToChars(modes[k]) 30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ". Query was done for target " << Utilities::queryTargetToChars(query_cases[j]) 30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << ", and the test was prepared to " << ((render_cases[i]) ? "pass" : "discard") 30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << " all fragments." << tcu::TestLog::EndMessage; 30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos is_ok = false; 30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos is_ok = false; 31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanQueryObject(); 31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (...) 31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos is_ok = false; 32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos is_error = true; 32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanQueryObject(); 32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean-up. */ 32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos cleanProgramViewAndVAO(); 32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Result's setup. */ 33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (is_ok) 33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (is_error) 33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() 33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::Message 34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "Internal error has occured during Conditional Render Inverted Functional Test." 34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Test error."); 34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_context.getTestContext().getLog() << tcu::TestLog::Message 34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "The Conditional Render Inverted Functional Test has failed." 34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << tcu::TestLog::EndMessage; 35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail."); 35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return STOP; 35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Compile and link test's GLSL program. 35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::createProgram() 36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos struct Shader 36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLchar const* const source; 36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLenum const type; 36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLuint id; 37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } shader[] = { { s_vertex_shader, GL_VERTEX_SHADER, 0 }, { s_fragment_shader, GL_FRAGMENT_SHADER, 0 } }; 37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]); 37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Create program. */ 37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_po_id = gl.createProgram(); 37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram call failed."); 37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shader compilation. */ 38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (glw::GLuint i = 0; i < shader_count; ++i) 38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (DE_NULL != shader[i].source) 38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos shader[i].id = gl.createShader(shader[i].type); 38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed."); 38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.attachShader(m_po_id, shader[i].id); 39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader call failed."); 39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.shaderSource(shader[i].id, 1, &(shader[i].source), NULL); 39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed."); 39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.compileShader(shader[i].id); 39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed."); 40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLint status = GL_FALSE; 40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getShaderiv(shader[i].id, GL_COMPILE_STATUS, &status); 40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed."); 40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_FALSE == status) 40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw 0; 41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Link. */ 41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.linkProgram(m_po_id); 41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glTransformFeedbackVaryings call failed."); 41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLint status = GL_FALSE; 42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getProgramiv(m_po_id, GL_LINK_STATUS, &status); 42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_TRUE == status) 42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (glw::GLuint i = 0; i < shader_count; ++i) 42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (shader[i].id) 42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.detachShader(m_po_id, shader[i].id); 43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader call failed."); 43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw 0; 43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (...) 44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_po_id) 44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteProgram(m_po_id); 44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_po_id = 0; 44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (glw::GLuint i = 0; i < shader_count; ++i) 45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != shader[i].id) 45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteShader(shader[i].id); 45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos shader[i].id = 0; 45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_po_id) 46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.useProgram(m_po_id); 46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed."); 46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Create and bind framebuffer with renderbuffer color attachment. 46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::createView() 47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Prepare framebuffer. */ 47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.clearColor(0.5f, 0.5f, 0.5f, 0.5f); 47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor call failed."); 47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genFramebuffers(1, &m_fbo_id); 48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers call failed."); 48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genRenderbuffers(1, &m_rbo_id); 48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGenRenderbuffers call failed."); 48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo_id); 48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer call failed."); 48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindRenderbuffer(GL_RENDERBUFFER, m_rbo_id); 48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer call failed."); 49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.renderbufferStorage(GL_RENDERBUFFER, GL_R8, s_view_size, s_view_size); 49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glRenderbufferStorage call failed."); 49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rbo_id); 49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferRenderbuffer call failed."); 49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw 0; 50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.viewport(0, 0, s_view_size, s_view_size); 50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport call failed."); 50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Create test's query object. 50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::createQueryObject() 50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Create valid query object. */ 51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genQueries(1, &m_qo_id); 51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries() call failed."); 51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Setup color uniform of the test's program. 51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::setupColor(const glw::GLfloat red) 52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Fetch where to set. */ 52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLuint location = gl.getUniformLocation(m_po_id, s_color_uniform_name); 52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() call failed."); 52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set. */ 53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.uniform1f(location, red); 53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1f() call failed."); 53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Setup pass or discard switch uniform of the test's program. 53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::setupPassSwitch(const bool shall_pass) 53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Fetch where to set. */ 54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLuint location = gl.getUniformLocation(m_po_id, s_pass_switch_uniform_name); 54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() call failed."); 54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Set. */ 54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.uniform1i(location, (int)shall_pass); 54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1f() call failed."); 54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Draw full screen within query or conditional block. 55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param [in] conditional_or_query_draw If true draw will be done in conditional rendering block, otherwise in query block. 55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param [in] condition_mode_or_query_target The param needed by query or conditional block - target or mode. 55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::draw(const bool conditional_or_query_draw, 55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::GLenum condition_mode_or_query_target) 55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (conditional_or_query_draw) 56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.beginConditionalRender(m_qo_id, condition_mode_or_query_target); 56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginConditionalRender() call failed."); 56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.beginQuery(condition_mode_or_query_target, m_qo_id); 56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginQuery() call failed."); 57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4); 57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (conditional_or_query_draw) 57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.endConditionalRender(); 57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glEndConditionalRender() call failed."); 57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.endQuery(condition_mode_or_query_target); 58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glEndQuery() call failed."); 58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check if any fragments have passed rendering. 58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return True if any sample passed, false otherwise. 58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool gl4cts::ConditionalRenderInverted::FunctionalTest::fragmentsPassed() 59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Fetch result. */ 59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLint result = -1; 59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.getQueryObjectiv(m_qo_id, GL_QUERY_RESULT, &result); 59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGetQueryObjectiv() call failed."); 60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Check for unusual errors. */ 60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (-1 == result) 60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw 0; 60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Return results. */ 60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return (result > 0); 60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 61148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Read framebuffer's first pixel red component (left, bottom). 61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Red value of the pixel. 61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosglw::GLfloat gl4cts::ConditionalRenderInverted::FunctionalTest::readPixel() 61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 62048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glw::GLfloat red = -1.f; 62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.readPixels(0, 0, 1, 1, GL_RED, GL_FLOAT, &red); 62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() call failed."); 62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return red; 62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Destroy test's query object. 62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::cleanQueryObject() 63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clean query object. */ 63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_qo_id) 63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteQueries(1, &m_qo_id); 63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_qo_id = 0; 64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Create test's empty Vertex Array Object. 64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::createVertexArrayObject() 64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Create and bind vertex array. */ 65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.genVertexArrays(1, &m_vao_id); 65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() call failed."); 65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.bindVertexArray(m_vao_id); 65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() call failed."); 65748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Destroy test's Vertex Array Object. 66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::cleanProgramViewAndVAO() 66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Deleting view. */ 66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_fbo_id) 66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteFramebuffers(1, &m_fbo_id); 67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_fbo_id = 0; 67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_rbo_id) 67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteRenderbuffers(1, &m_rbo_id); 67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_rbo_id = 0; 67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (m_vao_id) 68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.deleteVertexArrays(1, &m_vao_id); 68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_vao_id = 0; 68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Destroy test's framebuffer with related objects. 69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid gl4cts::ConditionalRenderInverted::FunctionalTest::clearView() 69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Shortcut for GL functionality. */ 69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Clear screen. */ 69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos gl.clear(GL_COLOR_BUFFER_BIT); 69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLU_EXPECT_NO_ERROR(gl.getError(), "glClear() call failed."); 69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar gl4cts::ConditionalRenderInverted::FunctionalTest::s_vertex_shader[] = 70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 130\n" 70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "\n" 70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main()\n" 70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "{\n" 70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " switch(gl_VertexID % 4)\n" 70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " {\n" 70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " case 0:\n" 70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " gl_Position = vec4(-1.0, -1.0, 0.0, 1.0);\n" 71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " break;\n" 71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " case 1:\n" 71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " gl_Position = vec4( 1.0, -1.0, 0.0, 1.0);\n" 71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " break;\n" 71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " case 2:\n" 71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);\n" 71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " break;\n" 71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " case 3:\n" 71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " gl_Position = vec4( 1.0, 1.0, 0.0, 1.0);\n" 71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " break;\n" 72048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " }\n" 72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "}\n"; 72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar gl4cts::ConditionalRenderInverted::FunctionalTest::s_fragment_shader[] = "#version 130\n" 72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "\n" 72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "uniform float color;\n" 72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "uniform int shall_pass;\n" 72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "\n" 72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "out vec4 pixel;\n" 72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "\n" 73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main()\n" 73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "{\n" 73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " if(0 == shall_pass)\n" 73348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " {\n" 73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " discard;\n" 73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " }\n" 73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "\n" 73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " pixel = vec4(color);\n" 73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "}\n"; 73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar gl4cts::ConditionalRenderInverted::FunctionalTest::s_color_uniform_name[] = "color"; 74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 74248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar gl4cts::ConditionalRenderInverted::FunctionalTest::s_pass_switch_uniform_name[] = "shall_pass"; 74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint gl4cts::ConditionalRenderInverted::FunctionalTest::s_view_size = 1; 74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/******************************** Utilities Implementation ********************************/ 74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 74848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Return string representation of condional rendering mode. 74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param [in] mode Render condition mode. 75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Constant C-String representation of mode. 75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar* gl4cts::ConditionalRenderInverted::Utilities::modeToChars(glw::GLenum mode) 75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Const name values. */ 75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLchar* query_wait_inverted_mode_name = "GL_QUERY_WAIT_INVERTED"; 75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLchar* query_no_wait_inverted_mode_name = "GL_QUERY_NO_WAIT_INVERTED"; 75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLchar* query_by_region_wait_inverted_mode_name = "GL_QUERY_BY_REGION_WAIT_INVERTED"; 76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLchar* query_by_region_no_wait_inverted_mode_name = "GL_QUERY_BY_REGION_NO_WAIT_INVERTED"; 76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLchar* invalid_mode_name = "unknow mode"; 76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Return proper value. */ 76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_QUERY_WAIT_INVERTED == mode) 76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 76648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return query_wait_inverted_mode_name; 76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_QUERY_NO_WAIT_INVERTED == mode) 77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return query_no_wait_inverted_mode_name; 77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_QUERY_BY_REGION_WAIT_INVERTED == mode) 77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return query_by_region_wait_inverted_mode_name; 77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_QUERY_BY_REGION_NO_WAIT_INVERTED == mode) 78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return query_by_region_no_wait_inverted_mode_name; 78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* If not, return invalid name. */ 78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return invalid_mode_name; 78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Return string representation of glBeginQuery's target. 78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param [in] mode Render condition mode. 79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @return Constant C-String representation of mode. 79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar* gl4cts::ConditionalRenderInverted::Utilities::queryTargetToChars(glw::GLenum mode) 79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Const name values. */ 79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLchar* any_samples_name = "GL_ANY_SAMPLES_PASSED"; 79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLchar* samples_name = "GL_SAMPLES_PASSED"; 79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static const glw::GLchar* invalid_target_name = "unknow mode"; 80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* Return proper value. */ 80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_ANY_SAMPLES_PASSED == mode) 80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return any_samples_name; 80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (GL_SAMPLES_PASSED == mode) 80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return samples_name; 81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* If not, return invalid name. */ 81348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return invalid_target_name; 81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 815