xref: /aosp_15_r20/external/deqp/modules/gles3/stress/es3sOcclusionQueryTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
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 Occlusion query stress tests
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3sOcclusionQueryTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deString.h"
29*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "deClock.h"
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker #include "glw.h"
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker #include <vector>
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker using std::vector;
40*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker namespace deqp
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace gles3
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker namespace Stress
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker static const tcu::Vec4 OCCLUDER_COLOR   = tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f);
50*35238bceSAndroid Build Coastguard Worker static const tcu::Vec4 TARGET_COLOR     = tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f);
51*35238bceSAndroid Build Coastguard Worker static const int NUM_CASE_ITERATIONS    = 3;
52*35238bceSAndroid Build Coastguard Worker static const int NUM_GENERATED_VERTICES = 100;
53*35238bceSAndroid Build Coastguard Worker static const int WATCHDOG_INTERVAL      = 50; // Touch watchdog every N iterations.
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker class OcclusionQueryStressCase : public TestCase
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker public:
58*35238bceSAndroid Build Coastguard Worker     OcclusionQueryStressCase(Context &ctx, const char *name, const char *desc, int m_numOccluderDraws,
59*35238bceSAndroid Build Coastguard Worker                              int m_numOccludersPerDraw, int m_numTargetDraws, int m_numTargetsPerDraw, int m_numQueries,
60*35238bceSAndroid Build Coastguard Worker                              uint32_t m_queryMode);
61*35238bceSAndroid Build Coastguard Worker     ~OcclusionQueryStressCase(void);
62*35238bceSAndroid Build Coastguard Worker 
63*35238bceSAndroid Build Coastguard Worker     void init(void);
64*35238bceSAndroid Build Coastguard Worker     void deinit(void);
65*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker private:
68*35238bceSAndroid Build Coastguard Worker     OcclusionQueryStressCase(const OcclusionQueryStressCase &);
69*35238bceSAndroid Build Coastguard Worker     OcclusionQueryStressCase &operator=(const OcclusionQueryStressCase &);
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker     int m_numOccluderDraws;
72*35238bceSAndroid Build Coastguard Worker     int m_numOccludersPerDraw;
73*35238bceSAndroid Build Coastguard Worker     int m_numTargetDraws;
74*35238bceSAndroid Build Coastguard Worker     int m_numTargetsPerDraw;
75*35238bceSAndroid Build Coastguard Worker     int m_numQueries;
76*35238bceSAndroid Build Coastguard Worker     uint32_t m_queryMode;
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &m_renderCtx;
79*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_program;
80*35238bceSAndroid Build Coastguard Worker     int m_iterNdx;
81*35238bceSAndroid Build Coastguard Worker     de::Random m_rnd;
82*35238bceSAndroid Build Coastguard Worker };
83*35238bceSAndroid Build Coastguard Worker 
OcclusionQueryStressCase(Context & ctx,const char * name,const char * desc,int numOccluderDraws,int numOccludersPerDraw,int numTargetDraws,int numTargetsPerDraw,int numQueries,uint32_t queryMode)84*35238bceSAndroid Build Coastguard Worker OcclusionQueryStressCase::OcclusionQueryStressCase(Context &ctx, const char *name, const char *desc,
85*35238bceSAndroid Build Coastguard Worker                                                    int numOccluderDraws, int numOccludersPerDraw, int numTargetDraws,
86*35238bceSAndroid Build Coastguard Worker                                                    int numTargetsPerDraw, int numQueries, uint32_t queryMode)
87*35238bceSAndroid Build Coastguard Worker     : TestCase(ctx, name, desc)
88*35238bceSAndroid Build Coastguard Worker     , m_numOccluderDraws(numOccluderDraws)
89*35238bceSAndroid Build Coastguard Worker     , m_numOccludersPerDraw(numOccludersPerDraw)
90*35238bceSAndroid Build Coastguard Worker     , m_numTargetDraws(numTargetDraws)
91*35238bceSAndroid Build Coastguard Worker     , m_numTargetsPerDraw(numTargetsPerDraw)
92*35238bceSAndroid Build Coastguard Worker     , m_numQueries(numQueries)
93*35238bceSAndroid Build Coastguard Worker     , m_queryMode(queryMode)
94*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(ctx.getRenderContext())
95*35238bceSAndroid Build Coastguard Worker     , m_program(DE_NULL)
96*35238bceSAndroid Build Coastguard Worker     , m_iterNdx(0)
97*35238bceSAndroid Build Coastguard Worker     , m_rnd(deStringHash(name))
98*35238bceSAndroid Build Coastguard Worker {
99*35238bceSAndroid Build Coastguard Worker }
100*35238bceSAndroid Build Coastguard Worker 
~OcclusionQueryStressCase(void)101*35238bceSAndroid Build Coastguard Worker OcclusionQueryStressCase::~OcclusionQueryStressCase(void)
102*35238bceSAndroid Build Coastguard Worker {
103*35238bceSAndroid Build Coastguard Worker     OcclusionQueryStressCase::deinit();
104*35238bceSAndroid Build Coastguard Worker }
105*35238bceSAndroid Build Coastguard Worker 
init(void)106*35238bceSAndroid Build Coastguard Worker void OcclusionQueryStressCase::init(void)
107*35238bceSAndroid Build Coastguard Worker {
108*35238bceSAndroid Build Coastguard Worker     const char *vertShaderSource = "#version 300 es\n"
109*35238bceSAndroid Build Coastguard Worker                                    "layout(location = 0) in mediump vec4 a_position;\n"
110*35238bceSAndroid Build Coastguard Worker                                    "\n"
111*35238bceSAndroid Build Coastguard Worker                                    "void main (void)\n"
112*35238bceSAndroid Build Coastguard Worker                                    "{\n"
113*35238bceSAndroid Build Coastguard Worker                                    "    gl_Position = a_position;\n"
114*35238bceSAndroid Build Coastguard Worker                                    "}\n";
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker     const char *fragShaderSource = "#version 300 es\n"
117*35238bceSAndroid Build Coastguard Worker                                    "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
118*35238bceSAndroid Build Coastguard Worker                                    "uniform mediump vec4 u_color;\n"
119*35238bceSAndroid Build Coastguard Worker                                    "\n"
120*35238bceSAndroid Build Coastguard Worker                                    "void main (void)\n"
121*35238bceSAndroid Build Coastguard Worker                                    "{\n"
122*35238bceSAndroid Build Coastguard Worker                                    "    mediump float depth_gradient = gl_FragCoord.z;\n"
123*35238bceSAndroid Build Coastguard Worker                                    "    mediump float bias = 0.1;\n"
124*35238bceSAndroid Build Coastguard Worker                                    "    dEQP_FragColor = vec4(u_color.xyz * (depth_gradient + bias), 1.0);\n"
125*35238bceSAndroid Build Coastguard Worker                                    "}\n";
126*35238bceSAndroid Build Coastguard Worker 
127*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!m_program);
128*35238bceSAndroid Build Coastguard Worker     m_program = new glu::ShaderProgram(m_context.getRenderContext(),
129*35238bceSAndroid Build Coastguard Worker                                        glu::makeVtxFragSources(vertShaderSource, fragShaderSource));
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker     if (!m_program->isOk())
132*35238bceSAndroid Build Coastguard Worker     {
133*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << *m_program;
134*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("Failed to compile shader program");
135*35238bceSAndroid Build Coastguard Worker     }
136*35238bceSAndroid Build Coastguard Worker 
137*35238bceSAndroid Build Coastguard Worker     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); // Initialize test result to pass.
138*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_MSG("Case initialization finished");
139*35238bceSAndroid Build Coastguard Worker }
140*35238bceSAndroid Build Coastguard Worker 
deinit(void)141*35238bceSAndroid Build Coastguard Worker void OcclusionQueryStressCase::deinit(void)
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker     delete m_program;
144*35238bceSAndroid Build Coastguard Worker     m_program = DE_NULL;
145*35238bceSAndroid Build Coastguard Worker }
146*35238bceSAndroid Build Coastguard Worker 
iterate(void)147*35238bceSAndroid Build Coastguard Worker OcclusionQueryStressCase::IterateResult OcclusionQueryStressCase::iterate(void)
148*35238bceSAndroid Build Coastguard Worker {
149*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log  = m_testCtx.getLog();
150*35238bceSAndroid Build Coastguard Worker     uint32_t colorUnif = glGetUniformLocation(m_program->getProgram(), "u_color");
151*35238bceSAndroid Build Coastguard Worker 
152*35238bceSAndroid Build Coastguard Worker     std::vector<float> vertices;
153*35238bceSAndroid Build Coastguard Worker     std::vector<float> occluderVertices;
154*35238bceSAndroid Build Coastguard Worker     std::vector<float> targetVertices;
155*35238bceSAndroid Build Coastguard Worker     std::vector<uint32_t> queryIds(m_numQueries, 0);
156*35238bceSAndroid Build Coastguard Worker     std::vector<uint32_t> queryResultReady(m_numQueries, 0);
157*35238bceSAndroid Build Coastguard Worker     std::vector<uint32_t> queryResult(m_numQueries, 0);
158*35238bceSAndroid Build Coastguard Worker 
159*35238bceSAndroid Build Coastguard Worker     std::string sectionName("Case iteration " + de::toString(m_iterNdx + 1) + "/" + de::toString(NUM_CASE_ITERATIONS));
160*35238bceSAndroid Build Coastguard Worker     tcu::ScopedLogSection section(log, sectionName.c_str(), sectionName.c_str());
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Parameters:\n"
163*35238bceSAndroid Build Coastguard Worker         << "- Number of occlusion queries: " << m_numQueries << ".\n"
164*35238bceSAndroid Build Coastguard Worker         << "- Number of occluder draws per query: " << m_numOccluderDraws
165*35238bceSAndroid Build Coastguard Worker         << ", primitives per draw: " << m_numOccludersPerDraw << ".\n"
166*35238bceSAndroid Build Coastguard Worker         << "- Number of target draws per query: " << m_numTargetDraws
167*35238bceSAndroid Build Coastguard Worker         << ", primitives per draw: " << m_numTargetsPerDraw << ".\n"
168*35238bceSAndroid Build Coastguard Worker         << tcu::TestLog::EndMessage;
169*35238bceSAndroid Build Coastguard Worker 
170*35238bceSAndroid Build Coastguard Worker     int numOccluderIndicesPerDraw = 3 * m_numOccludersPerDraw;
171*35238bceSAndroid Build Coastguard Worker     int numTargetIndicesPerDraw   = 3 * m_numTargetsPerDraw;
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker     // Generate vertex data
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker     vertices.resize(4 * NUM_GENERATED_VERTICES);
176*35238bceSAndroid Build Coastguard Worker 
177*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < NUM_GENERATED_VERTICES; i++)
178*35238bceSAndroid Build Coastguard Worker     {
179*35238bceSAndroid Build Coastguard Worker         vertices[4 * i]     = m_rnd.getFloat(-1.0f, 1.0f);
180*35238bceSAndroid Build Coastguard Worker         vertices[4 * i + 1] = m_rnd.getFloat(-1.0f, 1.0f);
181*35238bceSAndroid Build Coastguard Worker         vertices[4 * i + 2] = m_rnd.getFloat(0.0f, 1.0f);
182*35238bceSAndroid Build Coastguard Worker         vertices[4 * i + 3] = 1.0f;
183*35238bceSAndroid Build Coastguard Worker     }
184*35238bceSAndroid Build Coastguard Worker 
185*35238bceSAndroid Build Coastguard Worker     // Generate primitives
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker     occluderVertices.resize(4 * numOccluderIndicesPerDraw * m_numOccluderDraws);
188*35238bceSAndroid Build Coastguard Worker 
189*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < numOccluderIndicesPerDraw * m_numOccluderDraws; i++)
190*35238bceSAndroid Build Coastguard Worker     {
191*35238bceSAndroid Build Coastguard Worker         int vtxNdx                  = m_rnd.getInt(0, NUM_GENERATED_VERTICES - 1);
192*35238bceSAndroid Build Coastguard Worker         occluderVertices[4 * i]     = vertices[4 * vtxNdx];
193*35238bceSAndroid Build Coastguard Worker         occluderVertices[4 * i + 1] = vertices[4 * vtxNdx + 1];
194*35238bceSAndroid Build Coastguard Worker         occluderVertices[4 * i + 2] = vertices[4 * vtxNdx + 2];
195*35238bceSAndroid Build Coastguard Worker         occluderVertices[4 * i + 3] = vertices[4 * vtxNdx + 3];
196*35238bceSAndroid Build Coastguard Worker     }
197*35238bceSAndroid Build Coastguard Worker 
198*35238bceSAndroid Build Coastguard Worker     targetVertices.resize(4 * numTargetIndicesPerDraw * m_numTargetDraws);
199*35238bceSAndroid Build Coastguard Worker 
200*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < numTargetIndicesPerDraw * m_numTargetDraws; i++)
201*35238bceSAndroid Build Coastguard Worker     {
202*35238bceSAndroid Build Coastguard Worker         int vtxNdx                = m_rnd.getInt(0, NUM_GENERATED_VERTICES - 1);
203*35238bceSAndroid Build Coastguard Worker         targetVertices[4 * i]     = vertices[4 * vtxNdx];
204*35238bceSAndroid Build Coastguard Worker         targetVertices[4 * i + 1] = vertices[4 * vtxNdx + 1];
205*35238bceSAndroid Build Coastguard Worker         targetVertices[4 * i + 2] = vertices[4 * vtxNdx + 2];
206*35238bceSAndroid Build Coastguard Worker         targetVertices[4 * i + 3] = vertices[4 * vtxNdx + 3];
207*35238bceSAndroid Build Coastguard Worker     }
208*35238bceSAndroid Build Coastguard Worker 
209*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(m_program);
210*35238bceSAndroid Build Coastguard Worker 
211*35238bceSAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
212*35238bceSAndroid Build Coastguard Worker     glClearDepthf(1.0f);
213*35238bceSAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
214*35238bceSAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
215*35238bceSAndroid Build Coastguard Worker     glUseProgram(m_program->getProgram());
216*35238bceSAndroid Build Coastguard Worker     glEnableVertexAttribArray(0);
217*35238bceSAndroid Build Coastguard Worker 
218*35238bceSAndroid Build Coastguard Worker     uint64_t time = deGetMicroseconds();
219*35238bceSAndroid Build Coastguard Worker 
220*35238bceSAndroid Build Coastguard Worker     for (int queryIter = 0; queryIter < m_numQueries; queryIter++)
221*35238bceSAndroid Build Coastguard Worker     {
222*35238bceSAndroid Build Coastguard Worker         // Draw occluders
223*35238bceSAndroid Build Coastguard Worker 
224*35238bceSAndroid Build Coastguard Worker         glUniform4f(colorUnif, OCCLUDER_COLOR.x(), OCCLUDER_COLOR.y(), OCCLUDER_COLOR.z(), OCCLUDER_COLOR.w());
225*35238bceSAndroid Build Coastguard Worker 
226*35238bceSAndroid Build Coastguard Worker         for (int drawIter = 0; drawIter < m_numOccluderDraws; drawIter++)
227*35238bceSAndroid Build Coastguard Worker         {
228*35238bceSAndroid Build Coastguard Worker             glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, &occluderVertices[drawIter * numOccluderIndicesPerDraw]);
229*35238bceSAndroid Build Coastguard Worker             glDrawArrays(GL_TRIANGLES, 0, numOccluderIndicesPerDraw);
230*35238bceSAndroid Build Coastguard Worker         }
231*35238bceSAndroid Build Coastguard Worker 
232*35238bceSAndroid Build Coastguard Worker         // Begin occlusion query
233*35238bceSAndroid Build Coastguard Worker 
234*35238bceSAndroid Build Coastguard Worker         glGenQueries(1, &queryIds[queryIter]);
235*35238bceSAndroid Build Coastguard Worker         glBeginQuery(m_queryMode, queryIds[queryIter]);
236*35238bceSAndroid Build Coastguard Worker 
237*35238bceSAndroid Build Coastguard Worker         // Draw targets
238*35238bceSAndroid Build Coastguard Worker 
239*35238bceSAndroid Build Coastguard Worker         glUniform4f(colorUnif, TARGET_COLOR.x(), TARGET_COLOR.y(), TARGET_COLOR.z(), TARGET_COLOR.w());
240*35238bceSAndroid Build Coastguard Worker 
241*35238bceSAndroid Build Coastguard Worker         for (int drawIter = 0; drawIter < m_numTargetDraws; drawIter++)
242*35238bceSAndroid Build Coastguard Worker         {
243*35238bceSAndroid Build Coastguard Worker             glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, &targetVertices[drawIter * numTargetIndicesPerDraw]);
244*35238bceSAndroid Build Coastguard Worker             glDrawArrays(GL_TRIANGLES, 0, numTargetIndicesPerDraw);
245*35238bceSAndroid Build Coastguard Worker         }
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker         // End occlusion query
248*35238bceSAndroid Build Coastguard Worker 
249*35238bceSAndroid Build Coastguard Worker         glEndQuery(m_queryMode);
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker         if ((queryIter % WATCHDOG_INTERVAL) == 0 && m_testCtx.getWatchDog())
252*35238bceSAndroid Build Coastguard Worker             qpWatchDog_touch(m_testCtx.getWatchDog());
253*35238bceSAndroid Build Coastguard Worker     }
254*35238bceSAndroid Build Coastguard Worker 
255*35238bceSAndroid Build Coastguard Worker     glFinish();
256*35238bceSAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
257*35238bceSAndroid Build Coastguard Worker 
258*35238bceSAndroid Build Coastguard Worker     uint64_t dTime = deGetMicroseconds() - time;
259*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Total duration: " << dTime / 1000 << " ms" << tcu::TestLog::EndMessage;
260*35238bceSAndroid Build Coastguard Worker 
261*35238bceSAndroid Build Coastguard Worker     // Get results
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker     for (int queryIter = 0; queryIter < m_numQueries; queryIter++)
264*35238bceSAndroid Build Coastguard Worker     {
265*35238bceSAndroid Build Coastguard Worker         glGetQueryObjectuiv(queryIds[queryIter], GL_QUERY_RESULT_AVAILABLE, &queryResultReady[queryIter]);
266*35238bceSAndroid Build Coastguard Worker 
267*35238bceSAndroid Build Coastguard Worker         if (queryResultReady[queryIter] == GL_TRUE)
268*35238bceSAndroid Build Coastguard Worker         {
269*35238bceSAndroid Build Coastguard Worker             glGetQueryObjectuiv(queryIds[queryIter], GL_QUERY_RESULT, &queryResult[queryIter]);
270*35238bceSAndroid Build Coastguard Worker         }
271*35238bceSAndroid Build Coastguard Worker         else
272*35238bceSAndroid Build Coastguard Worker             TCU_FAIL("Occlusion query failed to return a result after glFinish()");
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker         if ((queryIter % WATCHDOG_INTERVAL) == 0 && m_testCtx.getWatchDog())
275*35238bceSAndroid Build Coastguard Worker             qpWatchDog_touch(m_testCtx.getWatchDog());
276*35238bceSAndroid Build Coastguard Worker     }
277*35238bceSAndroid Build Coastguard Worker 
278*35238bceSAndroid Build Coastguard Worker     glDeleteQueries(m_numQueries, &queryIds[0]);
279*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_MSG("Occlusion queries finished");
280*35238bceSAndroid Build Coastguard Worker 
281*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << "Case passed!" << tcu::TestLog::EndMessage;
282*35238bceSAndroid Build Coastguard Worker 
283*35238bceSAndroid Build Coastguard Worker     return (++m_iterNdx < NUM_CASE_ITERATIONS) ? CONTINUE : STOP;
284*35238bceSAndroid Build Coastguard Worker }
285*35238bceSAndroid Build Coastguard Worker 
OcclusionQueryTests(Context & testCtx)286*35238bceSAndroid Build Coastguard Worker OcclusionQueryTests::OcclusionQueryTests(Context &testCtx)
287*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(testCtx, "occlusion_query", "Occlusion query stress tests")
288*35238bceSAndroid Build Coastguard Worker {
289*35238bceSAndroid Build Coastguard Worker }
290*35238bceSAndroid Build Coastguard Worker 
~OcclusionQueryTests(void)291*35238bceSAndroid Build Coastguard Worker OcclusionQueryTests::~OcclusionQueryTests(void)
292*35238bceSAndroid Build Coastguard Worker {
293*35238bceSAndroid Build Coastguard Worker }
294*35238bceSAndroid Build Coastguard Worker 
init(void)295*35238bceSAndroid Build Coastguard Worker void OcclusionQueryTests::init(void)
296*35238bceSAndroid Build Coastguard Worker {
297*35238bceSAndroid Build Coastguard Worker     addChild(new OcclusionQueryStressCase(m_context, "10_queries_2500_triangles_per_query",
298*35238bceSAndroid Build Coastguard Worker                                           "10_queries_2500_triangles_per_query", 49, 50, 1, 50, 10,
299*35238bceSAndroid Build Coastguard Worker                                           GL_ANY_SAMPLES_PASSED));
300*35238bceSAndroid Build Coastguard Worker     addChild(new OcclusionQueryStressCase(m_context, "100_queries_2500_triangles_per_query",
301*35238bceSAndroid Build Coastguard Worker                                           "100_queries_2500_triangles_per_query", 49, 50, 1, 50, 100,
302*35238bceSAndroid Build Coastguard Worker                                           GL_ANY_SAMPLES_PASSED));
303*35238bceSAndroid Build Coastguard Worker     addChild(new OcclusionQueryStressCase(m_context, "1000_queries_500_triangles_per_query",
304*35238bceSAndroid Build Coastguard Worker                                           "1000_queries_500_triangles_per_query", 49, 10, 1, 10, 1000,
305*35238bceSAndroid Build Coastguard Worker                                           GL_ANY_SAMPLES_PASSED));
306*35238bceSAndroid Build Coastguard Worker     addChild(new OcclusionQueryStressCase(m_context, "10000_queries_20_triangles_per_query",
307*35238bceSAndroid Build Coastguard Worker                                           "10000_queries_20_triangles_per_query", 1, 19, 1, 1, 10000,
308*35238bceSAndroid Build Coastguard Worker                                           GL_ANY_SAMPLES_PASSED));
309*35238bceSAndroid Build Coastguard Worker }
310*35238bceSAndroid Build Coastguard Worker 
311*35238bceSAndroid Build Coastguard Worker } // namespace Stress
312*35238bceSAndroid Build Coastguard Worker } // namespace gles3
313*35238bceSAndroid Build Coastguard Worker } // namespace deqp
314