1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 2.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 stress tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es2sLongRunningTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsLongStressCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "glsLongStressTestUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Worker #include <string>
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker using std::string;
32*35238bceSAndroid Build Coastguard Worker
33*35238bceSAndroid Build Coastguard Worker namespace deqp
34*35238bceSAndroid Build Coastguard Worker {
35*35238bceSAndroid Build Coastguard Worker namespace gles2
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker namespace Stress
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker
LongRunningTests(Context & context)40*35238bceSAndroid Build Coastguard Worker LongRunningTests::LongRunningTests(Context &context) : TestCaseGroup(context, "long", "Long-running stress tests")
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker }
43*35238bceSAndroid Build Coastguard Worker
~LongRunningTests(void)44*35238bceSAndroid Build Coastguard Worker LongRunningTests::~LongRunningTests(void)
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker }
47*35238bceSAndroid Build Coastguard Worker
init(void)48*35238bceSAndroid Build Coastguard Worker void LongRunningTests::init(void)
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker static const int Mi = 1 << 20;
51*35238bceSAndroid Build Coastguard Worker const gls::LongStressTestUtil::ProgramLibrary progLib(glu::GLSL_VERSION_100_ES);
52*35238bceSAndroid Build Coastguard Worker
53*35238bceSAndroid Build Coastguard Worker typedef gls::LongStressCase::FeatureProbabilities Probs;
54*35238bceSAndroid Build Coastguard Worker
55*35238bceSAndroid Build Coastguard Worker // Buffer cases.
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker static const struct MemCase
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker const char *const nameSuffix;
61*35238bceSAndroid Build Coastguard Worker const char *const descSuffix;
62*35238bceSAndroid Build Coastguard Worker const int limit;
63*35238bceSAndroid Build Coastguard Worker const int redundantBufferFactor;
64*35238bceSAndroid Build Coastguard Worker MemCase(const char *n, const char *d, int l, int r)
65*35238bceSAndroid Build Coastguard Worker : nameSuffix(n)
66*35238bceSAndroid Build Coastguard Worker , descSuffix(d)
67*35238bceSAndroid Build Coastguard Worker , limit(l)
68*35238bceSAndroid Build Coastguard Worker , redundantBufferFactor(r)
69*35238bceSAndroid Build Coastguard Worker {
70*35238bceSAndroid Build Coastguard Worker }
71*35238bceSAndroid Build Coastguard Worker } memoryLimitCases[] = {MemCase("_low_memory", "; use a low buffer memory usage limit", 8 * Mi, 2),
72*35238bceSAndroid Build Coastguard Worker MemCase("_high_memory", "; use a high buffer memory usage limit", 256 * Mi, 64)};
73*35238bceSAndroid Build Coastguard Worker
74*35238bceSAndroid Build Coastguard Worker const std::vector<gls::ProgramContext> contexts(1, progLib.generateBufferContext(4));
75*35238bceSAndroid Build Coastguard Worker
76*35238bceSAndroid Build Coastguard Worker static const struct Case
77*35238bceSAndroid Build Coastguard Worker {
78*35238bceSAndroid Build Coastguard Worker const char *const name;
79*35238bceSAndroid Build Coastguard Worker const char *const desc;
80*35238bceSAndroid Build Coastguard Worker const int redundantBufferFactor; //!< If non-positive, taken from memoryLimitCases.
81*35238bceSAndroid Build Coastguard Worker const Probs probs;
82*35238bceSAndroid Build Coastguard Worker Case(const char *const name_, const char *const desc_, int bufFact, const Probs &probs_ = Probs())
83*35238bceSAndroid Build Coastguard Worker : name(name_)
84*35238bceSAndroid Build Coastguard Worker , desc(desc_)
85*35238bceSAndroid Build Coastguard Worker , redundantBufferFactor(bufFact)
86*35238bceSAndroid Build Coastguard Worker , probs(probs_)
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker }
89*35238bceSAndroid Build Coastguard Worker } cases[] = {Case("always_reupload", "Re-upload buffer data at the beginning of each iteration", -1,
90*35238bceSAndroid Build Coastguard Worker Probs().pReuploadBuffer(1.0f)),
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker Case("always_reupload_bufferdata",
93*35238bceSAndroid Build Coastguard Worker "Re-upload buffer data at the beginning of each iteration, using glBufferData", -1,
94*35238bceSAndroid Build Coastguard Worker Probs().pReuploadBuffer(1.0f).pReuploadWithBufferData(1.0f)),
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker Case("always_delete",
97*35238bceSAndroid Build Coastguard Worker "Delete buffers at the end of each iteration, and re-create at the beginning of the next", -1,
98*35238bceSAndroid Build Coastguard Worker Probs().pDeleteBuffer(1.0f)),
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker Case("wasteful", "Don't reuse buffers, and only delete them when given memory limit is reached", 2,
101*35238bceSAndroid Build Coastguard Worker Probs().pWastefulBufferMemoryUsage(1.0f)),
102*35238bceSAndroid Build Coastguard Worker
103*35238bceSAndroid Build Coastguard Worker Case("separate_attribute_buffers_wasteful", "Give each vertex attribute its own buffer", 2,
104*35238bceSAndroid Build Coastguard Worker Probs().pSeparateAttribBuffers(1.0f).pWastefulBufferMemoryUsage(1.0f))};
105*35238bceSAndroid Build Coastguard Worker
106*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const bufferGroup = new TestCaseGroup(m_context, "buffer", "Buffer stress tests");
107*35238bceSAndroid Build Coastguard Worker addChild(bufferGroup);
108*35238bceSAndroid Build Coastguard Worker
109*35238bceSAndroid Build Coastguard Worker for (int memoryLimitNdx = 0; memoryLimitNdx < DE_LENGTH_OF_ARRAY(memoryLimitCases); memoryLimitNdx++)
110*35238bceSAndroid Build Coastguard Worker {
111*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); caseNdx++)
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker const int redundantBufferFactor = cases[caseNdx].redundantBufferFactor > 0 ?
114*35238bceSAndroid Build Coastguard Worker cases[caseNdx].redundantBufferFactor :
115*35238bceSAndroid Build Coastguard Worker memoryLimitCases[memoryLimitNdx].redundantBufferFactor;
116*35238bceSAndroid Build Coastguard Worker
117*35238bceSAndroid Build Coastguard Worker bufferGroup->addChild(new gls::LongStressCase(
118*35238bceSAndroid Build Coastguard Worker m_context.getTestContext(), m_context.getRenderContext(),
119*35238bceSAndroid Build Coastguard Worker (string() + cases[caseNdx].name + memoryLimitCases[memoryLimitNdx].nameSuffix).c_str(),
120*35238bceSAndroid Build Coastguard Worker (string() + cases[caseNdx].desc + memoryLimitCases[memoryLimitNdx].descSuffix).c_str(),
121*35238bceSAndroid Build Coastguard Worker 0 /* tex memory */, memoryLimitCases[memoryLimitNdx].limit, 1 /* draw calls per iteration */,
122*35238bceSAndroid Build Coastguard Worker 50000 /* tris per call */, contexts, cases[caseNdx].probs, GL_DYNAMIC_DRAW, GL_DYNAMIC_DRAW,
123*35238bceSAndroid Build Coastguard Worker redundantBufferFactor));
124*35238bceSAndroid Build Coastguard Worker }
125*35238bceSAndroid Build Coastguard Worker }
126*35238bceSAndroid Build Coastguard Worker }
127*35238bceSAndroid Build Coastguard Worker
128*35238bceSAndroid Build Coastguard Worker // Texture cases.
129*35238bceSAndroid Build Coastguard Worker
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker static const struct MemCase
132*35238bceSAndroid Build Coastguard Worker {
133*35238bceSAndroid Build Coastguard Worker const char *const nameSuffix;
134*35238bceSAndroid Build Coastguard Worker const char *const descSuffix;
135*35238bceSAndroid Build Coastguard Worker const int limit;
136*35238bceSAndroid Build Coastguard Worker const int numTextures;
137*35238bceSAndroid Build Coastguard Worker MemCase(const char *n, const char *d, int l, int t) : nameSuffix(n), descSuffix(d), limit(l), numTextures(t)
138*35238bceSAndroid Build Coastguard Worker {
139*35238bceSAndroid Build Coastguard Worker }
140*35238bceSAndroid Build Coastguard Worker } memoryLimitCases[] = {MemCase("_low_memory", "; use a low texture memory usage limit", 8 * Mi, 6),
141*35238bceSAndroid Build Coastguard Worker MemCase("_high_memory", "; use a high texture memory usage limit", 256 * Mi, 192)};
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker static const struct Case
144*35238bceSAndroid Build Coastguard Worker {
145*35238bceSAndroid Build Coastguard Worker const char *const name;
146*35238bceSAndroid Build Coastguard Worker const char *const desc;
147*35238bceSAndroid Build Coastguard Worker const int numTextures; //!< If non-positive, taken from memoryLimitCases.
148*35238bceSAndroid Build Coastguard Worker const Probs probs;
149*35238bceSAndroid Build Coastguard Worker Case(const char *const name_, const char *const desc_, int numTextures_, const Probs &probs_ = Probs())
150*35238bceSAndroid Build Coastguard Worker : name(name_)
151*35238bceSAndroid Build Coastguard Worker , desc(desc_)
152*35238bceSAndroid Build Coastguard Worker , numTextures(numTextures_)
153*35238bceSAndroid Build Coastguard Worker , probs(probs_)
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker }
156*35238bceSAndroid Build Coastguard Worker } cases[] = {Case("always_reupload", "Re-upload texture data at the beginning of each iteration", -1,
157*35238bceSAndroid Build Coastguard Worker Probs().pReuploadTexture(1.0f)),
158*35238bceSAndroid Build Coastguard Worker
159*35238bceSAndroid Build Coastguard Worker Case("always_reupload_teximage",
160*35238bceSAndroid Build Coastguard Worker "Re-upload texture data at the beginning of each iteration, using glTexImage*", -1,
161*35238bceSAndroid Build Coastguard Worker Probs().pReuploadTexture(1.0f).pReuploadWithTexImage(1.0f)),
162*35238bceSAndroid Build Coastguard Worker
163*35238bceSAndroid Build Coastguard Worker Case("always_delete",
164*35238bceSAndroid Build Coastguard Worker "Delete textures at the end of each iteration, and re-create at the beginning of the next",
165*35238bceSAndroid Build Coastguard Worker -1, Probs().pDeleteTexture(1.0f)),
166*35238bceSAndroid Build Coastguard Worker
167*35238bceSAndroid Build Coastguard Worker Case("wasteful", "Don't reuse textures, and only delete them when given memory limit is reached",
168*35238bceSAndroid Build Coastguard Worker 6, Probs().pWastefulTextureMemoryUsage(1.0f))};
169*35238bceSAndroid Build Coastguard Worker
170*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const textureGroup = new TestCaseGroup(m_context, "texture", "Texture stress tests");
171*35238bceSAndroid Build Coastguard Worker addChild(textureGroup);
172*35238bceSAndroid Build Coastguard Worker
173*35238bceSAndroid Build Coastguard Worker for (int memoryLimitNdx = 0; memoryLimitNdx < DE_LENGTH_OF_ARRAY(memoryLimitCases); memoryLimitNdx++)
174*35238bceSAndroid Build Coastguard Worker {
175*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); caseNdx++)
176*35238bceSAndroid Build Coastguard Worker {
177*35238bceSAndroid Build Coastguard Worker const int numTextures = cases[caseNdx].numTextures > 0 ? cases[caseNdx].numTextures :
178*35238bceSAndroid Build Coastguard Worker memoryLimitCases[memoryLimitNdx].numTextures;
179*35238bceSAndroid Build Coastguard Worker const std::vector<gls::ProgramContext> contexts(
180*35238bceSAndroid Build Coastguard Worker 1, progLib.generateTextureContext(numTextures, 512, 512, 0.1f));
181*35238bceSAndroid Build Coastguard Worker
182*35238bceSAndroid Build Coastguard Worker textureGroup->addChild(new gls::LongStressCase(
183*35238bceSAndroid Build Coastguard Worker m_context.getTestContext(), m_context.getRenderContext(),
184*35238bceSAndroid Build Coastguard Worker (string() + cases[caseNdx].name + memoryLimitCases[memoryLimitNdx].nameSuffix).c_str(),
185*35238bceSAndroid Build Coastguard Worker (string() + cases[caseNdx].desc + memoryLimitCases[memoryLimitNdx].descSuffix).c_str(),
186*35238bceSAndroid Build Coastguard Worker memoryLimitCases[memoryLimitNdx].limit, 1 * Mi /* buf memory */, 1 /* draw calls per iteration */,
187*35238bceSAndroid Build Coastguard Worker 10000 /* tris per call */, contexts, cases[caseNdx].probs, GL_STATIC_DRAW, GL_STATIC_DRAW));
188*35238bceSAndroid Build Coastguard Worker }
189*35238bceSAndroid Build Coastguard Worker }
190*35238bceSAndroid Build Coastguard Worker }
191*35238bceSAndroid Build Coastguard Worker
192*35238bceSAndroid Build Coastguard Worker // Draw call cases.
193*35238bceSAndroid Build Coastguard Worker
194*35238bceSAndroid Build Coastguard Worker {
195*35238bceSAndroid Build Coastguard Worker const std::vector<gls::ProgramContext> contexts(1, progLib.generateTextureContext(1, 128, 128, 0.5f));
196*35238bceSAndroid Build Coastguard Worker
197*35238bceSAndroid Build Coastguard Worker static const struct Case
198*35238bceSAndroid Build Coastguard Worker {
199*35238bceSAndroid Build Coastguard Worker const char *const name;
200*35238bceSAndroid Build Coastguard Worker const char *const desc;
201*35238bceSAndroid Build Coastguard Worker const int drawCallsPerIteration;
202*35238bceSAndroid Build Coastguard Worker const int numTrisPerDrawCall;
203*35238bceSAndroid Build Coastguard Worker const Probs probs;
204*35238bceSAndroid Build Coastguard Worker Case(const char *const name_, const char *const desc_, const int calls, const int tris,
205*35238bceSAndroid Build Coastguard Worker const Probs &probs_ = Probs())
206*35238bceSAndroid Build Coastguard Worker : name(name_)
207*35238bceSAndroid Build Coastguard Worker , desc(desc_)
208*35238bceSAndroid Build Coastguard Worker , drawCallsPerIteration(calls)
209*35238bceSAndroid Build Coastguard Worker , numTrisPerDrawCall(tris)
210*35238bceSAndroid Build Coastguard Worker , probs(probs_)
211*35238bceSAndroid Build Coastguard Worker {
212*35238bceSAndroid Build Coastguard Worker }
213*35238bceSAndroid Build Coastguard Worker } cases[] = {Case("client_memory_data", "Use client-memory for index and attribute data, instead of GL buffers",
214*35238bceSAndroid Build Coastguard Worker 200, 500, Probs().pClientMemoryAttributeData(1.0f).pClientMemoryIndexData(1.0f)),
215*35238bceSAndroid Build Coastguard Worker
216*35238bceSAndroid Build Coastguard Worker Case("vary_draw_function",
217*35238bceSAndroid Build Coastguard Worker "Choose between glDrawElements and glDrawArrays each iteration, with uniform probability",
218*35238bceSAndroid Build Coastguard Worker 200, 500, Probs().pUseDrawArrays(0.5f)),
219*35238bceSAndroid Build Coastguard Worker
220*35238bceSAndroid Build Coastguard Worker Case("few_big_calls", "Per iteration, do a few draw calls with a big number of triangles per call",
221*35238bceSAndroid Build Coastguard Worker 2, 50000),
222*35238bceSAndroid Build Coastguard Worker
223*35238bceSAndroid Build Coastguard Worker Case("many_small_calls",
224*35238bceSAndroid Build Coastguard Worker "Per iteration, do many draw calls with a small number of triangles per call", 2000, 50)};
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const drawCallGroup = new TestCaseGroup(m_context, "draw_call", "Draw call stress tests");
227*35238bceSAndroid Build Coastguard Worker addChild(drawCallGroup);
228*35238bceSAndroid Build Coastguard Worker
229*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); caseNdx++)
230*35238bceSAndroid Build Coastguard Worker {
231*35238bceSAndroid Build Coastguard Worker drawCallGroup->addChild(new gls::LongStressCase(
232*35238bceSAndroid Build Coastguard Worker m_context.getTestContext(), m_context.getRenderContext(), cases[caseNdx].name, cases[caseNdx].desc,
233*35238bceSAndroid Build Coastguard Worker 1 * Mi /* tex memory */, 2 * Mi /* buf memory */, cases[caseNdx].drawCallsPerIteration,
234*35238bceSAndroid Build Coastguard Worker cases[caseNdx].numTrisPerDrawCall, contexts, cases[caseNdx].probs, GL_STATIC_DRAW, GL_STATIC_DRAW));
235*35238bceSAndroid Build Coastguard Worker }
236*35238bceSAndroid Build Coastguard Worker }
237*35238bceSAndroid Build Coastguard Worker
238*35238bceSAndroid Build Coastguard Worker // Shader cases.
239*35238bceSAndroid Build Coastguard Worker
240*35238bceSAndroid Build Coastguard Worker {
241*35238bceSAndroid Build Coastguard Worker std::vector<gls::ProgramContext> contexts;
242*35238bceSAndroid Build Coastguard Worker contexts.push_back(progLib.generateFragmentPointLightContext(512, 512));
243*35238bceSAndroid Build Coastguard Worker contexts.push_back(progLib.generateVertexUniformLoopLightContext(512, 512));
244*35238bceSAndroid Build Coastguard Worker
245*35238bceSAndroid Build Coastguard Worker static const struct Case
246*35238bceSAndroid Build Coastguard Worker {
247*35238bceSAndroid Build Coastguard Worker const char *const name;
248*35238bceSAndroid Build Coastguard Worker const char *const desc;
249*35238bceSAndroid Build Coastguard Worker const Probs probs;
250*35238bceSAndroid Build Coastguard Worker Case(const char *const name_, const char *const desc_, const Probs &probs_ = Probs())
251*35238bceSAndroid Build Coastguard Worker : name(name_)
252*35238bceSAndroid Build Coastguard Worker , desc(desc_)
253*35238bceSAndroid Build Coastguard Worker , probs(probs_)
254*35238bceSAndroid Build Coastguard Worker {
255*35238bceSAndroid Build Coastguard Worker }
256*35238bceSAndroid Build Coastguard Worker } cases[] = {Case("several_programs",
257*35238bceSAndroid Build Coastguard Worker "Use several different programs, choosing between them uniformly on each iteration"),
258*35238bceSAndroid Build Coastguard Worker
259*35238bceSAndroid Build Coastguard Worker Case("several_programs_always_rebuild",
260*35238bceSAndroid Build Coastguard Worker "Use several different programs, choosing between them uniformly on each iteration, and "
261*35238bceSAndroid Build Coastguard Worker "always rebuild the program",
262*35238bceSAndroid Build Coastguard Worker Probs().pRebuildProgram(1.0f))};
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const shaderGroup = new TestCaseGroup(m_context, "program", "Shader program stress tests");
265*35238bceSAndroid Build Coastguard Worker addChild(shaderGroup);
266*35238bceSAndroid Build Coastguard Worker
267*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); caseNdx++)
268*35238bceSAndroid Build Coastguard Worker {
269*35238bceSAndroid Build Coastguard Worker shaderGroup->addChild(new gls::LongStressCase(
270*35238bceSAndroid Build Coastguard Worker m_context.getTestContext(), m_context.getRenderContext(), cases[caseNdx].name, cases[caseNdx].desc,
271*35238bceSAndroid Build Coastguard Worker 3 * Mi /* tex memory */, 1 * Mi /* buf memory */, 1 /* draw calls per iteration */,
272*35238bceSAndroid Build Coastguard Worker 10000 /* tris per call */, contexts, cases[caseNdx].probs, GL_STATIC_DRAW, GL_STATIC_DRAW));
273*35238bceSAndroid Build Coastguard Worker }
274*35238bceSAndroid Build Coastguard Worker }
275*35238bceSAndroid Build Coastguard Worker
276*35238bceSAndroid Build Coastguard Worker // Mixed cases.
277*35238bceSAndroid Build Coastguard Worker
278*35238bceSAndroid Build Coastguard Worker {
279*35238bceSAndroid Build Coastguard Worker static const struct MemCase
280*35238bceSAndroid Build Coastguard Worker {
281*35238bceSAndroid Build Coastguard Worker const char *const nameSuffix;
282*35238bceSAndroid Build Coastguard Worker const char *const descSuffix;
283*35238bceSAndroid Build Coastguard Worker const int texLimit;
284*35238bceSAndroid Build Coastguard Worker const int bufLimit;
285*35238bceSAndroid Build Coastguard Worker MemCase(const char *n, const char *d, int t, int b) : nameSuffix(n), descSuffix(d), texLimit(t), bufLimit(b)
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker }
288*35238bceSAndroid Build Coastguard Worker } memoryLimitCases[] = {MemCase("_low_memory", "; use a low memory usage limit", 8 * Mi, 8 * Mi),
289*35238bceSAndroid Build Coastguard Worker MemCase("_high_memory", "; use a high memory usage limit", 128 * Mi, 128 * Mi)};
290*35238bceSAndroid Build Coastguard Worker
291*35238bceSAndroid Build Coastguard Worker TestCaseGroup *const mixedGroup = new TestCaseGroup(m_context, "mixed", "Mixed stress tests");
292*35238bceSAndroid Build Coastguard Worker addChild(mixedGroup);
293*35238bceSAndroid Build Coastguard Worker
294*35238bceSAndroid Build Coastguard Worker for (int memoryLimitNdx = 0; memoryLimitNdx < DE_LENGTH_OF_ARRAY(memoryLimitCases); memoryLimitNdx++)
295*35238bceSAndroid Build Coastguard Worker {
296*35238bceSAndroid Build Coastguard Worker mixedGroup->addChild(new gls::LongStressCase(
297*35238bceSAndroid Build Coastguard Worker m_context.getTestContext(), m_context.getRenderContext(),
298*35238bceSAndroid Build Coastguard Worker (string() + "buffer_texture_wasteful" + memoryLimitCases[memoryLimitNdx].nameSuffix).c_str(),
299*35238bceSAndroid Build Coastguard Worker (string() + "Use both buffers and textures wastefully" + memoryLimitCases[memoryLimitNdx].descSuffix)
300*35238bceSAndroid Build Coastguard Worker .c_str(),
301*35238bceSAndroid Build Coastguard Worker memoryLimitCases[memoryLimitNdx].texLimit, memoryLimitCases[memoryLimitNdx].bufLimit,
302*35238bceSAndroid Build Coastguard Worker 1 /* draw calls per iteration */, 10000 /* tris per call */,
303*35238bceSAndroid Build Coastguard Worker std::vector<gls::ProgramContext>(1, progLib.generateBufferAndTextureContext(4, 512, 512)),
304*35238bceSAndroid Build Coastguard Worker Probs()
305*35238bceSAndroid Build Coastguard Worker .pReuploadTexture(0.3f)
306*35238bceSAndroid Build Coastguard Worker .pReuploadWithTexImage(0.5f)
307*35238bceSAndroid Build Coastguard Worker .pReuploadBuffer(0.3f)
308*35238bceSAndroid Build Coastguard Worker .pReuploadWithBufferData(0.5f)
309*35238bceSAndroid Build Coastguard Worker .pDeleteTexture(0.2f)
310*35238bceSAndroid Build Coastguard Worker .pDeleteBuffer(0.2f)
311*35238bceSAndroid Build Coastguard Worker .pWastefulTextureMemoryUsage(0.5f)
312*35238bceSAndroid Build Coastguard Worker .pWastefulBufferMemoryUsage(0.5f)
313*35238bceSAndroid Build Coastguard Worker .pRandomBufferUploadTarget(1.0f)
314*35238bceSAndroid Build Coastguard Worker .pRandomBufferUsage(1.0f),
315*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW, GL_STATIC_DRAW));
316*35238bceSAndroid Build Coastguard Worker
317*35238bceSAndroid Build Coastguard Worker {
318*35238bceSAndroid Build Coastguard Worker std::vector<gls::ProgramContext> contexts;
319*35238bceSAndroid Build Coastguard Worker contexts.push_back(progLib.generateFragmentPointLightContext(512, 512));
320*35238bceSAndroid Build Coastguard Worker contexts.push_back(progLib.generateVertexUniformLoopLightContext(512, 512));
321*35238bceSAndroid Build Coastguard Worker mixedGroup->addChild(new gls::LongStressCase(
322*35238bceSAndroid Build Coastguard Worker m_context.getTestContext(), m_context.getRenderContext(),
323*35238bceSAndroid Build Coastguard Worker (string() + "random" + memoryLimitCases[memoryLimitNdx].nameSuffix).c_str(),
324*35238bceSAndroid Build Coastguard Worker (string() + "Highly random behavior" + memoryLimitCases[memoryLimitNdx].descSuffix).c_str(),
325*35238bceSAndroid Build Coastguard Worker memoryLimitCases[memoryLimitNdx].texLimit, memoryLimitCases[memoryLimitNdx].bufLimit,
326*35238bceSAndroid Build Coastguard Worker 1 /* draw calls per iteration */, 10000 /* tris per call */, contexts,
327*35238bceSAndroid Build Coastguard Worker Probs()
328*35238bceSAndroid Build Coastguard Worker .pRebuildProgram(0.3f)
329*35238bceSAndroid Build Coastguard Worker .pReuploadTexture(0.3f)
330*35238bceSAndroid Build Coastguard Worker .pReuploadWithTexImage(0.3f)
331*35238bceSAndroid Build Coastguard Worker .pReuploadBuffer(0.3f)
332*35238bceSAndroid Build Coastguard Worker .pReuploadWithBufferData(0.3f)
333*35238bceSAndroid Build Coastguard Worker .pDeleteTexture(0.2f)
334*35238bceSAndroid Build Coastguard Worker .pDeleteBuffer(0.2f)
335*35238bceSAndroid Build Coastguard Worker .pWastefulTextureMemoryUsage(0.3f)
336*35238bceSAndroid Build Coastguard Worker .pWastefulBufferMemoryUsage(0.3f)
337*35238bceSAndroid Build Coastguard Worker .pClientMemoryAttributeData(0.2f)
338*35238bceSAndroid Build Coastguard Worker .pClientMemoryIndexData(0.2f)
339*35238bceSAndroid Build Coastguard Worker .pSeparateAttribBuffers(0.4f)
340*35238bceSAndroid Build Coastguard Worker .pUseDrawArrays(0.4f)
341*35238bceSAndroid Build Coastguard Worker .pRandomBufferUploadTarget(1.0f)
342*35238bceSAndroid Build Coastguard Worker .pRandomBufferUsage(1.0f),
343*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW, GL_STATIC_DRAW));
344*35238bceSAndroid Build Coastguard Worker }
345*35238bceSAndroid Build Coastguard Worker }
346*35238bceSAndroid Build Coastguard Worker }
347*35238bceSAndroid Build Coastguard Worker }
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker } // namespace Stress
350*35238bceSAndroid Build Coastguard Worker } // namespace gles2
351*35238bceSAndroid Build Coastguard Worker } // namespace deqp
352