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/**
2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ /*!
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file  gl4cDirectStateAccessQueriesTests.cpp
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief Conformance tests for the Direct State Access feature functionality (Queries access part).
2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ /*-----------------------------------------------------------------------------------------------------------*/
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Includes. */
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gl4cDirectStateAccessTests.hpp"
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deSharedPtr.hpp"
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluContextInfo.hpp"
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDefs.hpp"
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluPixelTransfer.hpp"
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluStrUtil.hpp"
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuFuzzyImageCompare.hpp"
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuImageCompare.hpp"
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuRenderTarget.hpp"
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuSurface.hpp"
4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp"
4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glw.h"
4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwFunctions.hpp"
4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Define OpenGL enumerations not available in framework. */
5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#ifndef GL_QUERY_TARGET
5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define GL_QUERY_TARGET 0x82EA
5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif
5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace gl4cts
5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace DirectStateAccess
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace Queries
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/******************************** Creation Test Implementation   ********************************/
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Creation Test constructor.
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] context     OpenGL context.
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosCreationTest::CreationTest(deqp::Context& context)
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: deqp::TestCase(context, "queries_creation", "Query Objects Creation Test")
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Intentionally left blank. */
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Iterate Creation Test cases.
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Iteration result.
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult CreationTest::iterate()
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Get context setup. */
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return STOP;
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Running tests. */
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Query targets */
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const glw::GLenum targets[] = {
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GL_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED,   GL_ANY_SAMPLES_PASSED_CONSERVATIVE,		 GL_TIME_ELAPSED,
9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GL_TIMESTAMP,	  GL_PRIMITIVES_GENERATED, GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN
10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const glw::GLuint targets_count = sizeof(targets) / sizeof(targets[0]);
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Queries objects */
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const glw::GLuint queries_count = 2;
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint queries_legacy[queries_count]			  = {};
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint queries_dsa[targets_count][queries_count] = {};
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Check legacy state creation. */
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genQueries(queries_count, queries_legacy);
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries have failed");
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (glw::GLuint i = 0; i < queries_count; ++i)
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (gl.isQuery(queries_legacy[i]))
11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok = false;
12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Log. */
12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_context.getTestContext().getLog()
12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< tcu::TestLog::Message
12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< "GenQueries has created default objects, but it should create only a names."
12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< tcu::TestLog::EndMessage;
12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Check direct state creation. */
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (glw::GLuint i = 0; i < targets_count; ++i)
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.createQueries(targets[i], queries_count, queries_dsa[i]);
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateQueries have failed");
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (glw::GLuint j = 0; j < queries_count; ++j)
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (!gl.isQuery(queries_dsa[i][j]))
13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					is_ok = false;
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* Log. */
14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getTestContext().getLog() << tcu::TestLog::Message
14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< "CreateQueries has not created default objects."
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< tcu::TestLog::EndMessage;
14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok	= false;
15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Cleanup. */
15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint j = 0; j < queries_count; ++j)
15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (queries_legacy[j])
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteQueries(1, &queries_legacy[j]);
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			queries_legacy[j] = 0;
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (glw::GLuint i = 0; i < targets_count; ++i)
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (queries_dsa[i][j])
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.deleteQueries(1, &queries_dsa[i][j]);
17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				queries_dsa[i][j] = 0;
17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Result's setup. */
17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_ok)
17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (is_error)
18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/******************************** Defaults Test Implementation   ********************************/
19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Defaults Test constructor.
19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] context     OpenGL context.
20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
20248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosDefaultsTest::DefaultsTest(deqp::Context& context)
20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: deqp::TestCase(context, "queries_defaults", "Queries Defaults Test"), m_query_dsa(0)
20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Intentionally left blank. */
20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Iterate Defaults Test cases.
20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Iteration result.
21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult DefaultsTest::iterate()
21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Get context setup. */
21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return STOP;
22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Running tests. */
22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Query targets. */
23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const glw::GLenum targets[] = {
23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GL_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED,   GL_ANY_SAMPLES_PASSED_CONSERVATIVE,		 GL_TIME_ELAPSED,
23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GL_TIMESTAMP,	  GL_PRIMITIVES_GENERATED, GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN
23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const glw::GLchar* target_names[] = {
23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		"GL_SAMPLES_PASSED", "GL_ANY_SAMPLES_PASSED",   "GL_ANY_SAMPLES_PASSED_CONSERVATIVE",	  "GL_TIME_ELAPSED",
23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		"GL_TIMESTAMP",		 "GL_PRIMITIVES_GENERATED", "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN"
23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const glw::GLuint targets_count = sizeof(targets) / sizeof(targets[0]);
24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Check direct state creation. */
24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (glw::GLuint i = 0; i < targets_count; ++i)
24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			prepare(targets[i]);
24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testQueryParameter(GL_QUERY_RESULT, GL_FALSE, target_names[i]);
25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= testQueryParameter(GL_QUERY_RESULT_AVAILABLE, GL_TRUE, target_names[i]);
25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			clean();
25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok	= false;
25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		clean();
26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Result's setup. */
26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_ok)
26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (is_error)
27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Create Query Objects.
28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeeded, false otherwise.
28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid DefaultsTest::prepare(const glw::GLenum target)
29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Query object creation */
29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.createQueries(target, 1, &m_query_dsa);
29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateTransformFeedbacks have failed");
29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Test Query Integer Parameter.
30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] pname           Parameter name to be tested.
30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] expected_value  Expected value for comparison.
30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] target_name     Target name of the tested query object - for logging purposes.
30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeeded, false otherwise.
30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool DefaultsTest::testQueryParameter(const glw::GLenum pname, const glw::GLuint expected_value,
31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									  const glw::GLchar* target_name)
31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Get data. */
31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint value = 0;
31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.getQueryObjectuiv(m_query_dsa, pname, &value);
31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetQueryObjectuiv have failed");
32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (expected_value != value)
32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "glGetQueryObjectuiv of query object with target " << target_name
32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " with parameter " << pname << " has returned " << value << ", however " << expected_value
32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< " was expected." << tcu::TestLog::EndMessage;
32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Release GL objects.
33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid DefaultsTest::clean()
33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_query_dsa)
34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &m_query_dsa);
34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_query_dsa = 0;
34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/******************************** Errors Test Implementation   ********************************/
35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Errors Test constructor.
35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] context     OpenGL context.
35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
35548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosErrorsTest::ErrorsTest(deqp::Context& context)
35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: deqp::TestCase(context, "queries_errors", "Queries Errors Test")
35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_pGetQueryBufferObjectiv(DE_NULL)
35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_pGetQueryBufferObjectuiv(DE_NULL)
35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_pGetQueryBufferObjecti64v(DE_NULL)
36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_pGetQueryBufferObjectui64v(DE_NULL)
36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Intentionally left blank. */
36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Iterate Errors Test cases.
36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Iteration result.
36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult ErrorsTest::iterate()
37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Get context setup. */
37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return STOP;
38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Getting function pointers. */
38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectiv	= (PFNGLGETQUERYBUFFEROBJECT)gl.getQueryBufferObjectiv;
38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectuiv   = (PFNGLGETQUERYBUFFEROBJECT)gl.getQueryBufferObjectuiv;
38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjecti64v  = (PFNGLGETQUERYBUFFEROBJECT)gl.getQueryBufferObjecti64v;
38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECT)gl.getQueryBufferObjectui64v;
39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Running tests. */
39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((DE_NULL == m_pGetQueryBufferObjectiv) || (DE_NULL == m_pGetQueryBufferObjectuiv) ||
39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(DE_NULL == m_pGetQueryBufferObjecti64v) || (DE_NULL == m_pGetQueryBufferObjectui64v))
39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "Test could not get the pointers for glGetQueryBufferObject* functions."
40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			throw 0;
40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= testNegativeNumberOfObjects();
40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= testInvalidTarget();
40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= testInvalidQueryName();
41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= testInvalidBufferName();
41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= testInvalidParameterName();
41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= testBufferOverflow();
41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= testBufferNegativeOffset();
41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok	= false;
41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Result's setup. */
42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_ok)
42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (is_error)
42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that CreateQueries generates INVALID_VALUE
44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         error if number of query objects to create is
44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         negative.
44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeded, false otherwise.
44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::testNegativeNumberOfObjects()
44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test for each target. */
45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < s_targets_count; ++i)
45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint query = 0;
45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.createQueries(s_targets[i], -1, &query); /* Create negative number of queries. */
45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum error = gl.getError();
46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_VALUE != error)
46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "glCreateQueries called with target " << s_target_names[i]
46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< " with negative number of objects to be created (-1) has generated error " << glu::getErrorStr(error)
46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< ", however GL_INVALID_VALUE was expected." << tcu::TestLog::EndMessage;
46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (query)
46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.deleteQueries(1, &query);
47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				while (error == gl.getError())
47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					;
47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				m_context.getTestContext().getLog()
47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< tcu::TestLog::Message << "glCreateQueries called with target " << s_target_names[i]
47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< " with negative number of objects to be created (-1) has created at least one object."
47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					<< tcu::TestLog::EndMessage;
47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return false;
48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that CreateQueries generates INVALID_ENUM error if target is not
48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         one of accepted values:
49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  SAMPLES_PASSED,
49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  ANY_SAMPLES_PASSED,
49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  ANY_SAMPLES_PASSED_CONSERVATIVE,
49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  TIME_ELAPSED,
49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  TIMESTAMP,
49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  PRIMITIVES_GENERATED or
49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN.
49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeded, false otherwise.
49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::testInvalidTarget()
50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Creating invalid target. */
50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum invalid_target = 0;
50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (isTarget(++invalid_target))
50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test. */
51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint query = 0;
51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.createQueries(invalid_target, 1, &query); /* Create negative number of queries. */
51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum error = gl.getError();
51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (GL_INVALID_ENUM != error)
51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog() << tcu::TestLog::Message << "glCreateQueries called with invalid target ("
52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											<< invalid_target << ") has generated error " << glu::getErrorStr(error)
52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											<< ", however GL_INVALID_ENUM was expected." << tcu::TestLog::EndMessage;
52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (query)
52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteQueries(1, &query);
52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			while (error == gl.getError())
52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				;
53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog() << tcu::TestLog::Message
53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												<< "glCreateQueries called with invalid target (" << invalid_target
53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												<< ") has created an object." << tcu::TestLog::EndMessage;
53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         INVALID_OPERATION error if <id> is not the name of a query object, or
54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         if the query object named by <id> is currently active.
54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeded, false otherwise.
54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::testInvalidQueryName()
55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Creating invalid query name. */
55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint invalid_query = 0;
55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Default result. */
55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (gl.isQuery(++invalid_query))
56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test's objects. */
56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint buffer = 0;
56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint query  = 0;
56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Creating buffer for the test. */
57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genBuffers(1, &buffer);
57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers have failed");
57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffer);
57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffers have failed");
57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(glw::GLint64), DE_NULL, GL_DYNAMIC_COPY);
57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffers have failed");
57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test invalid query object name (integer version). */
58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectiv(invalid_query, buffer, GL_QUERY_RESULT, 0);
58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum error = gl.getError();
58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectiv called with invalid query name has generated error "
59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test invalid query object name (unsigned integer version). */
59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectuiv(invalid_query, buffer, GL_QUERY_RESULT, 0);
59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectuiv called with invalid query name has generated error "
60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
61148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test invalid query object name (64-bit integer version). */
61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjecti64v(invalid_query, buffer, GL_QUERY_RESULT, 0);
61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
62048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjecti64v called with invalid query name has generated error "
62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test invalid query object name (64-bit unsigned integer version). */
62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectui64v(invalid_query, buffer, GL_QUERY_RESULT, 0);
63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectui64v called with invalid query name has generated error "
63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Create query object for the test. */
64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.createQueries(s_targets[0], 1, &query);
64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateQueries have failed");
64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.beginQuery(s_targets[0], query);
64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateQueries have failed");
65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of active query object name (integer version). */
65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectiv(query, buffer, GL_QUERY_RESULT, 0);
65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
65748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectiv called with active query object has generated error "
66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of active query object name (unsigned integer version). */
66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectuiv(query, buffer, GL_QUERY_RESULT, 0);
66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectuiv called with active query object has generated error "
67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of active query object name (64-bit integer version). */
68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjecti64v(query, buffer, GL_QUERY_RESULT, 0);
68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjecti64v called with active query object has generated error "
69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of active query object name (64-bit unsigned integer version). */
70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectui64v(query, buffer, GL_QUERY_RESULT, 0);
70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectui64v called with active query object has generated error "
70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Releasing objects. */
72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (query)
72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.endQuery(s_targets[0]);
72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &query);
72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (buffer)
72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &buffer);
73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
73348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Error cleanup. */
73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (gl.getError())
73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_error)
73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
74248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return is_ok;
74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         INVALID_OPERATION error if <buffer> is not the name of an existing
74848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         buffer object.
74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeded, false otherwise.
75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::testInvalidBufferName()
75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Default result. */
75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Creating invalid buffer name. */
76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint invalid_buffer = 0;
76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (gl.isBuffer(++invalid_buffer))
76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
76648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test's objects. */
76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint query = 0;
76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Create query object for the test. */
77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.createQueries(s_targets[0], 1, &query);
77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateQueries have failed");
77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of invalid buffer name (integer version). */
77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectiv(query, invalid_buffer, GL_QUERY_RESULT_AVAILABLE, 0);
77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum error = gl.getError();
78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectiv which could generate buffers overflow generated error "
78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of invalid buffer name (unsigned integer version). */
79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectuiv(query, invalid_buffer, GL_QUERY_RESULT_AVAILABLE, 0);
79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectuiv which could generate buffers overflow generated error "
80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of invalid buffer name (64-bit integer version). */
80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjecti64v(query, invalid_buffer, GL_QUERY_RESULT_AVAILABLE, 0);
81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
81348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
81548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
81648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
81748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjecti64v which could generate buffers overflow generated error "
81848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
81948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
82048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
82248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
82348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of invalid buffer name (64-bit unsigned integer version). */
82548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectui64v(query, invalid_buffer, GL_QUERY_RESULT_AVAILABLE, 0);
82648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
82848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
83048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
83148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
83248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
83348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectui64v which could generate buffers overflow generated error "
83448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
83548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
83648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
83748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
83848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
83948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
84048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
84148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
84248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
84348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
84448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
84548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Releasing objects. */
84648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (query)
84748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
84848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &query);
84948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
85048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
85148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Error cleanup. */
85248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (gl.getError())
85348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
85448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
85548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_error)
85648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
85748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
85848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
85948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
86048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return is_ok;
86148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
86248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
86348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
86448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
86548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         INVALID_ENUM error if <pname> is not QUERY_RESULT,
86648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         QUERY_RESULT_AVAILABLE, QUERY_RESULT_NO_WAIT or QUERY_TARGET.
86748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
86848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeded, false otherwise.
86948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
87048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::testInvalidParameterName()
87148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
87248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
87348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
87448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
87548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Creating invalid parameter name. */
87648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint invalid_pname = 0;
87748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
87848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (isParameterName(++invalid_pname))
87948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
88048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
88148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Default result. */
88248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
88348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
88448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
88548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test's objects. */
88648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint buffer = 0;
88748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint query  = 0;
88848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
88948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
89048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
89148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Creating buffer for the test. */
89248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genBuffers(1, &buffer);
89348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers have failed");
89448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
89548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffer);
89648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffers have failed");
89748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
89848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(glw::GLint64), DE_NULL, GL_DYNAMIC_COPY);
89948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffers have failed");
90048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
90148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Create query object for the test. */
90248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.createQueries(s_targets[0], 1, &query);
90348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateQueries have failed");
90448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
90548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of invalid parameter name (integer version). */
90648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectiv(query, buffer, invalid_pname, 0);
90748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
90848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum error = gl.getError();
90948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
91048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_ENUM != error)
91148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
91248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
91348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
91448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectiv called with invalid parameter name has generated error "
91548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_ENUM was expected." << tcu::TestLog::EndMessage;
91648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
91748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
91848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
91948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
92048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of invalid parameter name (unsigned integer version). */
92148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectuiv(query, buffer, invalid_pname, 0);
92248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
92348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
92448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
92548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_ENUM != error)
92648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
92748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
92848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
92948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectuiv called with invalid parameter name has generated error "
93048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_ENUM was expected." << tcu::TestLog::EndMessage;
93148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
93248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
93348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
93448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
93548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of invalid parameter name (64-bit integer version). */
93648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjecti64v(query, buffer, invalid_pname, 0);
93748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
93848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
93948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
94048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_ENUM != error)
94148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
94248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
94348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
94448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjecti64v called with invalid parameter name has generated error "
94548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_ENUM was expected." << tcu::TestLog::EndMessage;
94648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
94748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
94848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
94948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
95048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of invalid parameter name (64-bit unsigned integer version). */
95148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectui64v(query, buffer, invalid_pname, 0);
95248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
95348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
95448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
95548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_ENUM != error)
95648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
95748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
95848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
95948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectui64v called with invalid parameter name has generated error "
96048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_ENUM was expected." << tcu::TestLog::EndMessage;
96148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
96248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
96348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
96448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
96548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
96648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
96748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
96848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
96948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Releasing objects. */
97148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (query)
97248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
97348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &query);
97448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
97548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (buffer)
97748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
97848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &buffer);
97948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
98048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Error cleanup. */
98248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (gl.getError())
98348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
98448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_error)
98648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
98748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
98848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
98948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
99048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return is_ok;
99148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
99248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
99348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
99448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
99548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         INVALID_OPERATION error if the query writes to a buffer object, and the
99648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         specified buffer offset would cause data to be written beyond the bounds
99748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         of that buffer object.
99848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
99948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeded, false otherwise.
100048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
100148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::testBufferOverflow()
100248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
100348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
100448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
100548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
100648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Default result. */
100748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
100848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
100948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
101048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test's objects. */
101148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint buffer = 0;
101248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint query  = 0;
101348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
101448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
101548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
101648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Creating buffer for the test. */
101748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genBuffers(1, &buffer);
101848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers have failed");
101948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffer);
102148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffers have failed");
102248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(glw::GLint64), DE_NULL, GL_DYNAMIC_COPY);
102448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffers have failed");
102548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Create query object for the test. */
102748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.createQueries(s_targets[0], 1, &query);
102848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateQueries have failed");
102948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
103048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of buffer overflow (integer version). */
103148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectiv(query, buffer, GL_QUERY_RESULT_AVAILABLE, sizeof(glw::GLint64));
103248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
103348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum error = gl.getError();
103448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
103548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
103648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
103748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
103848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
103948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectiv which could generate buffers overflow generated error "
104048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
104148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
104248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
104448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
104548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of buffer overflow (unsigned integer version). */
104748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectuiv(query, buffer, GL_QUERY_RESULT_AVAILABLE, sizeof(glw::GLint64));
104848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
105048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
105148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
105248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
105348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
105448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
105548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectuiv which could generate buffers overflow generated error "
105648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
105748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
105848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
105948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
106048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
106148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of  buffer overflow (64-bit integer version). */
106348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjecti64v(query, buffer, GL_QUERY_RESULT_AVAILABLE, sizeof(glw::GLint64));
106448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
106648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
106848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
106948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
107048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
107148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjecti64v which could generate buffers overflow generated error "
107248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
107348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
107448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
107548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
107648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
107748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
107848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query of  buffer overflow (64-bit unsigned integer version). */
107948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectui64v(query, buffer, GL_QUERY_RESULT_AVAILABLE, sizeof(glw::GLint64));
108048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
108248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_OPERATION != error)
108448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
108548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
108648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message
108748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< "glGetQueryBufferObjectui64v which could generate buffers overflow generated error "
108848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_OPERATION was expected."
108948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
109048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
109148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
109248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
109348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
109448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
109548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
109648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
109748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
109848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
109948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Releasing objects. */
110048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (query)
110148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
110248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &query);
110348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
110448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
110548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (buffer)
110648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
110748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &buffer);
110848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
110948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
111048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Error cleanup. */
111148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (gl.getError())
111248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
111348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
111448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_error)
111548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
111648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
111748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
111848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
111948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return is_ok;
112048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
112148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
112248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
112348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         GetQueryBufferObjecti64v and GetQueryBufferObjectui64v generate
112448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         INVALID_VALUE error if <offset> is negative.
112548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
112648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if test succeded, false otherwise.
112748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
112848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::testBufferNegativeOffset()
112948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
113048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
113148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
113248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Default result. */
113448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
113548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
113648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Test's objects. */
113848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint buffer = 0;
113948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint query  = 0;
114048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
114248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
114348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Creating buffer for the test. */
114448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.genBuffers(1, &buffer);
114548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers have failed");
114648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, buffer);
114848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffers have failed");
114948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.bufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(glw::GLint64), DE_NULL, GL_DYNAMIC_COPY);
115148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffers have failed");
115248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Create query object for the test. */
115448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.createQueries(s_targets[0], 1, &query);
115548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateQueries have failed");
115648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query with negative offset (integer version). */
115848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectiv(query, buffer, GL_QUERY_RESULT_AVAILABLE, -1);
115948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum error = gl.getError();
116148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_VALUE != error)
116348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
116448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
116548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "glGetQueryBufferObjectiv called with negative offset generated error "
116648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_VALUE was expected." << tcu::TestLog::EndMessage;
116748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
116848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
116948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
117048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
117148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query with negative offset (unsigned integer version). */
117248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectuiv(query, buffer, GL_QUERY_RESULT_AVAILABLE, -1);
117348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
117448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
117548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
117648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_VALUE != error)
117748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
117848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
117948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "glGetQueryBufferObjectuiv called with negative offset generated error "
118048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_VALUE was expected." << tcu::TestLog::EndMessage;
118148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
118348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
118448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query with negative offset (64-bit integer version). */
118648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjecti64v(query, buffer, GL_QUERY_RESULT_AVAILABLE, -1);
118748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
118948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_VALUE != error)
119148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
119248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
119348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "glGetQueryBufferObjecti64v called with negative offset generated error "
119448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_VALUE was expected." << tcu::TestLog::EndMessage;
119548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
119748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
119848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Test query with negative offset (64-bit unsigned integer version). */
120048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGetQueryBufferObjectui64v(query, buffer, GL_QUERY_RESULT_AVAILABLE, -1);
120148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		error = gl.getError();
120348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
120448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_INVALID_VALUE != error)
120548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
120648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
120748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "glGetQueryBufferObjectui64v called with negative offset generated error "
120848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< glu::getErrorStr(error) << ", however GL_INVALID_VALUE was expected." << tcu::TestLog::EndMessage;
120948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok = false;
121148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
121248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
121348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
121448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
121548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
121648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
121748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Releasing objects. */
121948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (query)
122048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
122148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(1, &query);
122248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
122348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (buffer)
122548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
122648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &buffer);
122748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
122848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Error cleanup. */
123048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	while (gl.getError())
123148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		;
123248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_error)
123448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
123548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
123648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
123748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
123848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return is_ok;
123948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
124048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
124148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check if argument is one of the target names:
124248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  SAMPLES_PASSED,
124348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  TIME_ELAPSED,
124448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  PRIMITIVES_GENERATED,
124548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN.
124648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
124748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] maybe_target   Target to be checked.
124848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
124948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if argument is one of the listed targets, false otherwise.
125048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
125148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::isTarget(glw::GLenum maybe_target)
125248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
125348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < s_targets_count; ++i)
125448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
125548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (maybe_target == s_targets[i])
125648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
125748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return true;
125848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
125948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
126048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
126248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
126348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check if argument is one of the parameter names:
126548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  QUERY_RESULT,
126648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  QUERY_RESULT_AVAILABLE,
126748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  QUERY_RESULT_NO_WAIT,
126848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          -  QUERY_TARGET.
126948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
127048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] maybe_pname   Parameter name to be checked.
127148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
127248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if argument is one of the listed parameters, false otherwise.
127348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
127448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool ErrorsTest::isParameterName(glw::GLenum maybe_pname)
127548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
127648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum pnames[]	 = { GL_QUERY_RESULT, GL_QUERY_RESULT_AVAILABLE, GL_QUERY_RESULT_NO_WAIT, GL_QUERY_TARGET };
127748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint pnames_count = sizeof(pnames) / sizeof(pnames[0]);
127848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < pnames_count; ++i)
128048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
128148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (maybe_pname == pnames[i])
128248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
128348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return true;
128448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
128548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
128648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return false;
128848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
128948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
129048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Targets to be tested. */
129148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLenum ErrorsTest::s_targets[] = {
129248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED,   GL_ANY_SAMPLES_PASSED_CONSERVATIVE,		 GL_TIME_ELAPSED,
129348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GL_TIMESTAMP,	  GL_PRIMITIVES_GENERATED, GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN
129448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
129548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
129648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Names of targets to be tested. */
129748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar* ErrorsTest::s_target_names[] = {
129848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"GL_SAMPLES_PASSED", "GL_ANY_SAMPLES_PASSED",   "GL_ANY_SAMPLES_PASSED_CONSERVATIVE",	  "GL_TIME_ELAPSED",
129948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	"GL_TIMESTAMP",		 "GL_PRIMITIVES_GENERATED", "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN"
130048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
130148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Number of targets. */
130348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint ErrorsTest::s_targets_count = sizeof(s_targets) / sizeof(s_targets[0]);
130448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/******************************** Functional Test Implementation   ********************************/
130648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Functional Test constructor.
130848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
130948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] context     OpenGL context.
131048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
131148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosFunctionalTest::FunctionalTest(deqp::Context& context)
131248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: deqp::TestCase(context, "queries_functional", "Queries Functional Test")
131348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_pGetQueryBufferObjectiv(DE_NULL)
131448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_pGetQueryBufferObjectuiv(DE_NULL)
131548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_pGetQueryBufferObjecti64v(DE_NULL)
131648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_pGetQueryBufferObjectui64v(DE_NULL)
131748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_fbo(0)
131848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_rbo(0)
131948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_vao(0)
132048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_bo_query(0)
132148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_bo_xfb(0)
132248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_qo(DE_NULL)
132348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_po(0)
132448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
132548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Intentionally left blank. */
132648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
132748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
132848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Do comparison (a == b).
132948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
133048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @tparam         Type of the values to be compared.
133148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
133248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] a   First  value to be compared.
133348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] b   Second value to be compared.
133448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
133548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Result of the comparison.
133648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
133748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T>
133848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::equal(T a, T b)
133948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
134048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (a == b);
134148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
134248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Do comparison (a < b).
134448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
134548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @tparam         Type of the values to be compared.
134648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
134748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] a   First  value to be compared.
134848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] b   Second value to be compared.
134948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
135048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Result of the comparison.
135148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
135248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T>
135348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::less(T a, T b)
135448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
135548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (a < b);
135648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
135748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
135848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Template specialization of glGetQueryBufferObject* function for GLint.
135948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         This is pass through function to glGetQueryBufferObjectiv
136048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
136148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] id          Query object identifier.
136248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] buffer      Buffer object identifier.
136348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] pname       Parameter name to be queried.
136448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] offset      Offset of the buffer to be saved at.
136548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
136648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <>
136748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::GetQueryBufferObject<glw::GLint>(glw::GLuint id, glw::GLuint buffer, glw::GLenum pname,
136848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  glw::GLintptr offset)
136948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
137048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectiv(id, buffer, pname, offset);
137148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
137248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
137348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Template specialization of glGetQueryBufferObject* function for GLuint.
137448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         This is pass through function to glGetQueryBufferObjectuiv
137548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
137648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] id          Query object identifier.
137748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] buffer      Buffer object identifier.
137848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] pname       Parameter name to be queried.
137948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] offset      Offset of the buffer to be saved at.
138048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
138148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <>
138248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::GetQueryBufferObject<glw::GLuint>(glw::GLuint id, glw::GLuint buffer, glw::GLenum pname,
138348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													   glw::GLintptr offset)
138448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
138548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectuiv(id, buffer, pname, offset);
138648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
138748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
138848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Template specialization of glGetQueryBufferObject* function for GLint64.
138948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         This is pass through function to glGetQueryBufferObjecti64v
139048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
139148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] id          Query object identifier.
139248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] buffer      Buffer object identifier.
139348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] pname       Parameter name to be queried.
139448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] offset      Offset of the buffer to be saved at.
139548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
139648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <>
139748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::GetQueryBufferObject<glw::GLint64>(glw::GLuint id, glw::GLuint buffer, glw::GLenum pname,
139848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														glw::GLintptr offset)
139948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
140048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjecti64v(id, buffer, pname, offset);
140148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
140248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
140348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Template specialization of glGetQueryBufferObject* function for GLuint64.
140448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         This is pass through function to glGetQueryBufferObjectui64v
140548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
140648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] id          Query object identifier.
140748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] buffer      Buffer object identifier.
140848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] pname       Parameter name to be queried.
140948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] offset      Offset of the buffer to be saved at.
141048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
141148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <>
141248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::GetQueryBufferObject<glw::GLuint64>(glw::GLuint id, glw::GLuint buffer, glw::GLenum pname,
141348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														 glw::GLintptr offset)
141448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
141548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectui64v(id, buffer, pname, offset);
141648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
141748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
141848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Function template fetches query result to buffer object using
141948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         glGetQueryBufferObject* function (selected on the basis of template parameter).
142048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         Then buffer is mapped and the result is compared with expected_value using comparison function.
142148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
142248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @tparam                     Templated type of fetched data.
142348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              It shall be one of glw::GL[u]int[64].
142448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
142548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] query           Query object to be queried.
142648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] pname           Parameter name to be queried.
142748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] expected_value  Reference value to be compared.
142848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param [in] comparison      Comparison function pointer.
142948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                              Comparsion function shall NOT throw.
143048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
143148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
143248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
143348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if comparison succeeded, false otherwise.
143448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
143548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostemplate <typename T>
143648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::checkQueryBufferObject(glw::GLuint query, glw::GLenum pname, T expected_value,
143748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos											bool (*comparison)(T, T))
143848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
143948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
144048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
144148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Default result. */
144348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok = true;
144448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Saving results to buffer. */
144648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GetQueryBufferObject<T>(query, m_bo_query, pname, 0);
144748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetQueryBufferObject* have failed");
144848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Mapping buffer to user space. */
145048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	T* value = (T*)gl.mapBuffer(GL_QUERY_BUFFER, GL_READ_ONLY);
145148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBuffer have failed");
145248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Doing test. */
145448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!comparison(expected_value, *value))
145548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
145648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok = false;
145748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
145848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Cleanup. */
146048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.unmapBuffer(GL_QUERY_BUFFER);
146148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer have failed");
146248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
146348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Return test result. */
146448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return is_ok;
146548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
146648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
146748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Iterate Functional Test cases.
146848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
146948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Iteration result.
147048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
147148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult FunctionalTest::iterate()
147248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
147348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
147448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
147548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Get context setup. */
147748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
147848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_arb_direct_state_access = m_context.getContextInfo().isExtensionSupported("GL_ARB_direct_state_access");
147948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
148048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((!is_at_least_gl_45) && (!is_arb_direct_state_access))
148148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
148248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not Supported");
148348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
148448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return STOP;
148548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
148648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
148748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Fetching access point to GL functions. */
148848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectiv	= (PFNGLGETQUERYBUFFEROBJECT)gl.getQueryBufferObjectiv;
148948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectuiv   = (PFNGLGETQUERYBUFFEROBJECT)gl.getQueryBufferObjectuiv;
149048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjecti64v  = (PFNGLGETQUERYBUFFEROBJECT)gl.getQueryBufferObjecti64v;
149148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECT)gl.getQueryBufferObjectui64v;
149248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
149348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Running tests. */
149448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok	= true;
149548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_error = false;
149648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
149748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
149848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
149948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if ((DE_NULL == m_pGetQueryBufferObjectiv) || (DE_NULL == m_pGetQueryBufferObjectuiv) ||
150048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			(DE_NULL == m_pGetQueryBufferObjecti64v) || (DE_NULL == m_pGetQueryBufferObjectui64v))
150148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
150248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog()
150348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::Message << "Test could not get the pointers for glGetQueryBufferObject* functions."
150448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				<< tcu::TestLog::EndMessage;
150548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
150648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			throw 0;
150748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
150848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
150948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareView();
151048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareVertexArray();
151148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareBuffers();
151248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareQueries();
151348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		prepareProgram();
151448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
151548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		draw();
151648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
151748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make sure that framebuffer and transform feedback buffer are filled with expectd data. */
151848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= checkView();
151948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok &= checkXFB();
152048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
152148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Make comparisons for each query object. */
152248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (glw::GLuint i = 0; i < s_targets_count; ++i)
152348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
152448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Checking targets. */
152548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= checkQueryBufferObject<glw::GLint>(m_qo[i], GL_QUERY_TARGET, s_targets[i],
152648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														&FunctionalTest::equal<glw::GLint>);
152748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= checkQueryBufferObject<glw::GLuint>(m_qo[i], GL_QUERY_TARGET, s_targets[i],
152848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														 &FunctionalTest::equal<glw::GLuint>);
152948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= checkQueryBufferObject<glw::GLint64>(m_qo[i], GL_QUERY_TARGET, s_targets[i],
153048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														  &FunctionalTest::equal<glw::GLint64>);
153148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= checkQueryBufferObject<glw::GLuint64>(m_qo[i], GL_QUERY_TARGET, s_targets[i],
153248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   &FunctionalTest::equal<glw::GLuint64>);
153348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
153448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Checking result availability. */
153548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= checkQueryBufferObject<glw::GLint>(m_qo[i], GL_QUERY_RESULT_AVAILABLE, GL_TRUE,
153648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														&FunctionalTest::equal<glw::GLint>);
153748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= checkQueryBufferObject<glw::GLuint>(m_qo[i], GL_QUERY_RESULT_AVAILABLE, GL_TRUE,
153848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														 &FunctionalTest::equal<glw::GLuint>);
153948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= checkQueryBufferObject<glw::GLint64>(m_qo[i], GL_QUERY_RESULT_AVAILABLE, GL_TRUE,
154048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														  &FunctionalTest::equal<glw::GLint64>);
154148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			is_ok &= checkQueryBufferObject<glw::GLuint64>(m_qo[i], GL_QUERY_RESULT_AVAILABLE, GL_TRUE,
154248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														   &FunctionalTest::equal<glw::GLuint64>);
154348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
154448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (GL_TIME_ELAPSED == s_targets[i])
154548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
154648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Checking result. */
154748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLint>(m_qo[i], GL_QUERY_RESULT, (glw::GLint)s_results[i],
154848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															&FunctionalTest::less<glw::GLint>);
154948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLuint>(m_qo[i], GL_QUERY_RESULT, (glw::GLuint)s_results[i],
155048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															 &FunctionalTest::less<glw::GLuint>);
155148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLint64>(m_qo[i], GL_QUERY_RESULT, (glw::GLint64)s_results[i],
155248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  &FunctionalTest::less<glw::GLint64>);
155348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLuint64>(m_qo[i], GL_QUERY_RESULT, (glw::GLuint64)s_results[i],
155448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   &FunctionalTest::less<glw::GLuint64>);
155548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Checking result (no-wait). */
155748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLint>(m_qo[i], GL_QUERY_RESULT_NO_WAIT, (glw::GLint)s_results[i],
155848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															&FunctionalTest::less<glw::GLint>);
155948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLuint>(
156048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_qo[i], GL_QUERY_RESULT_NO_WAIT, (glw::GLuint)s_results[i], &FunctionalTest::less<glw::GLuint>);
156148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLint64>(
156248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_qo[i], GL_QUERY_RESULT_NO_WAIT, (glw::GLint64)s_results[i], &FunctionalTest::less<glw::GLint64>);
156348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &=
156448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					checkQueryBufferObject<glw::GLuint64>(m_qo[i], GL_QUERY_RESULT_NO_WAIT, (glw::GLuint64)s_results[i],
156548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														  &FunctionalTest::less<glw::GLuint64>);
156648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
156748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			else
156848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
156948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Checking result. */
157048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLint>(m_qo[i], GL_QUERY_RESULT, (glw::GLint)s_results[i],
157148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															&FunctionalTest::equal<glw::GLint>);
157248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLuint>(m_qo[i], GL_QUERY_RESULT, (glw::GLuint)s_results[i],
157348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															 &FunctionalTest::equal<glw::GLuint>);
157448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLint64>(m_qo[i], GL_QUERY_RESULT, (glw::GLint64)s_results[i],
157548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															  &FunctionalTest::equal<glw::GLint64>);
157648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLuint64>(m_qo[i], GL_QUERY_RESULT, (glw::GLuint64)s_results[i],
157748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   &FunctionalTest::equal<glw::GLuint64>);
157848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
157948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				/* Checking result (no-wait). */
158048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLint>(m_qo[i], GL_QUERY_RESULT_NO_WAIT, (glw::GLint)s_results[i],
158148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															&FunctionalTest::equal<glw::GLint>);
158248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLuint>(
158348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_qo[i], GL_QUERY_RESULT_NO_WAIT, (glw::GLuint)s_results[i], &FunctionalTest::equal<glw::GLuint>);
158448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &= checkQueryBufferObject<glw::GLint64>(
158548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_qo[i], GL_QUERY_RESULT_NO_WAIT, (glw::GLint64)s_results[i], &FunctionalTest::equal<glw::GLint64>);
158648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				is_ok &=
158748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					checkQueryBufferObject<glw::GLuint64>(m_qo[i], GL_QUERY_RESULT_NO_WAIT, (glw::GLuint64)s_results[i],
158848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														  &FunctionalTest::equal<glw::GLuint64>);
158948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
159048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
159148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
159248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
159348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
159448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok	= false;
159548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_error = true;
159648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
159748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
159848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clean up. */
159948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	clean();
160048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Result's setup. */
160248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_ok)
160348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
160448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
160548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
160648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
160748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
160848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (is_error)
160948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
161048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
161148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
161248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
161348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
161448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
161548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
161648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
161748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
161848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
161948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
162048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
162148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Function prepares framebuffer with RGBA8 color attachment.
162248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         Viewport is set up. Content of the framebuffer is cleared.
162348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
162448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
162548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
162648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareView()
162748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
162848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
162948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
163048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
163148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare framebuffer. */
163248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genFramebuffers(1, &m_fbo);
163348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers call failed.");
163448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
163548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genRenderbuffers(1, &m_rbo);
163648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenRenderbuffers call failed.");
163748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
163848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
163948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer call failed.");
164048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
164148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindRenderbuffer(GL_RENDERBUFFER, m_rbo);
164248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer call failed.");
164348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
164448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1 /* x size */, 1 /* y size */);
164548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glRenderbufferStorage call failed.");
164648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
164748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rbo);
164848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferRenderbuffer call failed.");
164948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
165048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
165148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
165248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
165348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
165448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
165548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.viewport(0, 0, 1, 1);
165648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport call failed.");
165748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
165848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Clear framebuffer's content. */
165948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
166048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor call failed.");
166148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
166248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.clear(GL_COLOR_BUFFER_BIT);
166348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glClear call failed.");
166448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
166548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
166648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Function creates and binds empty vertex array.
166748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
166848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
166948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
167048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareVertexArray()
167148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
167248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
167348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
167448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
167548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Creating and binding VAO. */
167648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genVertexArrays(1, &m_vao);
167748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays have failed");
167848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
167948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindVertexArray(m_vao);
168048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray have failed");
168148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
168248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
168348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Function creates buffers for query and transform feedback data storage.
168448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         The storage is allocated and buffers are bound to QUERY_BUFFER and
168548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         TRANSFORM_FEEDBACK_BUFFER binding points respectively.
168648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
168748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
168848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
168948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareBuffers()
169048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
169148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
169248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
169348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
169448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Buffer for storing query's result. */
169548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genBuffers(1, &m_bo_query);
169648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers have failed");
169748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
169848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_QUERY_BUFFER, m_bo_query);
169948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer have failed");
170048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
170148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferData(GL_QUERY_BUFFER, sizeof(glw::GLint64), DE_NULL, GL_DYNAMIC_COPY);
170248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData have failed");
170348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
170448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Buffer for storing transform feedback results. */
170548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genBuffers(1, &m_bo_xfb);
170648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers have failed");
170748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
170848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, m_bo_xfb);
170948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer have failed");
171048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
171148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bufferData(GL_TRANSFORM_FEEDBACK_BUFFER,
171248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  3 /* number of vertices per triangle */ * 2 /* number of triangles */ * sizeof(glw::GLint), DE_NULL,
171348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  GL_DYNAMIC_COPY);
171448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData have failed");
171548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
171648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_bo_xfb);
171748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase have failed");
171848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
171948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
172048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Function creates array of query objects using DSA-style method.
172148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
172248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
172348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
172448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareQueries()
172548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
172648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
172748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
172848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
172948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Allocating memory for queries array. */
173048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_qo = new glw::GLuint[s_targets_count];
173148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
173248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (DE_NULL == m_qo)
173348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
173448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
173548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
173648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
173748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Creating query object for each target. */
173848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < s_targets_count; ++i)
173948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
174048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.createQueries(s_targets[i], 1, &m_qo[i]);
174148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
174248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Error checking. */
174348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_NO_ERROR != gl.getError())
174448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
174548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Remove previous. */
174648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (i > 0)
174748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
174848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.deleteQueries(i, m_qo);
174948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
175048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
175148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Deallocate storage. */
175248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			delete[] m_qo;
175348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
175448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_qo = DE_NULL;
175548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
175648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Signalise test failure. */
175748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			throw 0;
175848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
175948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
176048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
176148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
176248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Function builds test's GLSL program.
176348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         If succeded, the program will be set to be used.
176448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
176548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
176648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
176748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::prepareProgram()
176848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
176948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality */
177048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
177148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
177248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	struct Shader
177348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
177448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLchar const* const source;
177548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLenum const		 type;
177648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLuint				 id;
177748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} shader[] = { { s_vertex_shader, GL_VERTEX_SHADER, 0 }, { s_fragment_shader, GL_FRAGMENT_SHADER, 0 } };
177848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
177948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);
178048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
178148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	try
178248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
178348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Create program. */
178448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po = gl.createProgram();
178548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram call failed.");
178648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
178748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Shader compilation. */
178848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
178948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (glw::GLuint i = 0; i < shader_count; ++i)
179048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
179148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (DE_NULL != shader[i].source)
179248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
179348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				shader[i].id = gl.createShader(shader[i].type);
179448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed.");
179648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.attachShader(m_po, shader[i].id);
179848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader call failed.");
180048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.shaderSource(shader[i].id, 1, &(shader[i].source), NULL);
180248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed.");
180448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.compileShader(shader[i].id);
180648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed.");
180848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				glw::GLint status = GL_FALSE;
181048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
181148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.getShaderiv(shader[i].id, GL_COMPILE_STATUS, &status);
181248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");
181348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
181448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (GL_FALSE == status)
181548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
181648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					glw::GLint log_size = 0;
181748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					gl.getShaderiv(shader[i].id, GL_INFO_LOG_LENGTH, &log_size);
181848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");
181948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					glw::GLchar* log_text = new glw::GLchar[log_size];
182148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					gl.getShaderInfoLog(shader[i].id, log_size, NULL, &log_text[0]);
182348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					m_context.getTestContext().getLog() << tcu::TestLog::Message << "Shader compilation has failed.\n"
182548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< "Shader type: " << glu::getShaderTypeStr(shader[i].type)
182648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< "\n"
182748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< "Shader compilation error log:\n"
182848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< log_text << "\n"
182948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< "Shader source code:\n"
183048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< shader[i].source << "\n"
183148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														<< tcu::TestLog::EndMessage;
183248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
183348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					delete[] log_text;
183448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
183548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog call failed.");
183648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
183748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					throw 0;
183848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
183948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
184048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
184148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Transform Feedback setup. */
184348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.transformFeedbackVaryings(m_po, 1, &s_xfb_varying_name, GL_INTERLEAVED_ATTRIBS);
184448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glTransformFeedbackVaryings call failed.");
184548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Link. */
184748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.linkProgram(m_po);
184848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glTransformFeedbackVaryings call failed.");
185048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint status = GL_FALSE;
185248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.getProgramiv(m_po, GL_LINK_STATUS, &status);
185448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (GL_TRUE == status)
185648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
185748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			for (glw::GLuint i = 0; i < shader_count; ++i)
185848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
185948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (shader[i].id)
186048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
186148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					gl.detachShader(m_po, shader[i].id);
186248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
186348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader call failed.");
186448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
186548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
186648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
186748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		else
186848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
186948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLint log_size = 0;
187048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getProgramiv(m_po, GL_INFO_LOG_LENGTH, &log_size);
187248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv call failed.");
187448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLchar* log_text = new glw::GLchar[log_size];
187648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getProgramInfoLog(m_po, log_size, NULL, &log_text[0]);
187848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getTestContext().getLog() << tcu::TestLog::Message << "Program linkage has failed due to:\n"
188048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												<< log_text << "\n"
188148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												<< tcu::TestLog::EndMessage;
188248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			delete[] log_text;
188448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramInfoLog call failed.");
188648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			throw 0;
188848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
188948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
189048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	catch (...)
189148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
189248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_po)
189348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
189448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteProgram(m_po);
189548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
189648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_po = 0;
189748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
189848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
189948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < shader_count; ++i)
190148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
190248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (0 != shader[i].id)
190348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
190448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteShader(shader[i].id);
190548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			shader[i].id = 0;
190748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
190848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
190948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po)
191148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
191248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.useProgram(m_po);
191348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed.");
191448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
191548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (0 == m_po)
191748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
191848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw 0;
191948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
192048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
192148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
192248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Function draws full screen quad. Queries are measured during the process.
192348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         Also, transform feedback data is captured.
192448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
192548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @note The function may throw if unexpected error has occured.
192648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
192748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::draw()
192848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
192948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
193048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
193148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
193248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Start queries. */
193348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < s_targets_count; ++i)
193448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
193548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.beginQuery(s_targets[i], m_qo[i]);
193648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
193748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
193848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Start XFB. */
193948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.beginTransformFeedback(GL_TRIANGLES);
194048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Draw full screen quad. */
194248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
194348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Finish XFB. */
194548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.endTransformFeedback();
194648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Finish queries. */
194848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (glw::GLuint i = 0; i < s_targets_count; ++i)
194948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
195048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.endQuery(s_targets[i]);
195148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
195248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
195348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Make sure OpenGL finished drawing. */
195448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.finish();
195548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
195648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Error checking. */
195748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "Drawing function have failed.");
195848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
195948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
196048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that framebuffer is filled with red color.
196148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
196248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::checkView()
196348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
196448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
196548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
196648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
196748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Fetch framebuffer data. */
196848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLubyte pixel[4] = { 0 };
196948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
197048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel);
197148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels have failed");
197248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
197348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Comparison with expected values. */
197448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((255 != pixel[0]) || (0 != pixel[1]) || (0 != pixel[2]) || (255 != pixel[3]))
197548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
197648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context.getTestContext().getLog()
197748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< tcu::TestLog::Message << "Frameuffer content (" << (unsigned int)pixel[0] << ", "
197848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< (unsigned int)pixel[1] << ", " << (unsigned int)pixel[2] << ", " << (unsigned int)pixel[3]
197948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			<< ") is different than expected (255, 0, 0, 255)." << tcu::TestLog::EndMessage;
198048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
198148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
198248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
198348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
198448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
198548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
198648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
198748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Check that transform feedback buffer
198848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *         contains values representing quad.
198948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
199048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool FunctionalTest::checkXFB()
199148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
199248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality */
199348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
199448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
199548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Default result. */
199648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_ok = true;
199748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
199848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Mapping buffer object to the user-space. */
199948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLint* buffer = (glw::GLint*)gl.mapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, GL_READ_ONLY);
200048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBuffer call failed.");
200148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
200248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if ((0 != buffer[0]) || (1 != buffer[1]) || (2 != buffer[2]) ||
200348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
200448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(2 != buffer[3]) || (1 != buffer[4]) || (3 != buffer[5]))
200548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
200648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		is_ok = false;
200748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
200848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
200948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.unmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
201048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer call failed.");
201148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
201248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return is_ok;
201348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
201448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
201548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** @brief Release all created objects.
201648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
201748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid FunctionalTest::clean()
201848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
201948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Shortcut for GL functionality. */
202048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
202148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
202248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Releasing queries. */
202348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (DE_NULL != m_qo)
202448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
202548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteQueries(s_targets_count, m_qo);
202648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
202748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		delete[] m_qo;
202848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
202948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_qo = DE_NULL;
203048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
203148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
203248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release framebuffer. */
203348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_fbo)
203448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
203548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteFramebuffers(1, &m_fbo);
203648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
203748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_fbo = 0;
203848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
203948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
204048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release renderbuffer. */
204148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_rbo)
204248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
204348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteRenderbuffers(1, &m_rbo);
204448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
204548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_rbo = 0;
204648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
204748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
204848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release vertex array object. */
204948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_vao)
205048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
205148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteVertexArrays(1, &m_vao);
205248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
205348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vao = 0;
205448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
205548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
205648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release buffer object for storing queries' results. */
205748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_bo_query)
205848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
205948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_bo_query);
206048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
206148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_bo_query = 0;
206248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
206348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
206448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release transform feedback buffer. */
206548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_bo_xfb)
206648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
206748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteBuffers(1, &m_bo_xfb);
206848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
206948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_bo_xfb = 0;
207048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
207148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release GLSL program. */
207348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po)
207448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
207548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.useProgram(0);
207648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.deleteProgram(m_po);
207848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po = 0;
208048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
208148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
208248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
208348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Targets to be tested. */
208448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLenum FunctionalTest::s_targets[] = { GL_SAMPLES_PASSED, GL_TIME_ELAPSED, GL_PRIMITIVES_GENERATED,
208548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												  GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN };
208648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
208748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Expected result for each target. */
208848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLint FunctionalTest::s_results[] = { 1, 0, 2, 2 };
208948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
209048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Number of targets. */
209148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLuint FunctionalTest::s_targets_count = sizeof(s_targets) / sizeof(s_targets[0]);
209248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
209348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Vertex shader source code. */
209448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar FunctionalTest::s_vertex_shader[] = "#version 450\n"
209548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "\n"
209648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "out int xfb_result;\n"
209748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "\n"
209848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "void main()\n"
209948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "{\n"
210048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "    switch(gl_VertexID)\n"
210148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "    {\n"
210248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "        case 0:\n"
210348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "            gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);\n"
210448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "            break;\n"
210548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "        case 1:\n"
210648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "            gl_Position = vec4( 1.0, 1.0, 0.0, 1.0);\n"
210748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "            break;\n"
210848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "        case 2:\n"
210948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "            gl_Position = vec4(-1.0,-1.0, 0.0, 1.0);\n"
211048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "            break;\n"
211148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "        case 3:\n"
211248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "            gl_Position = vec4( 1.0,-1.0, 0.0, 1.0);\n"
211348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "            break;\n"
211448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "    }\n"
211548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "\n"
211648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "    xfb_result = gl_VertexID;\n"
211748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "}\n";
211848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
211948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Fragment shader source program. */
212048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar FunctionalTest::s_fragment_shader[] = "#version 450\n"
212148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														"\n"
212248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														"out vec4 color;\n"
212348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														"\n"
212448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														"void main()\n"
212548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														"{\n"
212648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														"    color = vec4(1.0, 0.0, 0.0, 1.0);\n"
212748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos														"}\n";
212848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
212948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Name of transform feedback varying in vertex shader. */
213048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosconst glw::GLchar* FunctionalTest::s_xfb_varying_name = "xfb_result";
213148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
213248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* Queries namespace. */
213348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* DirectStateAccess namespace. */
213448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* gl4cts namespace. */
2135