Home | History | Annotate | Download | only in gl
      1 #ifndef _GL4CCONTEXTFLUSHCONTROLTESTS_HPP
      2 #define _GL4CCONTEXTFLUSHCONTROLTESTS_HPP
      3 /*-------------------------------------------------------------------------
      4  * OpenGL Conformance Test Suite
      5  * -----------------------------
      6  *
      7  * Copyright (c) 2015-2016 The Khronos Group Inc.
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  */ /*!
     22  * \file
     23  * \brief
     24  */ /*-------------------------------------------------------------------*/
     25 
     26 /**
     27  */ /*!
     28  * \file  gl3cClipDistance.hpp
     29  * \brief Conformance tests for Context Flush Control feature functionality.
     30  */ /*-------------------------------------------------------------------*/
     31 
     32 #include "glcTestCase.hpp"
     33 #include "glwDefs.hpp"
     34 #include "tcuDefs.hpp"
     35 
     36 /* Includes. */
     37 #include <map>
     38 #include <string>
     39 #include <typeinfo>
     40 #include <vector>
     41 
     42 #include "glwEnums.hpp"
     43 #include "glwFunctions.hpp"
     44 
     45 namespace gl4cts
     46 {
     47 namespace ContextFlushControl
     48 {
     49 /** @class Tests
     50  *
     51  *  @brief Context Flush Control test group.
     52  *
     53  *  The test checks that functions GetIntegerv, GetFloatv, GetBooleanv, GetDoublev and
     54  *  GetInteger64v accept parameter name GL_CONTEXT_RELEASE_BEHAVIOR and for
     55  *  default context returns GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH.
     56  *
     57  *  If building target supports context flush (GLX framework which supports
     58  *  GLX_ARB_context_flush_control or WGL framework which supports
     59  *  WGL_ARB_context_flush_control) test makes new context with enabled context
     60  *  flush control functionality. Coverage test is repeated with this context and
     61  *  GL_NONE is expected to be returned.
     62  *
     63  *  For reference see KHR_context_flush_control extension.
     64  *
     65  *  The Pass result is returned when tests succeeded, Fail is returned otherwise.
     66  */
     67 class Tests : public deqp::TestCaseGroup
     68 {
     69 public:
     70 	/* Public member functions */
     71 	Tests(deqp::Context& context);
     72 
     73 	void init();
     74 
     75 private:
     76 	/* Private member functions */
     77 	Tests(const Tests& other);
     78 	Tests& operator=(const Tests& other);
     79 };
     80 
     81 /** @class CoverageTest
     82  *
     83  *  @brief Context Flush Control API Coverage test.
     84  */
     85 class CoverageTest : public deqp::TestCase
     86 {
     87 public:
     88 	/* Public member functions */
     89 	CoverageTest(deqp::Context& context);
     90 
     91 	virtual tcu::TestNode::IterateResult iterate();
     92 
     93 private:
     94 	/* Private member functions */
     95 	CoverageTest(const CoverageTest& other);
     96 	CoverageTest& operator=(const CoverageTest& other);
     97 
     98 	bool testQuery(glu::RenderContext& context, glw::GLenum expected_value);
     99 	glu::RenderContext* createNoFlushContext();
    100 };
    101 
    102 /** @class FunctionalTest
    103  *
    104  *  @brief Context Flush Control Functional test.
    105  *
    106  *  Test runs only if building target supports context flush (GLX framework
    107  *  which supports GLX_ARB_context_flush_control or WGL framework which
    108  *  supports WGL_ARB_context_flush_control). Test prepares 4 contexts: two with
    109  *  enabled context flush control and two with disabled context flush
    110  *  control. Next, run-time of following procedure is measured:
    111  *
    112  *      for n times do
    113  *          draw triangle
    114  *          switch context
    115  *
    116  *  The function is running using two contexts with enabled context control flush
    117  *  and using two contexts with disabled context control flush. It is expected that
    118  *  case without flush on context switch control will be faster than the with
    119  *  case which flushes functionality. Test sets pass if expected behavior has
    120  *  been measured. The quality warning is triggered when test fails. Not supported
    121  *  result is returned if context does not support contxt flush control.
    122  *
    123  *  The test is based on KHR_context_flush_control extension overview, that the main reason
    124  *  for no-flush context is to increase the performance of the implementation.
    125  */
    126 class FunctionalTest : public deqp::TestCase
    127 {
    128 public:
    129 	/* Public member functions */
    130 	FunctionalTest(deqp::Context& context);
    131 
    132 	virtual tcu::TestNode::IterateResult iterate();
    133 
    134 private:
    135 	/* Private member functions */
    136 	FunctionalTest(const FunctionalTest& other);
    137 	FunctionalTest& operator=(const FunctionalTest& other);
    138 
    139 	glw::GLfloat testTime(bool shall_flush_on_release);
    140 
    141 	/** @brief Draw Setup class to encapsulate context with framebuffer and shader program.
    142 	 *
    143 	 *  The context and within framebuffer, renderbuffer, vertex array object,
    144 	 *  shader program is created on the construction. Using makeCurrent() one can swith to
    145 	 *  the encapsulated context. With draw() member function one can draw full screen quad.
    146 	 *  All objects are deallocated during object destruction.
    147 	 *
    148 	 *  Context will flush or will not flush on makeCurrent() switch depending on
    149 	 *  constructor setup shall_flush_on_release.
    150 	 */
    151 	class DrawSetup
    152 	{
    153 	public:
    154 		DrawSetup(deqp::Context& test_context, bool shall_flush_on_release);
    155 		~DrawSetup();
    156 
    157 		void makeCurrent();
    158 		void draw();
    159 
    160 	private:
    161 		deqp::Context&		m_test_context; //!< Test main context.
    162 		glu::RenderContext* m_context;		//!< Render context of this draw setup.
    163 		glw::GLuint			m_fbo;			//!< OpenGL framebuffer object identifier (in m_context).
    164 		glw::GLuint			m_rbo;			//!< OpenGL renderbuffer object identifier (in m_context).
    165 		glw::GLuint			m_vao;			//!< OpenGL vertex array object identifier (in m_context).
    166 		glw::GLuint			m_po;			//!< OpenGL GLSL program object identifier (in m_context).
    167 
    168 		static const glw::GLuint s_view_size; //!< Framebuffer size (default 256).
    169 		static const glw::GLchar s_vertex_shader
    170 			[]; //!< Vertex shader source code (it draws quad using triangle strip depending on gl_VertexID).
    171 		static const glw::GLchar s_fragment_shader[]; //!< Fragment shader source code (setup vec4(1.0) as a color).
    172 
    173 		void createContext(bool shall_flush_on_release);
    174 		void createView();
    175 		void createGeometry();
    176 		void createProgram();
    177 	};
    178 };
    179 
    180 } /* ContextFlushControl namespace */
    181 } /* gl4cts namespace */
    182 #endif // _GL4CCONTEXTFLUSHCONTROLTESTS_HPP
    183