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