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