xref: /aosp_15_r20/external/deqp/external/openglcts/modules/gl/gl4cConditionalRenderInvertedTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * OpenGL Conformance Test Suite
3*35238bceSAndroid Build Coastguard Worker  * -----------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright (c) 2015-2016 The Khronos Group Inc.
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  */ /*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief
22*35238bceSAndroid Build Coastguard Worker  */ /*-------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker /* Includes. */
25*35238bceSAndroid Build Coastguard Worker #include "gl4cConditionalRenderInvertedTests.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluDefs.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker /******************************** Test Group Implementation       ********************************/
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker /** @brief Context Flush Control tests group constructor.
35*35238bceSAndroid Build Coastguard Worker  *
36*35238bceSAndroid Build Coastguard Worker  *  @param [in] context     OpenGL context.
37*35238bceSAndroid Build Coastguard Worker  */
Tests(deqp::Context & context)38*35238bceSAndroid Build Coastguard Worker gl4cts::ConditionalRenderInverted::Tests::Tests(deqp::Context &context)
39*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "conditional_render_inverted", "Conditional Render Inverted Test Suite")
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker     /* Intentionally left blank */
42*35238bceSAndroid Build Coastguard Worker }
43*35238bceSAndroid Build Coastguard Worker 
44*35238bceSAndroid Build Coastguard Worker /** @brief Context Flush Control tests initializer. */
init()45*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::Tests::init()
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker     addChild(new gl4cts::ConditionalRenderInverted::CoverageTest(m_context));
48*35238bceSAndroid Build Coastguard Worker     addChild(new gl4cts::ConditionalRenderInverted::FunctionalTest(m_context));
49*35238bceSAndroid Build Coastguard Worker }
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker /******************************** Coverage Tests Implementation   ********************************/
52*35238bceSAndroid Build Coastguard Worker 
53*35238bceSAndroid Build Coastguard Worker /** @brief API coverage tests constructor.
54*35238bceSAndroid Build Coastguard Worker  *
55*35238bceSAndroid Build Coastguard Worker  *  @param [in] context     OpenGL context.
56*35238bceSAndroid Build Coastguard Worker  */
CoverageTest(deqp::Context & context)57*35238bceSAndroid Build Coastguard Worker gl4cts::ConditionalRenderInverted::CoverageTest::CoverageTest(deqp::Context &context)
58*35238bceSAndroid Build Coastguard Worker     : deqp::TestCase(context, "coverage", "Conditional Render Inverted Coverage Test")
59*35238bceSAndroid Build Coastguard Worker     , m_qo_id(0)
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker     /* Intentionally left blank. */
62*35238bceSAndroid Build Coastguard Worker }
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker /** @brief Iterate API coverage tests.
65*35238bceSAndroid Build Coastguard Worker  *
66*35238bceSAndroid Build Coastguard Worker  *  @return Iteration result.
67*35238bceSAndroid Build Coastguard Worker  */
iterate()68*35238bceSAndroid Build Coastguard Worker tcu::TestNode::IterateResult gl4cts::ConditionalRenderInverted::CoverageTest::iterate()
69*35238bceSAndroid Build Coastguard Worker {
70*35238bceSAndroid Build Coastguard Worker     /* OpenGL support query. */
71*35238bceSAndroid Build Coastguard Worker     bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
72*35238bceSAndroid Build Coastguard Worker     bool is_arb_conditional_render_inverted =
73*35238bceSAndroid Build Coastguard Worker         m_context.getContextInfo().isExtensionSupported("GL_ARB_conditional_render_inverted");
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker     /* Running tests. */
76*35238bceSAndroid Build Coastguard Worker     bool is_ok    = true;
77*35238bceSAndroid Build Coastguard Worker     bool is_error = false;
78*35238bceSAndroid Build Coastguard Worker 
79*35238bceSAndroid Build Coastguard Worker     /* This test should only be executed if we're running a GL4.5 context or related extension is available */
80*35238bceSAndroid Build Coastguard Worker     try
81*35238bceSAndroid Build Coastguard Worker     {
82*35238bceSAndroid Build Coastguard Worker         if (is_at_least_gl_45 || is_arb_conditional_render_inverted)
83*35238bceSAndroid Build Coastguard Worker         {
84*35238bceSAndroid Build Coastguard Worker             /* Prepare common objects. */
85*35238bceSAndroid Build Coastguard Worker             createQueryObject();
86*35238bceSAndroid Build Coastguard Worker 
87*35238bceSAndroid Build Coastguard Worker             /* Test cases. */
88*35238bceSAndroid Build Coastguard Worker             static const glw::GLenum modes[] = {GL_QUERY_WAIT_INVERTED, GL_QUERY_NO_WAIT_INVERTED,
89*35238bceSAndroid Build Coastguard Worker                                                 GL_QUERY_BY_REGION_WAIT_INVERTED, GL_QUERY_BY_REGION_NO_WAIT_INVERTED};
90*35238bceSAndroid Build Coastguard Worker 
91*35238bceSAndroid Build Coastguard Worker             static const glw::GLuint modes_count = sizeof(modes) / sizeof(modes[0]);
92*35238bceSAndroid Build Coastguard Worker 
93*35238bceSAndroid Build Coastguard Worker             /* Iterate over the test cases. */
94*35238bceSAndroid Build Coastguard Worker             for (glw::GLuint i = 0; i < modes_count; ++i)
95*35238bceSAndroid Build Coastguard Worker             {
96*35238bceSAndroid Build Coastguard Worker                 is_ok &= test(modes[i]);
97*35238bceSAndroid Build Coastguard Worker             }
98*35238bceSAndroid Build Coastguard Worker         }
99*35238bceSAndroid Build Coastguard Worker     }
100*35238bceSAndroid Build Coastguard Worker     catch (...)
101*35238bceSAndroid Build Coastguard Worker     {
102*35238bceSAndroid Build Coastguard Worker         is_ok    = false;
103*35238bceSAndroid Build Coastguard Worker         is_error = true;
104*35238bceSAndroid Build Coastguard Worker     }
105*35238bceSAndroid Build Coastguard Worker 
106*35238bceSAndroid Build Coastguard Worker     /* Cleanup. */
107*35238bceSAndroid Build Coastguard Worker     clean();
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker     /* Result's setup. */
110*35238bceSAndroid Build Coastguard Worker     if (is_ok)
111*35238bceSAndroid Build Coastguard Worker     {
112*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
113*35238bceSAndroid Build Coastguard Worker     }
114*35238bceSAndroid Build Coastguard Worker     else
115*35238bceSAndroid Build Coastguard Worker     {
116*35238bceSAndroid Build Coastguard Worker         if (is_error)
117*35238bceSAndroid Build Coastguard Worker         {
118*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog()
119*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::Message
120*35238bceSAndroid Build Coastguard Worker                 << "Internal error has occured during Conditional Render Inverted Coverage Test."
121*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::EndMessage;
122*35238bceSAndroid Build Coastguard Worker 
123*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Test error.");
124*35238bceSAndroid Build Coastguard Worker         }
125*35238bceSAndroid Build Coastguard Worker         else
126*35238bceSAndroid Build Coastguard Worker         {
127*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog()
128*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::Message << "The Conditional Render Inverted Coverage Test has failed."
129*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::EndMessage;
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
132*35238bceSAndroid Build Coastguard Worker         }
133*35238bceSAndroid Build Coastguard Worker     }
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker     return STOP;
136*35238bceSAndroid Build Coastguard Worker }
137*35238bceSAndroid Build Coastguard Worker 
138*35238bceSAndroid Build Coastguard Worker /** @brief Create query object.
139*35238bceSAndroid Build Coastguard Worker  */
createQueryObject()140*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::CoverageTest::createQueryObject()
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
143*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker     /* Create valid query object. */
146*35238bceSAndroid Build Coastguard Worker     gl.genQueries(1, &m_qo_id);
147*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries() call failed.");
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker     gl.beginQuery(GL_SAMPLES_PASSED, m_qo_id);
150*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginQuery() call failed.");
151*35238bceSAndroid Build Coastguard Worker 
152*35238bceSAndroid Build Coastguard Worker     gl.endQuery(GL_SAMPLES_PASSED);
153*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glEndQuery() call failed.");
154*35238bceSAndroid Build Coastguard Worker }
155*35238bceSAndroid Build Coastguard Worker 
156*35238bceSAndroid Build Coastguard Worker /** @brief Clean query object and error values.
157*35238bceSAndroid Build Coastguard Worker  */
clean()158*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::CoverageTest::clean()
159*35238bceSAndroid Build Coastguard Worker {
160*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
161*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker     /* Clean query object. */
164*35238bceSAndroid Build Coastguard Worker     gl.deleteQueries(1, &m_qo_id);
165*35238bceSAndroid Build Coastguard Worker 
166*35238bceSAndroid Build Coastguard Worker     m_qo_id = 0;
167*35238bceSAndroid Build Coastguard Worker 
168*35238bceSAndroid Build Coastguard Worker     /* Make sure no errors are left. */
169*35238bceSAndroid Build Coastguard Worker     while (gl.getError())
170*35238bceSAndroid Build Coastguard Worker         ;
171*35238bceSAndroid Build Coastguard Worker }
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker /** @brief Test that glBeginConditionalRender accept mode.
174*35238bceSAndroid Build Coastguard Worker  *
175*35238bceSAndroid Build Coastguard Worker  *  @param [in] mode    Render condition mode.
176*35238bceSAndroid Build Coastguard Worker  *
177*35238bceSAndroid Build Coastguard Worker  *  @return True if glBeginConditionalRender did not generate an error, false otherwise.
178*35238bceSAndroid Build Coastguard Worker  */
test(glw::GLenum mode)179*35238bceSAndroid Build Coastguard Worker bool gl4cts::ConditionalRenderInverted::CoverageTest::test(glw::GLenum mode)
180*35238bceSAndroid Build Coastguard Worker {
181*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
182*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
183*35238bceSAndroid Build Coastguard Worker 
184*35238bceSAndroid Build Coastguard Worker     /* Default return value;*/
185*35238bceSAndroid Build Coastguard Worker     bool is_no_error = true;
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker     /* Test. */
188*35238bceSAndroid Build Coastguard Worker     gl.beginConditionalRender(m_qo_id, mode);
189*35238bceSAndroid Build Coastguard Worker 
190*35238bceSAndroid Build Coastguard Worker     while (GL_NO_ERROR != gl.getError())
191*35238bceSAndroid Build Coastguard Worker     {
192*35238bceSAndroid Build Coastguard Worker         is_no_error = false;
193*35238bceSAndroid Build Coastguard Worker     }
194*35238bceSAndroid Build Coastguard Worker 
195*35238bceSAndroid Build Coastguard Worker     /* Clean up. */
196*35238bceSAndroid Build Coastguard Worker     if (is_no_error)
197*35238bceSAndroid Build Coastguard Worker     {
198*35238bceSAndroid Build Coastguard Worker         gl.endConditionalRender();
199*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glEndConditionalRender() call failed.");
200*35238bceSAndroid Build Coastguard Worker     }
201*35238bceSAndroid Build Coastguard Worker 
202*35238bceSAndroid Build Coastguard Worker     /* Logging. */
203*35238bceSAndroid Build Coastguard Worker     if (!is_no_error)
204*35238bceSAndroid Build Coastguard Worker     {
205*35238bceSAndroid Build Coastguard Worker         m_context.getTestContext().getLog()
206*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::Message << "glBeginConditionalRender failed when used with mode "
207*35238bceSAndroid Build Coastguard Worker             << Utilities::modeToChars(mode) << "." << tcu::TestLog::EndMessage;
208*35238bceSAndroid Build Coastguard Worker     }
209*35238bceSAndroid Build Coastguard Worker 
210*35238bceSAndroid Build Coastguard Worker     /* Return test result. */
211*35238bceSAndroid Build Coastguard Worker     return is_no_error;
212*35238bceSAndroid Build Coastguard Worker }
213*35238bceSAndroid Build Coastguard Worker 
214*35238bceSAndroid Build Coastguard Worker /******************************** Functional Test Implementation   ********************************/
215*35238bceSAndroid Build Coastguard Worker 
216*35238bceSAndroid Build Coastguard Worker /** @brief Functional test constructor.
217*35238bceSAndroid Build Coastguard Worker  *
218*35238bceSAndroid Build Coastguard Worker  *  @param [in] context     OpenGL context.
219*35238bceSAndroid Build Coastguard Worker  */
FunctionalTest(deqp::Context & context)220*35238bceSAndroid Build Coastguard Worker gl4cts::ConditionalRenderInverted::FunctionalTest::FunctionalTest(deqp::Context &context)
221*35238bceSAndroid Build Coastguard Worker     : deqp::TestCase(context, "functional", "Conditional Render Inverted Functional Test")
222*35238bceSAndroid Build Coastguard Worker     , m_fbo_id(0)
223*35238bceSAndroid Build Coastguard Worker     , m_rbo_id(0)
224*35238bceSAndroid Build Coastguard Worker     , m_vao_id(0)
225*35238bceSAndroid Build Coastguard Worker     , m_po_id(0)
226*35238bceSAndroid Build Coastguard Worker     , m_qo_id(0)
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker     /* Intentionally left blank. */
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker 
231*35238bceSAndroid Build Coastguard Worker /** @brief Iterate Functional test cases.
232*35238bceSAndroid Build Coastguard Worker  *
233*35238bceSAndroid Build Coastguard Worker  *  @return Iteration result.
234*35238bceSAndroid Build Coastguard Worker  */
iterate()235*35238bceSAndroid Build Coastguard Worker tcu::TestNode::IterateResult gl4cts::ConditionalRenderInverted::FunctionalTest::iterate()
236*35238bceSAndroid Build Coastguard Worker {
237*35238bceSAndroid Build Coastguard Worker     /* OpenGL support query. */
238*35238bceSAndroid Build Coastguard Worker     bool is_at_least_gl_45 = (glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::core(4, 5)));
239*35238bceSAndroid Build Coastguard Worker     bool is_arb_conditional_render_inverted =
240*35238bceSAndroid Build Coastguard Worker         m_context.getContextInfo().isExtensionSupported("GL_ARB_conditional_render_inverted");
241*35238bceSAndroid Build Coastguard Worker 
242*35238bceSAndroid Build Coastguard Worker     /* Running tests. */
243*35238bceSAndroid Build Coastguard Worker     bool is_ok    = true;
244*35238bceSAndroid Build Coastguard Worker     bool is_error = false;
245*35238bceSAndroid Build Coastguard Worker 
246*35238bceSAndroid Build Coastguard Worker     /* This test should only be executed if we're running a GL4.5 context or related extension is available */
247*35238bceSAndroid Build Coastguard Worker     try
248*35238bceSAndroid Build Coastguard Worker     {
249*35238bceSAndroid Build Coastguard Worker         if (is_at_least_gl_45 || is_arb_conditional_render_inverted)
250*35238bceSAndroid Build Coastguard Worker         {
251*35238bceSAndroid Build Coastguard Worker             /* Test cases. */
252*35238bceSAndroid Build Coastguard Worker             static const bool render_cases[] = {false, true};
253*35238bceSAndroid Build Coastguard Worker 
254*35238bceSAndroid Build Coastguard Worker             static const glw::GLuint render_cases_count = sizeof(render_cases) / sizeof(render_cases[0]);
255*35238bceSAndroid Build Coastguard Worker 
256*35238bceSAndroid Build Coastguard Worker             static const glw::GLenum query_cases[] = {GL_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED};
257*35238bceSAndroid Build Coastguard Worker 
258*35238bceSAndroid Build Coastguard Worker             static const glw::GLuint query_cases_count = sizeof(query_cases) / sizeof(query_cases[0]);
259*35238bceSAndroid Build Coastguard Worker 
260*35238bceSAndroid Build Coastguard Worker             static const glw::GLenum modes[] = {GL_QUERY_WAIT_INVERTED, GL_QUERY_NO_WAIT_INVERTED,
261*35238bceSAndroid Build Coastguard Worker                                                 GL_QUERY_BY_REGION_WAIT_INVERTED, GL_QUERY_BY_REGION_NO_WAIT_INVERTED};
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker             static const glw::GLuint modes_count = sizeof(modes) / sizeof(modes[0]);
264*35238bceSAndroid Build Coastguard Worker 
265*35238bceSAndroid Build Coastguard Worker             /* Creating common objects. */
266*35238bceSAndroid Build Coastguard Worker             createProgram();
267*35238bceSAndroid Build Coastguard Worker             createView();
268*35238bceSAndroid Build Coastguard Worker             createVertexArrayObject();
269*35238bceSAndroid Build Coastguard Worker 
270*35238bceSAndroid Build Coastguard Worker             /* Iterating over test cases. */
271*35238bceSAndroid Build Coastguard Worker             for (glw::GLuint i = 0; i < render_cases_count; ++i)
272*35238bceSAndroid Build Coastguard Worker             {
273*35238bceSAndroid Build Coastguard Worker                 for (glw::GLuint j = 0; j < query_cases_count; ++j)
274*35238bceSAndroid Build Coastguard Worker                 {
275*35238bceSAndroid Build Coastguard Worker                     for (glw::GLuint k = 0; k < modes_count; ++k)
276*35238bceSAndroid Build Coastguard Worker                     {
277*35238bceSAndroid Build Coastguard Worker                         createQueryObject();
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker                         setupColor(1.f);
280*35238bceSAndroid Build Coastguard Worker                         setupPassSwitch(render_cases[i]);
281*35238bceSAndroid Build Coastguard Worker                         clearView();
282*35238bceSAndroid Build Coastguard Worker                         draw(false, query_cases[j]);
283*35238bceSAndroid Build Coastguard Worker 
284*35238bceSAndroid Build Coastguard Worker                         if (render_cases[i] == fragmentsPassed())
285*35238bceSAndroid Build Coastguard Worker                         {
286*35238bceSAndroid Build Coastguard Worker                             setupColor(0.f);
287*35238bceSAndroid Build Coastguard Worker                             setupPassSwitch(true);
288*35238bceSAndroid Build Coastguard Worker                             draw(true, modes[k]);
289*35238bceSAndroid Build Coastguard Worker 
290*35238bceSAndroid Build Coastguard Worker                             glw::GLfloat expected_value = (render_cases[i]) ? 1.f : 0.f;
291*35238bceSAndroid Build Coastguard Worker                             glw::GLfloat resulted_value = readPixel();
292*35238bceSAndroid Build Coastguard Worker 
293*35238bceSAndroid Build Coastguard Worker                             if (de::abs(expected_value - resulted_value) > 0.0078125f /* Precission (1/128) */)
294*35238bceSAndroid Build Coastguard Worker                             {
295*35238bceSAndroid Build Coastguard Worker                                 m_context.getTestContext().getLog()
296*35238bceSAndroid Build Coastguard Worker                                     << tcu::TestLog::Message << "The functional test's expected value ("
297*35238bceSAndroid Build Coastguard Worker                                     << expected_value << ") is different than resulted value (" << resulted_value
298*35238bceSAndroid Build Coastguard Worker                                     << "). The tested mode was " << Utilities::modeToChars(modes[k])
299*35238bceSAndroid Build Coastguard Worker                                     << ". Query was done for target " << Utilities::queryTargetToChars(query_cases[j])
300*35238bceSAndroid Build Coastguard Worker                                     << ", and the test was prepared to " << ((render_cases[i]) ? "pass" : "discard")
301*35238bceSAndroid Build Coastguard Worker                                     << " all fragments." << tcu::TestLog::EndMessage;
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker                                 is_ok = false;
304*35238bceSAndroid Build Coastguard Worker                             }
305*35238bceSAndroid Build Coastguard Worker                         }
306*35238bceSAndroid Build Coastguard Worker                         else
307*35238bceSAndroid Build Coastguard Worker                         {
308*35238bceSAndroid Build Coastguard Worker                             is_ok = false;
309*35238bceSAndroid Build Coastguard Worker                         }
310*35238bceSAndroid Build Coastguard Worker 
311*35238bceSAndroid Build Coastguard Worker                         cleanQueryObject();
312*35238bceSAndroid Build Coastguard Worker                     }
313*35238bceSAndroid Build Coastguard Worker                 }
314*35238bceSAndroid Build Coastguard Worker             }
315*35238bceSAndroid Build Coastguard Worker         }
316*35238bceSAndroid Build Coastguard Worker     }
317*35238bceSAndroid Build Coastguard Worker     catch (...)
318*35238bceSAndroid Build Coastguard Worker     {
319*35238bceSAndroid Build Coastguard Worker         is_ok    = false;
320*35238bceSAndroid Build Coastguard Worker         is_error = true;
321*35238bceSAndroid Build Coastguard Worker 
322*35238bceSAndroid Build Coastguard Worker         cleanQueryObject();
323*35238bceSAndroid Build Coastguard Worker     }
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker     /* Clean-up. */
326*35238bceSAndroid Build Coastguard Worker     cleanProgramViewAndVAO();
327*35238bceSAndroid Build Coastguard Worker 
328*35238bceSAndroid Build Coastguard Worker     /* Result's setup. */
329*35238bceSAndroid Build Coastguard Worker     if (is_ok)
330*35238bceSAndroid Build Coastguard Worker     {
331*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
332*35238bceSAndroid Build Coastguard Worker     }
333*35238bceSAndroid Build Coastguard Worker     else
334*35238bceSAndroid Build Coastguard Worker     {
335*35238bceSAndroid Build Coastguard Worker         if (is_error)
336*35238bceSAndroid Build Coastguard Worker         {
337*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog()
338*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::Message
339*35238bceSAndroid Build Coastguard Worker                 << "Internal error has occured during Conditional Render Inverted Functional Test."
340*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::EndMessage;
341*35238bceSAndroid Build Coastguard Worker 
342*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Test error.");
343*35238bceSAndroid Build Coastguard Worker         }
344*35238bceSAndroid Build Coastguard Worker         else
345*35238bceSAndroid Build Coastguard Worker         {
346*35238bceSAndroid Build Coastguard Worker             m_context.getTestContext().getLog()
347*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::Message << "The Conditional Render Inverted Functional Test has failed."
348*35238bceSAndroid Build Coastguard Worker                 << tcu::TestLog::EndMessage;
349*35238bceSAndroid Build Coastguard Worker 
350*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail.");
351*35238bceSAndroid Build Coastguard Worker         }
352*35238bceSAndroid Build Coastguard Worker     }
353*35238bceSAndroid Build Coastguard Worker 
354*35238bceSAndroid Build Coastguard Worker     return STOP;
355*35238bceSAndroid Build Coastguard Worker }
356*35238bceSAndroid Build Coastguard Worker 
357*35238bceSAndroid Build Coastguard Worker /** @brief Compile and link test's GLSL program.
358*35238bceSAndroid Build Coastguard Worker  */
createProgram()359*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::createProgram()
360*35238bceSAndroid Build Coastguard Worker {
361*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
362*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
363*35238bceSAndroid Build Coastguard Worker 
364*35238bceSAndroid Build Coastguard Worker     struct Shader
365*35238bceSAndroid Build Coastguard Worker     {
366*35238bceSAndroid Build Coastguard Worker         glw::GLchar const *const source;
367*35238bceSAndroid Build Coastguard Worker         glw::GLenum const type;
368*35238bceSAndroid Build Coastguard Worker         glw::GLuint id;
369*35238bceSAndroid Build Coastguard Worker     } shader[] = {{s_vertex_shader, GL_VERTEX_SHADER, 0}, {s_fragment_shader, GL_FRAGMENT_SHADER, 0}};
370*35238bceSAndroid Build Coastguard Worker 
371*35238bceSAndroid Build Coastguard Worker     glw::GLuint const shader_count = sizeof(shader) / sizeof(shader[0]);
372*35238bceSAndroid Build Coastguard Worker 
373*35238bceSAndroid Build Coastguard Worker     try
374*35238bceSAndroid Build Coastguard Worker     {
375*35238bceSAndroid Build Coastguard Worker         /* Create program. */
376*35238bceSAndroid Build Coastguard Worker         m_po_id = gl.createProgram();
377*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram call failed.");
378*35238bceSAndroid Build Coastguard Worker 
379*35238bceSAndroid Build Coastguard Worker         /* Shader compilation. */
380*35238bceSAndroid Build Coastguard Worker 
381*35238bceSAndroid Build Coastguard Worker         for (glw::GLuint i = 0; i < shader_count; ++i)
382*35238bceSAndroid Build Coastguard Worker         {
383*35238bceSAndroid Build Coastguard Worker             if (DE_NULL != shader[i].source)
384*35238bceSAndroid Build Coastguard Worker             {
385*35238bceSAndroid Build Coastguard Worker                 shader[i].id = gl.createShader(shader[i].type);
386*35238bceSAndroid Build Coastguard Worker 
387*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader call failed.");
388*35238bceSAndroid Build Coastguard Worker 
389*35238bceSAndroid Build Coastguard Worker                 gl.attachShader(m_po_id, shader[i].id);
390*35238bceSAndroid Build Coastguard Worker 
391*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader call failed.");
392*35238bceSAndroid Build Coastguard Worker 
393*35238bceSAndroid Build Coastguard Worker                 gl.shaderSource(shader[i].id, 1, &(shader[i].source), NULL);
394*35238bceSAndroid Build Coastguard Worker 
395*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource call failed.");
396*35238bceSAndroid Build Coastguard Worker 
397*35238bceSAndroid Build Coastguard Worker                 gl.compileShader(shader[i].id);
398*35238bceSAndroid Build Coastguard Worker 
399*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader call failed.");
400*35238bceSAndroid Build Coastguard Worker 
401*35238bceSAndroid Build Coastguard Worker                 glw::GLint status = GL_FALSE;
402*35238bceSAndroid Build Coastguard Worker 
403*35238bceSAndroid Build Coastguard Worker                 gl.getShaderiv(shader[i].id, GL_COMPILE_STATUS, &status);
404*35238bceSAndroid Build Coastguard Worker                 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv call failed.");
405*35238bceSAndroid Build Coastguard Worker 
406*35238bceSAndroid Build Coastguard Worker                 if (GL_FALSE == status)
407*35238bceSAndroid Build Coastguard Worker                 {
408*35238bceSAndroid Build Coastguard Worker                     throw 0;
409*35238bceSAndroid Build Coastguard Worker                 }
410*35238bceSAndroid Build Coastguard Worker             }
411*35238bceSAndroid Build Coastguard Worker         }
412*35238bceSAndroid Build Coastguard Worker 
413*35238bceSAndroid Build Coastguard Worker         /* Link. */
414*35238bceSAndroid Build Coastguard Worker         gl.linkProgram(m_po_id);
415*35238bceSAndroid Build Coastguard Worker 
416*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glTransformFeedbackVaryings call failed.");
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker         glw::GLint status = GL_FALSE;
419*35238bceSAndroid Build Coastguard Worker 
420*35238bceSAndroid Build Coastguard Worker         gl.getProgramiv(m_po_id, GL_LINK_STATUS, &status);
421*35238bceSAndroid Build Coastguard Worker 
422*35238bceSAndroid Build Coastguard Worker         if (GL_TRUE == status)
423*35238bceSAndroid Build Coastguard Worker         {
424*35238bceSAndroid Build Coastguard Worker             for (glw::GLuint i = 0; i < shader_count; ++i)
425*35238bceSAndroid Build Coastguard Worker             {
426*35238bceSAndroid Build Coastguard Worker                 if (shader[i].id)
427*35238bceSAndroid Build Coastguard Worker                 {
428*35238bceSAndroid Build Coastguard Worker                     gl.detachShader(m_po_id, shader[i].id);
429*35238bceSAndroid Build Coastguard Worker 
430*35238bceSAndroid Build Coastguard Worker                     GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader call failed.");
431*35238bceSAndroid Build Coastguard Worker                 }
432*35238bceSAndroid Build Coastguard Worker             }
433*35238bceSAndroid Build Coastguard Worker         }
434*35238bceSAndroid Build Coastguard Worker         else
435*35238bceSAndroid Build Coastguard Worker         {
436*35238bceSAndroid Build Coastguard Worker             throw 0;
437*35238bceSAndroid Build Coastguard Worker         }
438*35238bceSAndroid Build Coastguard Worker     }
439*35238bceSAndroid Build Coastguard Worker     catch (...)
440*35238bceSAndroid Build Coastguard Worker     {
441*35238bceSAndroid Build Coastguard Worker         if (m_po_id)
442*35238bceSAndroid Build Coastguard Worker         {
443*35238bceSAndroid Build Coastguard Worker             gl.deleteProgram(m_po_id);
444*35238bceSAndroid Build Coastguard Worker 
445*35238bceSAndroid Build Coastguard Worker             m_po_id = 0;
446*35238bceSAndroid Build Coastguard Worker         }
447*35238bceSAndroid Build Coastguard Worker     }
448*35238bceSAndroid Build Coastguard Worker 
449*35238bceSAndroid Build Coastguard Worker     for (glw::GLuint i = 0; i < shader_count; ++i)
450*35238bceSAndroid Build Coastguard Worker     {
451*35238bceSAndroid Build Coastguard Worker         if (0 != shader[i].id)
452*35238bceSAndroid Build Coastguard Worker         {
453*35238bceSAndroid Build Coastguard Worker             gl.deleteShader(shader[i].id);
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker             shader[i].id = 0;
456*35238bceSAndroid Build Coastguard Worker         }
457*35238bceSAndroid Build Coastguard Worker     }
458*35238bceSAndroid Build Coastguard Worker 
459*35238bceSAndroid Build Coastguard Worker     if (m_po_id)
460*35238bceSAndroid Build Coastguard Worker     {
461*35238bceSAndroid Build Coastguard Worker         gl.useProgram(m_po_id);
462*35238bceSAndroid Build Coastguard Worker 
463*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram call failed.");
464*35238bceSAndroid Build Coastguard Worker     }
465*35238bceSAndroid Build Coastguard Worker }
466*35238bceSAndroid Build Coastguard Worker 
467*35238bceSAndroid Build Coastguard Worker /** @brief Create and bind framebuffer with renderbuffer color attachment.
468*35238bceSAndroid Build Coastguard Worker  */
createView()469*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::createView()
470*35238bceSAndroid Build Coastguard Worker {
471*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
472*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
473*35238bceSAndroid Build Coastguard Worker 
474*35238bceSAndroid Build Coastguard Worker     /* Prepare framebuffer. */
475*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.5f, 0.5f, 0.5f, 0.5f);
476*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor call failed.");
477*35238bceSAndroid Build Coastguard Worker 
478*35238bceSAndroid Build Coastguard Worker     gl.genFramebuffers(1, &m_fbo_id);
479*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGenFramebuffers call failed.");
480*35238bceSAndroid Build Coastguard Worker 
481*35238bceSAndroid Build Coastguard Worker     gl.genRenderbuffers(1, &m_rbo_id);
482*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGenRenderbuffers call failed.");
483*35238bceSAndroid Build Coastguard Worker 
484*35238bceSAndroid Build Coastguard Worker     gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo_id);
485*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glBindFramebuffer call failed.");
486*35238bceSAndroid Build Coastguard Worker 
487*35238bceSAndroid Build Coastguard Worker     gl.bindRenderbuffer(GL_RENDERBUFFER, m_rbo_id);
488*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glBindRenderbuffer call failed.");
489*35238bceSAndroid Build Coastguard Worker 
490*35238bceSAndroid Build Coastguard Worker     gl.renderbufferStorage(GL_RENDERBUFFER, GL_R8, s_view_size, s_view_size);
491*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glRenderbufferStorage call failed.");
492*35238bceSAndroid Build Coastguard Worker 
493*35238bceSAndroid Build Coastguard Worker     gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_rbo_id);
494*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glFramebufferRenderbuffer call failed.");
495*35238bceSAndroid Build Coastguard Worker 
496*35238bceSAndroid Build Coastguard Worker     if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
497*35238bceSAndroid Build Coastguard Worker     {
498*35238bceSAndroid Build Coastguard Worker         throw 0;
499*35238bceSAndroid Build Coastguard Worker     }
500*35238bceSAndroid Build Coastguard Worker 
501*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, s_view_size, s_view_size);
502*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glViewport call failed.");
503*35238bceSAndroid Build Coastguard Worker }
504*35238bceSAndroid Build Coastguard Worker 
505*35238bceSAndroid Build Coastguard Worker /** @brief Create test's query object.
506*35238bceSAndroid Build Coastguard Worker  */
createQueryObject()507*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::createQueryObject()
508*35238bceSAndroid Build Coastguard Worker {
509*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
510*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
511*35238bceSAndroid Build Coastguard Worker 
512*35238bceSAndroid Build Coastguard Worker     /* Create valid query object. */
513*35238bceSAndroid Build Coastguard Worker     gl.genQueries(1, &m_qo_id);
514*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries() call failed.");
515*35238bceSAndroid Build Coastguard Worker }
516*35238bceSAndroid Build Coastguard Worker 
517*35238bceSAndroid Build Coastguard Worker /** @brief Setup color uniform of the test's program.
518*35238bceSAndroid Build Coastguard Worker  */
setupColor(const glw::GLfloat red)519*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::setupColor(const glw::GLfloat red)
520*35238bceSAndroid Build Coastguard Worker {
521*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
522*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
523*35238bceSAndroid Build Coastguard Worker 
524*35238bceSAndroid Build Coastguard Worker     /* Fetch where to set. */
525*35238bceSAndroid Build Coastguard Worker     glw::GLuint location = gl.getUniformLocation(m_po_id, s_color_uniform_name);
526*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() call failed.");
527*35238bceSAndroid Build Coastguard Worker 
528*35238bceSAndroid Build Coastguard Worker     /* Set. */
529*35238bceSAndroid Build Coastguard Worker     gl.uniform1f(location, red);
530*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1f() call failed.");
531*35238bceSAndroid Build Coastguard Worker }
532*35238bceSAndroid Build Coastguard Worker 
533*35238bceSAndroid Build Coastguard Worker /** @brief Setup pass or discard switch uniform of the test's program.
534*35238bceSAndroid Build Coastguard Worker  */
setupPassSwitch(const bool shall_pass)535*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::setupPassSwitch(const bool shall_pass)
536*35238bceSAndroid Build Coastguard Worker {
537*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
538*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
539*35238bceSAndroid Build Coastguard Worker 
540*35238bceSAndroid Build Coastguard Worker     /* Fetch where to set. */
541*35238bceSAndroid Build Coastguard Worker     glw::GLuint location = gl.getUniformLocation(m_po_id, s_pass_switch_uniform_name);
542*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() call failed.");
543*35238bceSAndroid Build Coastguard Worker 
544*35238bceSAndroid Build Coastguard Worker     /* Set. */
545*35238bceSAndroid Build Coastguard Worker     gl.uniform1i(location, (int)shall_pass);
546*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1f() call failed.");
547*35238bceSAndroid Build Coastguard Worker }
548*35238bceSAndroid Build Coastguard Worker 
549*35238bceSAndroid Build Coastguard Worker /** @brief Draw full screen within query or conditional block.
550*35238bceSAndroid Build Coastguard Worker  *
551*35238bceSAndroid Build Coastguard Worker  *  @param [in] conditional_or_query_draw       If true draw will be done in conditional rendering block, otherwise in query block.
552*35238bceSAndroid Build Coastguard Worker  *  @param [in] condition_mode_or_query_target  The param needed by query or conditional block - target or mode.
553*35238bceSAndroid Build Coastguard Worker  */
draw(const bool conditional_or_query_draw,const glw::GLenum condition_mode_or_query_target)554*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::draw(const bool conditional_or_query_draw,
555*35238bceSAndroid Build Coastguard Worker                                                              const glw::GLenum condition_mode_or_query_target)
556*35238bceSAndroid Build Coastguard Worker {
557*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
558*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
559*35238bceSAndroid Build Coastguard Worker 
560*35238bceSAndroid Build Coastguard Worker     if (conditional_or_query_draw)
561*35238bceSAndroid Build Coastguard Worker     {
562*35238bceSAndroid Build Coastguard Worker         gl.beginConditionalRender(m_qo_id, condition_mode_or_query_target);
563*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginConditionalRender() call failed.");
564*35238bceSAndroid Build Coastguard Worker     }
565*35238bceSAndroid Build Coastguard Worker     else
566*35238bceSAndroid Build Coastguard Worker     {
567*35238bceSAndroid Build Coastguard Worker         gl.beginQuery(condition_mode_or_query_target, m_qo_id);
568*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginQuery() call failed.");
569*35238bceSAndroid Build Coastguard Worker     }
570*35238bceSAndroid Build Coastguard Worker 
571*35238bceSAndroid Build Coastguard Worker     gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
572*35238bceSAndroid Build Coastguard Worker 
573*35238bceSAndroid Build Coastguard Worker     if (conditional_or_query_draw)
574*35238bceSAndroid Build Coastguard Worker     {
575*35238bceSAndroid Build Coastguard Worker         gl.endConditionalRender();
576*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glEndConditionalRender() call failed.");
577*35238bceSAndroid Build Coastguard Worker     }
578*35238bceSAndroid Build Coastguard Worker     else
579*35238bceSAndroid Build Coastguard Worker     {
580*35238bceSAndroid Build Coastguard Worker         gl.endQuery(condition_mode_or_query_target);
581*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glEndQuery() call failed.");
582*35238bceSAndroid Build Coastguard Worker     }
583*35238bceSAndroid Build Coastguard Worker }
584*35238bceSAndroid Build Coastguard Worker 
585*35238bceSAndroid Build Coastguard Worker /** @brief Check if any fragments have passed rendering.
586*35238bceSAndroid Build Coastguard Worker  *
587*35238bceSAndroid Build Coastguard Worker  *  @return True if any sample passed, false otherwise.
588*35238bceSAndroid Build Coastguard Worker  */
fragmentsPassed()589*35238bceSAndroid Build Coastguard Worker bool gl4cts::ConditionalRenderInverted::FunctionalTest::fragmentsPassed()
590*35238bceSAndroid Build Coastguard Worker {
591*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
592*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
593*35238bceSAndroid Build Coastguard Worker 
594*35238bceSAndroid Build Coastguard Worker     /* Fetch result. */
595*35238bceSAndroid Build Coastguard Worker     glw::GLint result = -1;
596*35238bceSAndroid Build Coastguard Worker 
597*35238bceSAndroid Build Coastguard Worker     gl.getQueryObjectiv(m_qo_id, GL_QUERY_RESULT, &result);
598*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetQueryObjectiv() call failed.");
599*35238bceSAndroid Build Coastguard Worker 
600*35238bceSAndroid Build Coastguard Worker     /* Check for unusual errors. */
601*35238bceSAndroid Build Coastguard Worker     if (-1 == result)
602*35238bceSAndroid Build Coastguard Worker     {
603*35238bceSAndroid Build Coastguard Worker         throw 0;
604*35238bceSAndroid Build Coastguard Worker     }
605*35238bceSAndroid Build Coastguard Worker 
606*35238bceSAndroid Build Coastguard Worker     /* Return results. */
607*35238bceSAndroid Build Coastguard Worker     return (result > 0);
608*35238bceSAndroid Build Coastguard Worker }
609*35238bceSAndroid Build Coastguard Worker 
610*35238bceSAndroid Build Coastguard Worker /** @brief Read framebuffer's first pixel red component (left, bottom).
611*35238bceSAndroid Build Coastguard Worker  *
612*35238bceSAndroid Build Coastguard Worker  *  @return Red value of the pixel.
613*35238bceSAndroid Build Coastguard Worker  */
readPixel()614*35238bceSAndroid Build Coastguard Worker glw::GLfloat gl4cts::ConditionalRenderInverted::FunctionalTest::readPixel()
615*35238bceSAndroid Build Coastguard Worker {
616*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
617*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
618*35238bceSAndroid Build Coastguard Worker 
619*35238bceSAndroid Build Coastguard Worker     glw::GLfloat red = -1.f;
620*35238bceSAndroid Build Coastguard Worker 
621*35238bceSAndroid Build Coastguard Worker     gl.readPixels(0, 0, 1, 1, GL_RED, GL_FLOAT, &red);
622*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels() call failed.");
623*35238bceSAndroid Build Coastguard Worker 
624*35238bceSAndroid Build Coastguard Worker     return red;
625*35238bceSAndroid Build Coastguard Worker }
626*35238bceSAndroid Build Coastguard Worker 
627*35238bceSAndroid Build Coastguard Worker /** @brief Destroy test's query object.
628*35238bceSAndroid Build Coastguard Worker  */
cleanQueryObject()629*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::cleanQueryObject()
630*35238bceSAndroid Build Coastguard Worker {
631*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
632*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
633*35238bceSAndroid Build Coastguard Worker 
634*35238bceSAndroid Build Coastguard Worker     /* Clean query object. */
635*35238bceSAndroid Build Coastguard Worker     if (m_qo_id)
636*35238bceSAndroid Build Coastguard Worker     {
637*35238bceSAndroid Build Coastguard Worker         gl.deleteQueries(1, &m_qo_id);
638*35238bceSAndroid Build Coastguard Worker 
639*35238bceSAndroid Build Coastguard Worker         m_qo_id = 0;
640*35238bceSAndroid Build Coastguard Worker     }
641*35238bceSAndroid Build Coastguard Worker }
642*35238bceSAndroid Build Coastguard Worker 
643*35238bceSAndroid Build Coastguard Worker /** @brief Create test's empty Vertex Array Object.
644*35238bceSAndroid Build Coastguard Worker  */
createVertexArrayObject()645*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::createVertexArrayObject()
646*35238bceSAndroid Build Coastguard Worker {
647*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
648*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
649*35238bceSAndroid Build Coastguard Worker 
650*35238bceSAndroid Build Coastguard Worker     /* Create and bind vertex array. */
651*35238bceSAndroid Build Coastguard Worker     gl.genVertexArrays(1, &m_vao_id);
652*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays() call failed.");
653*35238bceSAndroid Build Coastguard Worker 
654*35238bceSAndroid Build Coastguard Worker     gl.bindVertexArray(m_vao_id);
655*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray() call failed.");
656*35238bceSAndroid Build Coastguard Worker }
657*35238bceSAndroid Build Coastguard Worker 
658*35238bceSAndroid Build Coastguard Worker /** @brief Destroy test's Vertex Array Object.
659*35238bceSAndroid Build Coastguard Worker  */
cleanProgramViewAndVAO()660*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::cleanProgramViewAndVAO()
661*35238bceSAndroid Build Coastguard Worker {
662*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
663*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
664*35238bceSAndroid Build Coastguard Worker 
665*35238bceSAndroid Build Coastguard Worker     /* Deleting view. */
666*35238bceSAndroid Build Coastguard Worker     if (m_fbo_id)
667*35238bceSAndroid Build Coastguard Worker     {
668*35238bceSAndroid Build Coastguard Worker         gl.deleteFramebuffers(1, &m_fbo_id);
669*35238bceSAndroid Build Coastguard Worker 
670*35238bceSAndroid Build Coastguard Worker         m_fbo_id = 0;
671*35238bceSAndroid Build Coastguard Worker     }
672*35238bceSAndroid Build Coastguard Worker 
673*35238bceSAndroid Build Coastguard Worker     if (m_rbo_id)
674*35238bceSAndroid Build Coastguard Worker     {
675*35238bceSAndroid Build Coastguard Worker         gl.deleteRenderbuffers(1, &m_rbo_id);
676*35238bceSAndroid Build Coastguard Worker 
677*35238bceSAndroid Build Coastguard Worker         m_rbo_id = 0;
678*35238bceSAndroid Build Coastguard Worker     }
679*35238bceSAndroid Build Coastguard Worker 
680*35238bceSAndroid Build Coastguard Worker     if (m_vao_id)
681*35238bceSAndroid Build Coastguard Worker     {
682*35238bceSAndroid Build Coastguard Worker         gl.deleteVertexArrays(1, &m_vao_id);
683*35238bceSAndroid Build Coastguard Worker 
684*35238bceSAndroid Build Coastguard Worker         m_vao_id = 0;
685*35238bceSAndroid Build Coastguard Worker     }
686*35238bceSAndroid Build Coastguard Worker }
687*35238bceSAndroid Build Coastguard Worker 
688*35238bceSAndroid Build Coastguard Worker /** @brief Destroy test's framebuffer with related objects.
689*35238bceSAndroid Build Coastguard Worker  */
clearView()690*35238bceSAndroid Build Coastguard Worker void gl4cts::ConditionalRenderInverted::FunctionalTest::clearView()
691*35238bceSAndroid Build Coastguard Worker {
692*35238bceSAndroid Build Coastguard Worker     /* Shortcut for GL functionality. */
693*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
694*35238bceSAndroid Build Coastguard Worker 
695*35238bceSAndroid Build Coastguard Worker     /* Clear screen. */
696*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT);
697*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glClear() call failed.");
698*35238bceSAndroid Build Coastguard Worker }
699*35238bceSAndroid Build Coastguard Worker 
700*35238bceSAndroid Build Coastguard Worker const glw::GLchar gl4cts::ConditionalRenderInverted::FunctionalTest::s_vertex_shader[] =
701*35238bceSAndroid Build Coastguard Worker     "#version 130\n"
702*35238bceSAndroid Build Coastguard Worker     "\n"
703*35238bceSAndroid Build Coastguard Worker     "void main()\n"
704*35238bceSAndroid Build Coastguard Worker     "{\n"
705*35238bceSAndroid Build Coastguard Worker     "    switch(gl_VertexID % 4)\n"
706*35238bceSAndroid Build Coastguard Worker     "    {\n"
707*35238bceSAndroid Build Coastguard Worker     "    case 0:\n"
708*35238bceSAndroid Build Coastguard Worker     "       gl_Position = vec4(-1.0, -1.0,  0.0,  1.0);\n"
709*35238bceSAndroid Build Coastguard Worker     "       break;\n"
710*35238bceSAndroid Build Coastguard Worker     "    case 1:\n"
711*35238bceSAndroid Build Coastguard Worker     "       gl_Position = vec4( 1.0, -1.0,  0.0,  1.0);\n"
712*35238bceSAndroid Build Coastguard Worker     "       break;\n"
713*35238bceSAndroid Build Coastguard Worker     "    case 2:\n"
714*35238bceSAndroid Build Coastguard Worker     "       gl_Position = vec4(-1.0,  1.0,  0.0,  1.0);\n"
715*35238bceSAndroid Build Coastguard Worker     "       break;\n"
716*35238bceSAndroid Build Coastguard Worker     "    case 3:\n"
717*35238bceSAndroid Build Coastguard Worker     "       gl_Position = vec4( 1.0,  1.0,  0.0,  1.0);\n"
718*35238bceSAndroid Build Coastguard Worker     "       break;\n"
719*35238bceSAndroid Build Coastguard Worker     "    }\n"
720*35238bceSAndroid Build Coastguard Worker     "}\n";
721*35238bceSAndroid Build Coastguard Worker 
722*35238bceSAndroid Build Coastguard Worker const glw::GLchar gl4cts::ConditionalRenderInverted::FunctionalTest::s_fragment_shader[] = "#version 130\n"
723*35238bceSAndroid Build Coastguard Worker                                                                                            "\n"
724*35238bceSAndroid Build Coastguard Worker                                                                                            "uniform float color;\n"
725*35238bceSAndroid Build Coastguard Worker                                                                                            "uniform int   shall_pass;\n"
726*35238bceSAndroid Build Coastguard Worker                                                                                            "\n"
727*35238bceSAndroid Build Coastguard Worker                                                                                            "out vec4 pixel;\n"
728*35238bceSAndroid Build Coastguard Worker                                                                                            "\n"
729*35238bceSAndroid Build Coastguard Worker                                                                                            "void main()\n"
730*35238bceSAndroid Build Coastguard Worker                                                                                            "{\n"
731*35238bceSAndroid Build Coastguard Worker                                                                                            "    if(0 == shall_pass)\n"
732*35238bceSAndroid Build Coastguard Worker                                                                                            "    {\n"
733*35238bceSAndroid Build Coastguard Worker                                                                                            "        discard;\n"
734*35238bceSAndroid Build Coastguard Worker                                                                                            "    }\n"
735*35238bceSAndroid Build Coastguard Worker                                                                                            "\n"
736*35238bceSAndroid Build Coastguard Worker                                                                                            "    pixel = vec4(color);\n"
737*35238bceSAndroid Build Coastguard Worker                                                                                            "}\n";
738*35238bceSAndroid Build Coastguard Worker 
739*35238bceSAndroid Build Coastguard Worker const glw::GLchar gl4cts::ConditionalRenderInverted::FunctionalTest::s_color_uniform_name[] = "color";
740*35238bceSAndroid Build Coastguard Worker 
741*35238bceSAndroid Build Coastguard Worker const glw::GLchar gl4cts::ConditionalRenderInverted::FunctionalTest::s_pass_switch_uniform_name[] = "shall_pass";
742*35238bceSAndroid Build Coastguard Worker 
743*35238bceSAndroid Build Coastguard Worker const glw::GLuint gl4cts::ConditionalRenderInverted::FunctionalTest::s_view_size = 1;
744*35238bceSAndroid Build Coastguard Worker 
745*35238bceSAndroid Build Coastguard Worker /******************************** Utilities Implementation   ********************************/
746*35238bceSAndroid Build Coastguard Worker 
747*35238bceSAndroid Build Coastguard Worker /** @brief Return string representation of condional rendering mode.
748*35238bceSAndroid Build Coastguard Worker  *
749*35238bceSAndroid Build Coastguard Worker  *  @param [in] mode    Render condition mode.
750*35238bceSAndroid Build Coastguard Worker  *
751*35238bceSAndroid Build Coastguard Worker  *  @return Constant C-String representation of mode.
752*35238bceSAndroid Build Coastguard Worker  */
modeToChars(glw::GLenum mode)753*35238bceSAndroid Build Coastguard Worker const glw::GLchar *gl4cts::ConditionalRenderInverted::Utilities::modeToChars(glw::GLenum mode)
754*35238bceSAndroid Build Coastguard Worker {
755*35238bceSAndroid Build Coastguard Worker     /* Const name values. */
756*35238bceSAndroid Build Coastguard Worker     static const glw::GLchar *query_wait_inverted_mode_name              = "GL_QUERY_WAIT_INVERTED";
757*35238bceSAndroid Build Coastguard Worker     static const glw::GLchar *query_no_wait_inverted_mode_name           = "GL_QUERY_NO_WAIT_INVERTED";
758*35238bceSAndroid Build Coastguard Worker     static const glw::GLchar *query_by_region_wait_inverted_mode_name    = "GL_QUERY_BY_REGION_WAIT_INVERTED";
759*35238bceSAndroid Build Coastguard Worker     static const glw::GLchar *query_by_region_no_wait_inverted_mode_name = "GL_QUERY_BY_REGION_NO_WAIT_INVERTED";
760*35238bceSAndroid Build Coastguard Worker     static const glw::GLchar *invalid_mode_name                          = "unknow mode";
761*35238bceSAndroid Build Coastguard Worker 
762*35238bceSAndroid Build Coastguard Worker     /* Return proper value. */
763*35238bceSAndroid Build Coastguard Worker     if (GL_QUERY_WAIT_INVERTED == mode)
764*35238bceSAndroid Build Coastguard Worker     {
765*35238bceSAndroid Build Coastguard Worker         return query_wait_inverted_mode_name;
766*35238bceSAndroid Build Coastguard Worker     }
767*35238bceSAndroid Build Coastguard Worker 
768*35238bceSAndroid Build Coastguard Worker     if (GL_QUERY_NO_WAIT_INVERTED == mode)
769*35238bceSAndroid Build Coastguard Worker     {
770*35238bceSAndroid Build Coastguard Worker         return query_no_wait_inverted_mode_name;
771*35238bceSAndroid Build Coastguard Worker     }
772*35238bceSAndroid Build Coastguard Worker 
773*35238bceSAndroid Build Coastguard Worker     if (GL_QUERY_BY_REGION_WAIT_INVERTED == mode)
774*35238bceSAndroid Build Coastguard Worker     {
775*35238bceSAndroid Build Coastguard Worker         return query_by_region_wait_inverted_mode_name;
776*35238bceSAndroid Build Coastguard Worker     }
777*35238bceSAndroid Build Coastguard Worker 
778*35238bceSAndroid Build Coastguard Worker     if (GL_QUERY_BY_REGION_NO_WAIT_INVERTED == mode)
779*35238bceSAndroid Build Coastguard Worker     {
780*35238bceSAndroid Build Coastguard Worker         return query_by_region_no_wait_inverted_mode_name;
781*35238bceSAndroid Build Coastguard Worker     }
782*35238bceSAndroid Build Coastguard Worker 
783*35238bceSAndroid Build Coastguard Worker     /* If not, return invalid name. */
784*35238bceSAndroid Build Coastguard Worker     return invalid_mode_name;
785*35238bceSAndroid Build Coastguard Worker }
786*35238bceSAndroid Build Coastguard Worker 
787*35238bceSAndroid Build Coastguard Worker /** @brief Return string representation of glBeginQuery's target.
788*35238bceSAndroid Build Coastguard Worker  *
789*35238bceSAndroid Build Coastguard Worker  *  @param [in] mode    Render condition mode.
790*35238bceSAndroid Build Coastguard Worker  *
791*35238bceSAndroid Build Coastguard Worker  *  @return Constant C-String representation of mode.
792*35238bceSAndroid Build Coastguard Worker  */
queryTargetToChars(glw::GLenum mode)793*35238bceSAndroid Build Coastguard Worker const glw::GLchar *gl4cts::ConditionalRenderInverted::Utilities::queryTargetToChars(glw::GLenum mode)
794*35238bceSAndroid Build Coastguard Worker {
795*35238bceSAndroid Build Coastguard Worker     /* Const name values. */
796*35238bceSAndroid Build Coastguard Worker     static const glw::GLchar *any_samples_name    = "GL_ANY_SAMPLES_PASSED";
797*35238bceSAndroid Build Coastguard Worker     static const glw::GLchar *samples_name        = "GL_SAMPLES_PASSED";
798*35238bceSAndroid Build Coastguard Worker     static const glw::GLchar *invalid_target_name = "unknow mode";
799*35238bceSAndroid Build Coastguard Worker 
800*35238bceSAndroid Build Coastguard Worker     /* Return proper value. */
801*35238bceSAndroid Build Coastguard Worker     if (GL_ANY_SAMPLES_PASSED == mode)
802*35238bceSAndroid Build Coastguard Worker     {
803*35238bceSAndroid Build Coastguard Worker         return any_samples_name;
804*35238bceSAndroid Build Coastguard Worker     }
805*35238bceSAndroid Build Coastguard Worker 
806*35238bceSAndroid Build Coastguard Worker     if (GL_SAMPLES_PASSED == mode)
807*35238bceSAndroid Build Coastguard Worker     {
808*35238bceSAndroid Build Coastguard Worker         return samples_name;
809*35238bceSAndroid Build Coastguard Worker     }
810*35238bceSAndroid Build Coastguard Worker 
811*35238bceSAndroid Build Coastguard Worker     /* If not, return invalid name. */
812*35238bceSAndroid Build Coastguard Worker     return invalid_target_name;
813*35238bceSAndroid Build Coastguard Worker }
814