xref: /aosp_15_r20/external/deqp/modules/gles3/stress/es3sLongRunningShaderTests.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 Long running shader stress tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3sLongRunningShaderTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluDrawUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "deString.h"
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker namespace deqp
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace gles3
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker namespace Stress
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker using std::vector;
49*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
50*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker namespace
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker enum LoopType
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker     LOOPTYPE_FOR = 0,
58*35238bceSAndroid Build Coastguard Worker     LOOPTYPE_WHILE,
59*35238bceSAndroid Build Coastguard Worker     LOOPTYPE_DO_WHILE,
60*35238bceSAndroid Build Coastguard Worker 
61*35238bceSAndroid Build Coastguard Worker     LOOPTYPE_LAST
62*35238bceSAndroid Build Coastguard Worker };
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker enum IterCountType
65*35238bceSAndroid Build Coastguard Worker {
66*35238bceSAndroid Build Coastguard Worker     ITERCOUNTTYPE_STATIC = 0,
67*35238bceSAndroid Build Coastguard Worker     ITERCOUNTTYPE_UNIFORM,
68*35238bceSAndroid Build Coastguard Worker     ITERCOUNTTYPE_DYNAMIC,
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker     ITERCOUNTTYPE_LAST
71*35238bceSAndroid Build Coastguard Worker };
72*35238bceSAndroid Build Coastguard Worker 
73*35238bceSAndroid Build Coastguard Worker class LongRunningShaderCase : public TestCase
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker public:
76*35238bceSAndroid Build Coastguard Worker     struct Params
77*35238bceSAndroid Build Coastguard Worker     {
78*35238bceSAndroid Build Coastguard Worker         const char *name;
79*35238bceSAndroid Build Coastguard Worker         const char *description;
80*35238bceSAndroid Build Coastguard Worker         glu::ShaderType shaderType;
81*35238bceSAndroid Build Coastguard Worker         LoopType loopType;
82*35238bceSAndroid Build Coastguard Worker         IterCountType iterCountType;
83*35238bceSAndroid Build Coastguard Worker         int numInvocations;
84*35238bceSAndroid Build Coastguard Worker         int minLoopIterCount;
85*35238bceSAndroid Build Coastguard Worker         int maxLoopIterCount;
86*35238bceSAndroid Build Coastguard Worker     };
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker     LongRunningShaderCase(Context &context, const Params *params);
89*35238bceSAndroid Build Coastguard Worker     ~LongRunningShaderCase(void);
90*35238bceSAndroid Build Coastguard Worker 
91*35238bceSAndroid Build Coastguard Worker     void init(void);
92*35238bceSAndroid Build Coastguard Worker     void deinit(void);
93*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
94*35238bceSAndroid Build Coastguard Worker 
95*35238bceSAndroid Build Coastguard Worker private:
96*35238bceSAndroid Build Coastguard Worker     LongRunningShaderCase(const LongRunningShaderCase &);
97*35238bceSAndroid Build Coastguard Worker     LongRunningShaderCase &operator=(const LongRunningShaderCase &);
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker     static glu::ProgramSources genSources(const Params &params);
100*35238bceSAndroid Build Coastguard Worker     static uint32_t getSeed(const Params &params);
101*35238bceSAndroid Build Coastguard Worker 
102*35238bceSAndroid Build Coastguard Worker     const Params *const m_params;
103*35238bceSAndroid Build Coastguard Worker     const int m_numCaseIters;
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_program;
106*35238bceSAndroid Build Coastguard Worker     int m_caseIterNdx;
107*35238bceSAndroid Build Coastguard Worker };
108*35238bceSAndroid Build Coastguard Worker 
LongRunningShaderCase(Context & context,const Params * params)109*35238bceSAndroid Build Coastguard Worker LongRunningShaderCase::LongRunningShaderCase(Context &context, const Params *params)
110*35238bceSAndroid Build Coastguard Worker     : TestCase(context, params->name, params->description)
111*35238bceSAndroid Build Coastguard Worker     , m_params(params)
112*35238bceSAndroid Build Coastguard Worker     , m_numCaseIters(5)
113*35238bceSAndroid Build Coastguard Worker     , m_program(DE_NULL)
114*35238bceSAndroid Build Coastguard Worker     , m_caseIterNdx(0)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker }
117*35238bceSAndroid Build Coastguard Worker 
~LongRunningShaderCase(void)118*35238bceSAndroid Build Coastguard Worker LongRunningShaderCase::~LongRunningShaderCase(void)
119*35238bceSAndroid Build Coastguard Worker {
120*35238bceSAndroid Build Coastguard Worker     deinit();
121*35238bceSAndroid Build Coastguard Worker }
122*35238bceSAndroid Build Coastguard Worker 
genSources(const Params & params)123*35238bceSAndroid Build Coastguard Worker glu::ProgramSources LongRunningShaderCase::genSources(const Params &params)
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker     const bool isVertCase = params.shaderType == glu::SHADERTYPE_VERTEX;
126*35238bceSAndroid Build Coastguard Worker     std::ostringstream vert, frag;
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker     vert << "#version 300 es\n"
129*35238bceSAndroid Build Coastguard Worker          << "in highp vec2 a_position;\n";
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker     frag << "#version 300 es\n";
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     if (params.iterCountType == ITERCOUNTTYPE_DYNAMIC)
134*35238bceSAndroid Build Coastguard Worker     {
135*35238bceSAndroid Build Coastguard Worker         vert << "in highp int a_iterCount;\n";
136*35238bceSAndroid Build Coastguard Worker         if (!isVertCase)
137*35238bceSAndroid Build Coastguard Worker         {
138*35238bceSAndroid Build Coastguard Worker             vert << "flat out highp int v_iterCount;\n";
139*35238bceSAndroid Build Coastguard Worker             frag << "flat in highp int v_iterCount;\n";
140*35238bceSAndroid Build Coastguard Worker         }
141*35238bceSAndroid Build Coastguard Worker     }
142*35238bceSAndroid Build Coastguard Worker     else if (params.iterCountType == ITERCOUNTTYPE_UNIFORM)
143*35238bceSAndroid Build Coastguard Worker         (isVertCase ? vert : frag) << "uniform highp int u_iterCount;\n";
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker     if (isVertCase)
146*35238bceSAndroid Build Coastguard Worker     {
147*35238bceSAndroid Build Coastguard Worker         vert << "out mediump vec4 v_color;\n";
148*35238bceSAndroid Build Coastguard Worker         frag << "in mediump vec4 v_color;\n";
149*35238bceSAndroid Build Coastguard Worker     }
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker     frag << "out mediump vec4 o_color;\n";
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker     vert << "\nvoid main (void)\n{\n"
154*35238bceSAndroid Build Coastguard Worker          << "    gl_Position = vec4(a_position, 0.0, 1.0);\n"
155*35238bceSAndroid Build Coastguard Worker          << "    gl_PointSize = 1.0;\n";
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker     if (!isVertCase && params.iterCountType == ITERCOUNTTYPE_DYNAMIC)
158*35238bceSAndroid Build Coastguard Worker         vert << "    v_iterCount = a_iterCount;\n";
159*35238bceSAndroid Build Coastguard Worker 
160*35238bceSAndroid Build Coastguard Worker     frag << "\nvoid main (void)\n{\n";
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker     {
163*35238bceSAndroid Build Coastguard Worker         const std::string iterCount =
164*35238bceSAndroid Build Coastguard Worker             params.iterCountType == ITERCOUNTTYPE_DYNAMIC ? (isVertCase ? "a_iterCount" : "v_iterCount") :
165*35238bceSAndroid Build Coastguard Worker             params.iterCountType == ITERCOUNTTYPE_UNIFORM ? "u_iterCount" :
166*35238bceSAndroid Build Coastguard Worker             params.iterCountType == ITERCOUNTTYPE_STATIC  ? de::toString(params.maxLoopIterCount) :
167*35238bceSAndroid Build Coastguard Worker                                                             "<invalid>";
168*35238bceSAndroid Build Coastguard Worker         const char *const body = "color = cos(sin(color*1.25)*0.8);";
169*35238bceSAndroid Build Coastguard Worker         std::ostringstream &op = isVertCase ? vert : frag;
170*35238bceSAndroid Build Coastguard Worker 
171*35238bceSAndroid Build Coastguard Worker         op << "    mediump vec4 color = " << (isVertCase ? "a_position.xyxy" : "gl_FragCoord") << ";\n";
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker         if (params.loopType == LOOPTYPE_FOR)
174*35238bceSAndroid Build Coastguard Worker         {
175*35238bceSAndroid Build Coastguard Worker             op << "    for (highp int i = 0; i < " << iterCount << " || " << iterCount << " < 0; ++i)\n"
176*35238bceSAndroid Build Coastguard Worker                << "        " << body << "\n";
177*35238bceSAndroid Build Coastguard Worker         }
178*35238bceSAndroid Build Coastguard Worker         else if (params.loopType == LOOPTYPE_WHILE)
179*35238bceSAndroid Build Coastguard Worker         {
180*35238bceSAndroid Build Coastguard Worker             op << "    highp int i = 0;\n"
181*35238bceSAndroid Build Coastguard Worker                << "    while (i < " << iterCount << " || " << iterCount << " < 0) {\n"
182*35238bceSAndroid Build Coastguard Worker                << "        i += 1;\n"
183*35238bceSAndroid Build Coastguard Worker                << "        " << body << "\n"
184*35238bceSAndroid Build Coastguard Worker                << "    }\n";
185*35238bceSAndroid Build Coastguard Worker         }
186*35238bceSAndroid Build Coastguard Worker         else
187*35238bceSAndroid Build Coastguard Worker         {
188*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(params.loopType == LOOPTYPE_DO_WHILE);
189*35238bceSAndroid Build Coastguard Worker             op << "    highp int i = 0;\n"
190*35238bceSAndroid Build Coastguard Worker                << "    do {\n"
191*35238bceSAndroid Build Coastguard Worker                << "        i += 1;\n"
192*35238bceSAndroid Build Coastguard Worker                << "        " << body << "\n"
193*35238bceSAndroid Build Coastguard Worker                << "    } while (i <= " << iterCount << " || " << iterCount << " < 0);\n";
194*35238bceSAndroid Build Coastguard Worker         }
195*35238bceSAndroid Build Coastguard Worker     }
196*35238bceSAndroid Build Coastguard Worker 
197*35238bceSAndroid Build Coastguard Worker     if (isVertCase)
198*35238bceSAndroid Build Coastguard Worker     {
199*35238bceSAndroid Build Coastguard Worker         vert << "    v_color = color;\n";
200*35238bceSAndroid Build Coastguard Worker         frag << "    o_color = v_color;\n";
201*35238bceSAndroid Build Coastguard Worker     }
202*35238bceSAndroid Build Coastguard Worker     else
203*35238bceSAndroid Build Coastguard Worker         frag << "    o_color = color;\n";
204*35238bceSAndroid Build Coastguard Worker 
205*35238bceSAndroid Build Coastguard Worker     vert << "}\n";
206*35238bceSAndroid Build Coastguard Worker     frag << "}\n";
207*35238bceSAndroid Build Coastguard Worker 
208*35238bceSAndroid Build Coastguard Worker     return glu::ProgramSources() << glu::VertexSource(vert.str()) << glu::FragmentSource(frag.str());
209*35238bceSAndroid Build Coastguard Worker }
210*35238bceSAndroid Build Coastguard Worker 
init(void)211*35238bceSAndroid Build Coastguard Worker void LongRunningShaderCase::init(void)
212*35238bceSAndroid Build Coastguard Worker {
213*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!m_program);
214*35238bceSAndroid Build Coastguard Worker     m_program = new glu::ShaderProgram(m_context.getRenderContext(), genSources(*m_params));
215*35238bceSAndroid Build Coastguard Worker 
216*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << *m_program;
217*35238bceSAndroid Build Coastguard Worker 
218*35238bceSAndroid Build Coastguard Worker     if (!m_program->isOk())
219*35238bceSAndroid Build Coastguard Worker     {
220*35238bceSAndroid Build Coastguard Worker         deinit();
221*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("Failed to compile shader program");
222*35238bceSAndroid Build Coastguard Worker     }
223*35238bceSAndroid Build Coastguard Worker 
224*35238bceSAndroid Build Coastguard Worker     m_caseIterNdx = 0;
225*35238bceSAndroid Build Coastguard Worker 
226*35238bceSAndroid Build Coastguard Worker     if (m_params->iterCountType != ITERCOUNTTYPE_STATIC)
227*35238bceSAndroid Build Coastguard Worker     {
228*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << TestLog::Message << "Loop iteration counts in range: [" << m_params->minLoopIterCount
229*35238bceSAndroid Build Coastguard Worker                            << ", " << m_params->maxLoopIterCount << "]" << TestLog::EndMessage;
230*35238bceSAndroid Build Coastguard Worker     }
231*35238bceSAndroid Build Coastguard Worker 
232*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << TestLog::Message << "Number of vertices and fragments: " << m_params->numInvocations
233*35238bceSAndroid Build Coastguard Worker                        << TestLog::EndMessage;
234*35238bceSAndroid Build Coastguard Worker 
235*35238bceSAndroid Build Coastguard Worker     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); // Test will pass or timeout, unless driver/device crashes.
236*35238bceSAndroid Build Coastguard Worker }
237*35238bceSAndroid Build Coastguard Worker 
deinit(void)238*35238bceSAndroid Build Coastguard Worker void LongRunningShaderCase::deinit(void)
239*35238bceSAndroid Build Coastguard Worker {
240*35238bceSAndroid Build Coastguard Worker     delete m_program;
241*35238bceSAndroid Build Coastguard Worker     m_program = DE_NULL;
242*35238bceSAndroid Build Coastguard Worker }
243*35238bceSAndroid Build Coastguard Worker 
genPositions(const tcu::RenderTarget & renderTarget,int numPoints,Vec2 * positions)244*35238bceSAndroid Build Coastguard Worker void genPositions(const tcu::RenderTarget &renderTarget, int numPoints, Vec2 *positions)
245*35238bceSAndroid Build Coastguard Worker {
246*35238bceSAndroid Build Coastguard Worker     const int width  = renderTarget.getWidth();
247*35238bceSAndroid Build Coastguard Worker     const int height = renderTarget.getHeight();
248*35238bceSAndroid Build Coastguard Worker 
249*35238bceSAndroid Build Coastguard Worker     if (width * height < numPoints)
250*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("Too small viewport to fit all test points");
251*35238bceSAndroid Build Coastguard Worker 
252*35238bceSAndroid Build Coastguard Worker     for (int pointNdx = 0; pointNdx < numPoints; pointNdx++)
253*35238bceSAndroid Build Coastguard Worker     {
254*35238bceSAndroid Build Coastguard Worker         const int xi   = pointNdx % width;
255*35238bceSAndroid Build Coastguard Worker         const int yi   = pointNdx / height;
256*35238bceSAndroid Build Coastguard Worker         const float xf = 2.0f * ((float(xi) + 0.5f) / float(width)) - 1.0f;
257*35238bceSAndroid Build Coastguard Worker         const float yf = 2.0f * ((float(yi) + 0.5f) / float(height)) - 1.0f;
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker         positions[pointNdx] = Vec2(xf, yf);
260*35238bceSAndroid Build Coastguard Worker     }
261*35238bceSAndroid Build Coastguard Worker }
262*35238bceSAndroid Build Coastguard Worker 
getSeed(const Params & params)263*35238bceSAndroid Build Coastguard Worker uint32_t LongRunningShaderCase::getSeed(const Params &params)
264*35238bceSAndroid Build Coastguard Worker {
265*35238bceSAndroid Build Coastguard Worker     const uint32_t seed = deStringHash(params.name) ^ deInt32Hash(params.shaderType) ^ deInt32Hash(params.loopType) ^
266*35238bceSAndroid Build Coastguard Worker                           deInt32Hash(params.iterCountType) ^ deInt32Hash(params.minLoopIterCount) ^
267*35238bceSAndroid Build Coastguard Worker                           deInt32Hash(params.maxLoopIterCount) ^ deInt32Hash(params.numInvocations);
268*35238bceSAndroid Build Coastguard Worker     return seed;
269*35238bceSAndroid Build Coastguard Worker }
270*35238bceSAndroid Build Coastguard Worker 
iterate(void)271*35238bceSAndroid Build Coastguard Worker LongRunningShaderCase::IterateResult LongRunningShaderCase::iterate(void)
272*35238bceSAndroid Build Coastguard Worker {
273*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
274*35238bceSAndroid Build Coastguard Worker     de::Random rnd(getSeed(*m_params));
275*35238bceSAndroid Build Coastguard Worker     vector<Vec2> positions(m_params->numInvocations);
276*35238bceSAndroid Build Coastguard Worker     vector<int> iterCounts(m_params->iterCountType == ITERCOUNTTYPE_DYNAMIC ? m_params->numInvocations : 1);
277*35238bceSAndroid Build Coastguard Worker     vector<glu::VertexArrayBinding> vertexArrays;
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker     vertexArrays.push_back(glu::va::Float("a_position", 2, (int)positions.size(), 0, positions[0].getPtr()));
280*35238bceSAndroid Build Coastguard Worker     if (m_params->iterCountType == ITERCOUNTTYPE_DYNAMIC)
281*35238bceSAndroid Build Coastguard Worker         vertexArrays.push_back(glu::va::Int32("a_iterCount", 1, (int)iterCounts.size(), 0, &iterCounts[0]));
282*35238bceSAndroid Build Coastguard Worker 
283*35238bceSAndroid Build Coastguard Worker     genPositions(m_context.getRenderTarget(), (int)positions.size(), &positions[0]);
284*35238bceSAndroid Build Coastguard Worker 
285*35238bceSAndroid Build Coastguard Worker     for (vector<int>::iterator i = iterCounts.begin(); i != iterCounts.end(); ++i)
286*35238bceSAndroid Build Coastguard Worker         *i = rnd.getInt(m_params->minLoopIterCount, m_params->maxLoopIterCount);
287*35238bceSAndroid Build Coastguard Worker 
288*35238bceSAndroid Build Coastguard Worker     gl.useProgram(m_program->getProgram());
289*35238bceSAndroid Build Coastguard Worker 
290*35238bceSAndroid Build Coastguard Worker     if (m_params->iterCountType == ITERCOUNTTYPE_UNIFORM)
291*35238bceSAndroid Build Coastguard Worker         gl.uniform1i(gl.getUniformLocation(m_program->getProgram(), "u_iterCount"), iterCounts[0]);
292*35238bceSAndroid Build Coastguard Worker 
293*35238bceSAndroid Build Coastguard Worker     glu::draw(m_context.getRenderContext(), m_program->getProgram(), (int)vertexArrays.size(), &vertexArrays[0],
294*35238bceSAndroid Build Coastguard Worker               glu::pr::Points(m_params->numInvocations));
295*35238bceSAndroid Build Coastguard Worker 
296*35238bceSAndroid Build Coastguard Worker     m_caseIterNdx += 1;
297*35238bceSAndroid Build Coastguard Worker     return (m_caseIterNdx < m_numCaseIters) ? CONTINUE : STOP;
298*35238bceSAndroid Build Coastguard Worker }
299*35238bceSAndroid Build Coastguard Worker 
300*35238bceSAndroid Build Coastguard Worker } // namespace
301*35238bceSAndroid Build Coastguard Worker 
LongRunningShaderTests(Context & context)302*35238bceSAndroid Build Coastguard Worker LongRunningShaderTests::LongRunningShaderTests(Context &context)
303*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "long_running_shaders", "Long-running shader stress tests")
304*35238bceSAndroid Build Coastguard Worker {
305*35238bceSAndroid Build Coastguard Worker }
306*35238bceSAndroid Build Coastguard Worker 
~LongRunningShaderTests(void)307*35238bceSAndroid Build Coastguard Worker LongRunningShaderTests::~LongRunningShaderTests(void)
308*35238bceSAndroid Build Coastguard Worker {
309*35238bceSAndroid Build Coastguard Worker }
310*35238bceSAndroid Build Coastguard Worker 
init(void)311*35238bceSAndroid Build Coastguard Worker void LongRunningShaderTests::init(void)
312*35238bceSAndroid Build Coastguard Worker {
313*35238bceSAndroid Build Coastguard Worker     const int numInvocations = 4096;
314*35238bceSAndroid Build Coastguard Worker     const int shortLoopMin   = 5;
315*35238bceSAndroid Build Coastguard Worker     const int shortLoopMax   = 10;
316*35238bceSAndroid Build Coastguard Worker     const int mediumLoopMin  = 10000;
317*35238bceSAndroid Build Coastguard Worker     const int mediumLoopMax  = 50000;
318*35238bceSAndroid Build Coastguard Worker     const int longLoopMin    = 100000;
319*35238bceSAndroid Build Coastguard Worker     const int longLoopMax    = 500000;
320*35238bceSAndroid Build Coastguard Worker 
321*35238bceSAndroid Build Coastguard Worker     static const LongRunningShaderCase::Params s_cases[] = {
322*35238bceSAndroid Build Coastguard Worker         {"short_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations,
323*35238bceSAndroid Build Coastguard Worker          shortLoopMin, shortLoopMax},
324*35238bceSAndroid Build Coastguard Worker         {"short_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations,
325*35238bceSAndroid Build Coastguard Worker          shortLoopMin, shortLoopMax},
326*35238bceSAndroid Build Coastguard Worker         {"short_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations,
327*35238bceSAndroid Build Coastguard Worker          shortLoopMin, shortLoopMax},
328*35238bceSAndroid Build Coastguard Worker         {"short_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations,
329*35238bceSAndroid Build Coastguard Worker          shortLoopMin, shortLoopMax},
330*35238bceSAndroid Build Coastguard Worker         {"short_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations,
331*35238bceSAndroid Build Coastguard Worker          shortLoopMin, shortLoopMax},
332*35238bceSAndroid Build Coastguard Worker         {"short_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC,
333*35238bceSAndroid Build Coastguard Worker          numInvocations, shortLoopMin, shortLoopMax},
334*35238bceSAndroid Build Coastguard Worker 
335*35238bceSAndroid Build Coastguard Worker         {"medium_static_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_STATIC, numInvocations,
336*35238bceSAndroid Build Coastguard Worker          mediumLoopMin, mediumLoopMax},
337*35238bceSAndroid Build Coastguard Worker         {"medium_static_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_STATIC,
338*35238bceSAndroid Build Coastguard Worker          numInvocations, mediumLoopMin, mediumLoopMax},
339*35238bceSAndroid Build Coastguard Worker         {"medium_uniform_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_UNIFORM,
340*35238bceSAndroid Build Coastguard Worker          numInvocations, mediumLoopMin, mediumLoopMax},
341*35238bceSAndroid Build Coastguard Worker         {"medium_uniform_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_UNIFORM,
342*35238bceSAndroid Build Coastguard Worker          numInvocations, mediumLoopMin, mediumLoopMax},
343*35238bceSAndroid Build Coastguard Worker 
344*35238bceSAndroid Build Coastguard Worker         {"medium_dynamic_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations,
345*35238bceSAndroid Build Coastguard Worker          mediumLoopMin, mediumLoopMax},
346*35238bceSAndroid Build Coastguard Worker         {"medium_dynamic_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC,
347*35238bceSAndroid Build Coastguard Worker          numInvocations, mediumLoopMin, mediumLoopMax},
348*35238bceSAndroid Build Coastguard Worker         {"medium_dynamic_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC,
349*35238bceSAndroid Build Coastguard Worker          numInvocations, mediumLoopMin, mediumLoopMax},
350*35238bceSAndroid Build Coastguard Worker         {"medium_dynamic_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC,
351*35238bceSAndroid Build Coastguard Worker          numInvocations, mediumLoopMin, mediumLoopMax},
352*35238bceSAndroid Build Coastguard Worker         {"medium_dynamic_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC,
353*35238bceSAndroid Build Coastguard Worker          numInvocations, mediumLoopMin, mediumLoopMax},
354*35238bceSAndroid Build Coastguard Worker         {"medium_dynamic_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC,
355*35238bceSAndroid Build Coastguard Worker          numInvocations, mediumLoopMin, mediumLoopMax},
356*35238bceSAndroid Build Coastguard Worker 
357*35238bceSAndroid Build Coastguard Worker         {"long_static_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_STATIC, numInvocations,
358*35238bceSAndroid Build Coastguard Worker          longLoopMin, longLoopMax},
359*35238bceSAndroid Build Coastguard Worker         {"long_static_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_STATIC,
360*35238bceSAndroid Build Coastguard Worker          numInvocations, longLoopMin, longLoopMax},
361*35238bceSAndroid Build Coastguard Worker         {"long_uniform_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_UNIFORM, numInvocations,
362*35238bceSAndroid Build Coastguard Worker          longLoopMin, longLoopMax},
363*35238bceSAndroid Build Coastguard Worker         {"long_uniform_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_UNIFORM,
364*35238bceSAndroid Build Coastguard Worker          numInvocations, longLoopMin, longLoopMax},
365*35238bceSAndroid Build Coastguard Worker 
366*35238bceSAndroid Build Coastguard Worker         {"long_dynamic_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations,
367*35238bceSAndroid Build Coastguard Worker          longLoopMin, longLoopMax},
368*35238bceSAndroid Build Coastguard Worker         {"long_dynamic_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations,
369*35238bceSAndroid Build Coastguard Worker          longLoopMin, longLoopMax},
370*35238bceSAndroid Build Coastguard Worker         {"long_dynamic_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations,
371*35238bceSAndroid Build Coastguard Worker          longLoopMin, longLoopMax},
372*35238bceSAndroid Build Coastguard Worker         {"long_dynamic_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC,
373*35238bceSAndroid Build Coastguard Worker          numInvocations, longLoopMin, longLoopMax},
374*35238bceSAndroid Build Coastguard Worker         {"long_dynamic_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC,
375*35238bceSAndroid Build Coastguard Worker          numInvocations, longLoopMin, longLoopMax},
376*35238bceSAndroid Build Coastguard Worker         {"long_dynamic_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC,
377*35238bceSAndroid Build Coastguard Worker          numInvocations, longLoopMin, longLoopMax},
378*35238bceSAndroid Build Coastguard Worker 
379*35238bceSAndroid Build Coastguard Worker         {"infinite_for_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1,
380*35238bceSAndroid Build Coastguard Worker          -1},
381*35238bceSAndroid Build Coastguard Worker         {"infinite_for_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_FOR, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1,
382*35238bceSAndroid Build Coastguard Worker          -1},
383*35238bceSAndroid Build Coastguard Worker         {"infinite_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations, -1,
384*35238bceSAndroid Build Coastguard Worker          -1},
385*35238bceSAndroid Build Coastguard Worker         {"infinite_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_WHILE, ITERCOUNTTYPE_DYNAMIC, numInvocations,
386*35238bceSAndroid Build Coastguard Worker          -1, -1},
387*35238bceSAndroid Build Coastguard Worker         {"infinite_do_while_vertex", "", glu::SHADERTYPE_VERTEX, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC,
388*35238bceSAndroid Build Coastguard Worker          numInvocations, -1, -1},
389*35238bceSAndroid Build Coastguard Worker         {"infinite_do_while_fragment", "", glu::SHADERTYPE_FRAGMENT, LOOPTYPE_DO_WHILE, ITERCOUNTTYPE_DYNAMIC,
390*35238bceSAndroid Build Coastguard Worker          numInvocations, -1, -1},
391*35238bceSAndroid Build Coastguard Worker     };
392*35238bceSAndroid Build Coastguard Worker 
393*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_cases); ndx++)
394*35238bceSAndroid Build Coastguard Worker         addChild(new LongRunningShaderCase(m_context, &s_cases[ndx]));
395*35238bceSAndroid Build Coastguard Worker }
396*35238bceSAndroid Build Coastguard Worker 
397*35238bceSAndroid Build Coastguard Worker } // namespace Stress
398*35238bceSAndroid Build Coastguard Worker } // namespace gles3
399*35238bceSAndroid Build Coastguard Worker } // namespace deqp
400