blob: 27a8d99c52b9e6ecd5666ecb08d2bbdcb85eddbe [file] [log] [blame]
#ifndef _GL4CCONTEXTFLUSHCONTROLTESTS_HPP
#define _GL4CCONTEXTFLUSHCONTROLTESTS_HPP
/*-------------------------------------------------------------------------
* OpenGL Conformance Test Suite
* -----------------------------
*
* Copyright (c) 2015-2016 The Khronos Group Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/ /*!
* \file
* \brief
*/ /*-------------------------------------------------------------------*/
/**
*/ /*!
* \file gl3cClipDistance.hpp
* \brief Conformance tests for Context Flush Control feature functionality.
*/ /*-------------------------------------------------------------------*/
#include "glcTestCase.hpp"
#include "glwDefs.hpp"
#include "tcuDefs.hpp"
/* Includes. */
#include <map>
#include <string>
#include <typeinfo>
#include <vector>
#include "glwEnums.hpp"
#include "glwFunctions.hpp"
namespace gl4cts
{
namespace ContextFlushControl
{
/** @class Tests
*
* @brief Context Flush Control test group.
*
* The test checks that functions GetIntegerv, GetFloatv, GetBooleanv, GetDoublev and
* GetInteger64v accept parameter name GL_CONTEXT_RELEASE_BEHAVIOR and for
* default context returns GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH.
*
* If building target supports context flush (GLX framework which supports
* GLX_ARB_context_flush_control or WGL framework which supports
* WGL_ARB_context_flush_control) test makes new context with enabled context
* flush control functionality. Coverage test is repeated with this context and
* GL_NONE is expected to be returned.
*
* For reference see KHR_context_flush_control extension.
*
* The Pass result is returned when tests succeeded, Fail is returned otherwise.
*/
class Tests : public deqp::TestCaseGroup
{
public:
/* Public member functions */
Tests(deqp::Context& context);
void init();
private:
/* Private member functions */
Tests(const Tests& other);
Tests& operator=(const Tests& other);
};
/** @class CoverageTest
*
* @brief Context Flush Control API Coverage test.
*/
class CoverageTest : public deqp::TestCase
{
public:
/* Public member functions */
CoverageTest(deqp::Context& context);
virtual tcu::TestNode::IterateResult iterate();
private:
/* Private member functions */
CoverageTest(const CoverageTest& other);
CoverageTest& operator=(const CoverageTest& other);
bool testQuery(glu::RenderContext& context, glw::GLenum expected_value);
glu::RenderContext* createNoFlushContext();
};
/** @class FunctionalTest
*
* @brief Context Flush Control Functional test.
*
* Test runs only if building target supports context flush (GLX framework
* which supports GLX_ARB_context_flush_control or WGL framework which
* supports WGL_ARB_context_flush_control). Test prepares 4 contexts: two with
* enabled context flush control and two with disabled context flush
* control. Next, run-time of following procedure is measured:
*
* for n times do
* draw triangle
* switch context
*
* The function is running using two contexts with enabled context control flush
* and using two contexts with disabled context control flush. It is expected that
* case without flush on context switch control will be faster than the with
* case which flushes functionality. Test sets pass if expected behavior has
* been measured. The quality warning is triggered when test fails. Not supported
* result is returned if context does not support contxt flush control.
*
* The test is based on KHR_context_flush_control extension overview, that the main reason
* for no-flush context is to increase the performance of the implementation.
*/
class FunctionalTest : public deqp::TestCase
{
public:
/* Public member functions */
FunctionalTest(deqp::Context& context);
virtual tcu::TestNode::IterateResult iterate();
private:
/* Private member functions */
FunctionalTest(const FunctionalTest& other);
FunctionalTest& operator=(const FunctionalTest& other);
glw::GLfloat testTime(bool shall_flush_on_release);
/** @brief Draw Setup class to encapsulate context with framebuffer and shader program.
*
* The context and within framebuffer, renderbuffer, vertex array object,
* shader program is created on the construction. Using makeCurrent() one can swith to
* the encapsulated context. With draw() member function one can draw full screen quad.
* All objects are deallocated during object destruction.
*
* Context will flush or will not flush on makeCurrent() switch depending on
* constructor setup shall_flush_on_release.
*/
class DrawSetup
{
public:
DrawSetup(deqp::Context& test_context, bool shall_flush_on_release);
~DrawSetup();
void makeCurrent();
void draw();
private:
deqp::Context& m_test_context; //!< Test main context.
glu::RenderContext* m_context; //!< Render context of this draw setup.
glw::GLuint m_fbo; //!< OpenGL framebuffer object identifier (in m_context).
glw::GLuint m_rbo; //!< OpenGL renderbuffer object identifier (in m_context).
glw::GLuint m_vao; //!< OpenGL vertex array object identifier (in m_context).
glw::GLuint m_po; //!< OpenGL GLSL program object identifier (in m_context).
static const glw::GLuint s_view_size; //!< Framebuffer size (default 256).
static const glw::GLchar s_vertex_shader
[]; //!< Vertex shader source code (it draws quad using triangle strip depending on gl_VertexID).
static const glw::GLchar s_fragment_shader[]; //!< Fragment shader source code (setup vec4(1.0) as a color).
void createContext(bool shall_flush_on_release);
void createView();
void createGeometry();
void createProgram();
};
};
} /* ContextFlushControl namespace */
} /* gl4cts namespace */
#endif // _GL4CCONTEXTFLUSHCONTROLTESTS_HPP