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