• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _GL4CCONDITIONALRENDERINVERTEDTESTS_HPP
2 #define _GL4CCONDITIONALRENDERINVERTEDTESTS_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  gl4cConditionalRenderInvertedTests.hpp
29  * \brief Conformance tests for Conditional Render Inverted feature functionality.
30  */ /*------------------------------------------------------------------------------*/
31 
32 /* Includes. */
33 
34 #include "glcTestCase.hpp"
35 #include "glwDefs.hpp"
36 #include "tcuDefs.hpp"
37 
38 #include "glwEnums.hpp"
39 #include "glwFunctions.hpp"
40 
41 /* Interface. */
42 
43 namespace gl4cts
44 {
45 namespace ConditionalRenderInverted
46 {
47 /** @class Tests
48  *
49  *  @brief Conditional Render Inverted Test Group.
50  */
51 class Tests : public deqp::TestCaseGroup
52 {
53 public:
54 	/* Public member functions. */
55 	Tests(deqp::Context& context);
56 
57 	void init();
58 
59 private:
60 	/* Private member functions. */
61 	Tests(const Tests& other);
62 	Tests& operator=(const Tests& other);
63 };
64 
65 /** @class CoverageTest
66  *
67  *  @brief Conditional Render Inverted API Coverage Test.
68  *
69  *  The test checks that following modes:
70  *      QUERY_WAIT_INVERTED                             0x8E17,
71  *      QUERY_NO_WAIT_INVERTED                          0x8E18,
72  *      QUERY_BY_REGION_WAIT_INVERTED                   0x8E19,
73  *      QUERY_BY_REGION_NO_WAIT_INVERTED                0x8E1A,
74  *   are accepted by BeginConditionalRender.
75  *
76  *  See reference: ARB_conditional_render_inverted extension specification or
77  *                 Chapter 10 of the OpenGL 4.4 (Core Profile) Specification.
78  */
79 class CoverageTest : public deqp::TestCase
80 {
81 public:
82 	/* Public member functions. */
83 	CoverageTest(deqp::Context& context);
84 
85 	virtual tcu::TestNode::IterateResult iterate();
86 
87 private:
88 	/* Private member functions */
89 	CoverageTest(const CoverageTest& other);
90 	CoverageTest& operator=(const CoverageTest& other);
91 
92 	void createQueryObject();
93 	void clean();
94 	bool test(glw::GLenum mode);
95 
96 	/* Private member variables. */
97 	glw::GLuint m_qo_id;
98 };
99 /* class CoverageTest */
100 
101 /** @class FunctionalTest
102  *
103  *  @brief Conditional Render Inverted Functional Test.
104  *
105  *  The test runs as follows:
106  *
107  *  Prepare program consisting of vertex and fragment shader which draws
108  *  full screen quad depending on vertex ID. Fragment shader shall be able
109  *  discard fragments depending on uniform value. Return color shall also be
110  *  controlled by uniform. Prepare 1x1 pixels' size framebuffer object with
111  *  R8 format.
112  *
113  *  For each render case,
114  *      for each query case,
115  *          for each conditional render inverted mode,
116  *              do the following:
117  *              - create query object;
118  *              - setup program to pass or discard fragments depending on
119  *                render case;
120  *              - setup color uniform to red component equal to 1;
121  *              - clear framebuffer with red color component equal to 0.5;
122  *              - draw quad using query object;
123  *              - check that fragments passed or not using query object
124  *                query;
125  *                if program behaved not as expected return failure;
126  *                note: query shall finish;
127  *              - setup program to pass all fragments;
128  *              - setup color uniform to red component equal to 0;
129  *              - draw using the conditional rendering;
130  *              - read framebuffer pixel;
131  *              - expect that red component of the pixel is 1.0 if render
132  *                case passes all pixels or 0.0 otherwise; if read color is
133  *                different than expected, return failure;
134  *              - cleanup query object.
135  *  After loop, cleanup program and framebuffer. Return pass if all tests
136  *  passed.
137  *
138  *  Test for following render cases:
139  *  - all fragments passes,
140  *  - all fragments are discarded.
141  *
142  *  Test for following query cases:
143  *  - SAMPLES_PASSED,
144  *  - GL_ANY_SAMPLES_PASSED.
145  *
146  *  Test for following conditional render inverted modes:
147  *  - QUERY_WAIT_INVERTED,
148  *  - QUERY_NO_WAIT_INVERTED,
149  *  - QUERY_BY_REGION_WAIT_INVERTED,
150  *  - QUERY_BY_REGION_NO_WAIT_INVERTED.
151  *
152  *  See reference: ARB_conditional_render_inverted extension specification or
153  *                 Chapter 10 of the OpenGL 4.4 (Core Profile) Specification.
154  */
155 class FunctionalTest : public deqp::TestCase
156 {
157 public:
158 	/* Public member functions. */
159 	FunctionalTest(deqp::Context& context);
160 
161 	virtual tcu::TestNode::IterateResult iterate();
162 
163 private:
164 	/* Private member functions. */
165 	FunctionalTest(const FunctionalTest& other);
166 	FunctionalTest& operator=(const FunctionalTest& other);
167 
168 	void createProgram();
169 	void createVertexArrayObject();
170 	void createView();
171 	void createQueryObject();
172 	void setupColor(const glw::GLfloat red);
173 	void setupPassSwitch(const bool shall_pass);
174 	void clearView();
175 
176 	void draw(const bool conditional_or_query_draw, const glw::GLenum condition_mode_or_query_target);
177 
178 	bool		 fragmentsPassed();
179 	glw::GLfloat readPixel();
180 	void		 cleanQueryObject();
181 	void		 cleanProgramViewAndVAO();
182 
183 	/* Private member variables. */
184 	glw::GLuint m_fbo_id; //!<    Test's framebuffer object id.
185 	glw::GLuint m_rbo_id; //!<    Test's renderbuffer object id.
186 	glw::GLuint m_vao_id; //!<    Test's vertex array object id.
187 	glw::GLuint m_po_id;  //!<    Test's program object id.
188 	glw::GLuint m_qo_id;  //!<    Test's query object id.
189 
190 	/* Private static constants. */
191 	static const glw::GLchar s_vertex_shader[];		 //!<    Vertex shader source code.
192 	static const glw::GLchar s_fragment_shader[];	//!<    Fragment shader source code.
193 	static const glw::GLchar s_color_uniform_name[]; //!<    Name of the color uniform.
194 	static const glw::GLchar
195 							 s_pass_switch_uniform_name[]; //!<    Name of the fragment pass or discarded uniform switch.
196 	static const glw::GLuint s_view_size;				   //!<    Size of view (1 by design).
197 };
198 /* class FunctionalTest*/
199 
200 namespace Utilities
201 {
202 const glw::GLchar* modeToChars(glw::GLenum mode);
203 const glw::GLchar* queryTargetToChars(glw::GLenum mode);
204 }
205 
206 } /* ConditionalRenderInverted namespace */
207 } /* gl4cts namespace */
208 
209 #endif // _GL4CCONDITIONALRENDERINVERTEDTESTS_HPP
210