xref: /aosp_15_r20/external/deqp/modules/glshared/glsMemoryStressCase.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 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 Memory object stress test
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "glsMemoryStressCase.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuCommandLine.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "deClock.h"
30*35238bceSAndroid Build Coastguard Worker #include "deString.h"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker #include "glw.h"
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker #include <vector>
35*35238bceSAndroid Build Coastguard Worker #include <iostream>
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker using std::vector;
38*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker namespace deqp
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker namespace gls
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker 
glErrorToString(uint32_t error)45*35238bceSAndroid Build Coastguard Worker static const char *glErrorToString(uint32_t error)
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker     switch (error)
48*35238bceSAndroid Build Coastguard Worker     {
49*35238bceSAndroid Build Coastguard Worker     case GL_OUT_OF_MEMORY:
50*35238bceSAndroid Build Coastguard Worker         return "GL_OUT_OF_MEMORY";
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker     case GL_INVALID_ENUM:
53*35238bceSAndroid Build Coastguard Worker         return "GL_INVALID_ENUM";
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker     case GL_INVALID_FRAMEBUFFER_OPERATION:
56*35238bceSAndroid Build Coastguard Worker         return "GL_INVALID_FRAMEBUFFER_OPERATION";
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker     case GL_INVALID_OPERATION:
59*35238bceSAndroid Build Coastguard Worker         return "GL_INVALID_OPERATION";
60*35238bceSAndroid Build Coastguard Worker 
61*35238bceSAndroid Build Coastguard Worker     case GL_INVALID_VALUE:
62*35238bceSAndroid Build Coastguard Worker         return "GL_INVALID_VALUE";
63*35238bceSAndroid Build Coastguard Worker 
64*35238bceSAndroid Build Coastguard Worker     case 0:
65*35238bceSAndroid Build Coastguard Worker         return "<none>";
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker     default:
68*35238bceSAndroid Build Coastguard Worker         // \todo [mika] Handle uknown errors?
69*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
70*35238bceSAndroid Build Coastguard Worker         return NULL;
71*35238bceSAndroid Build Coastguard Worker     }
72*35238bceSAndroid Build Coastguard Worker }
73*35238bceSAndroid Build Coastguard Worker 
74*35238bceSAndroid Build Coastguard Worker static const float s_quadCoords[] = {-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f};
75*35238bceSAndroid Build Coastguard Worker 
76*35238bceSAndroid Build Coastguard Worker static const GLubyte s_quadIndices[] = {0, 1, 2, 2, 3, 0};
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker class TextureRenderer
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker public:
81*35238bceSAndroid Build Coastguard Worker     TextureRenderer(tcu::TestLog &log, glu::RenderContext &renderContext);
82*35238bceSAndroid Build Coastguard Worker     ~TextureRenderer(void);
83*35238bceSAndroid Build Coastguard Worker     void render(uint32_t texture);
84*35238bceSAndroid Build Coastguard Worker 
85*35238bceSAndroid Build Coastguard Worker private:
86*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_program;
87*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &m_renderCtx;
88*35238bceSAndroid Build Coastguard Worker 
89*35238bceSAndroid Build Coastguard Worker     uint32_t m_coordBuffer;
90*35238bceSAndroid Build Coastguard Worker     uint32_t m_indexBuffer;
91*35238bceSAndroid Build Coastguard Worker     uint32_t m_vao;
92*35238bceSAndroid Build Coastguard Worker 
93*35238bceSAndroid Build Coastguard Worker     static const char *s_vertexShaderGLES2;
94*35238bceSAndroid Build Coastguard Worker     static const char *s_fragmentShaderGLES2;
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker     static const char *s_vertexShaderGLES3;
97*35238bceSAndroid Build Coastguard Worker     static const char *s_fragmentShaderGLES3;
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker     static const char *s_vertexShaderGL3;
100*35238bceSAndroid Build Coastguard Worker     static const char *s_fragmentShaderGL3;
101*35238bceSAndroid Build Coastguard Worker };
102*35238bceSAndroid Build Coastguard Worker 
103*35238bceSAndroid Build Coastguard Worker const char *TextureRenderer::s_vertexShaderGLES2 = "attribute mediump vec2 a_coord;\n"
104*35238bceSAndroid Build Coastguard Worker                                                    "varying mediump vec2 v_texCoord;\n"
105*35238bceSAndroid Build Coastguard Worker                                                    "void main (void)\n"
106*35238bceSAndroid Build Coastguard Worker                                                    "{\n"
107*35238bceSAndroid Build Coastguard Worker                                                    "\tv_texCoord = 0.5 * (a_coord + vec2(1.0));\n"
108*35238bceSAndroid Build Coastguard Worker                                                    "\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
109*35238bceSAndroid Build Coastguard Worker                                                    "}\n";
110*35238bceSAndroid Build Coastguard Worker 
111*35238bceSAndroid Build Coastguard Worker const char *TextureRenderer::s_fragmentShaderGLES2 = "varying mediump vec2 v_texCoord;\n"
112*35238bceSAndroid Build Coastguard Worker                                                      "uniform sampler2D u_texture;\n"
113*35238bceSAndroid Build Coastguard Worker                                                      "void main (void)\n"
114*35238bceSAndroid Build Coastguard Worker                                                      "{\n"
115*35238bceSAndroid Build Coastguard Worker                                                      "\tgl_FragColor = texture2D(u_texture, v_texCoord);\n"
116*35238bceSAndroid Build Coastguard Worker                                                      "}\n";
117*35238bceSAndroid Build Coastguard Worker 
118*35238bceSAndroid Build Coastguard Worker const char *TextureRenderer::s_vertexShaderGLES3 = "#version 300 es\n"
119*35238bceSAndroid Build Coastguard Worker                                                    "in mediump vec2 a_coord;\n"
120*35238bceSAndroid Build Coastguard Worker                                                    "out mediump vec2 v_texCoord;\n"
121*35238bceSAndroid Build Coastguard Worker                                                    "void main (void)\n"
122*35238bceSAndroid Build Coastguard Worker                                                    "{\n"
123*35238bceSAndroid Build Coastguard Worker                                                    "\tv_texCoord = 0.5 * (a_coord + vec2(1.0));\n"
124*35238bceSAndroid Build Coastguard Worker                                                    "\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
125*35238bceSAndroid Build Coastguard Worker                                                    "}\n";
126*35238bceSAndroid Build Coastguard Worker 
127*35238bceSAndroid Build Coastguard Worker const char *TextureRenderer::s_fragmentShaderGLES3 = "#version 300 es\n"
128*35238bceSAndroid Build Coastguard Worker                                                      "in mediump vec2 v_texCoord;\n"
129*35238bceSAndroid Build Coastguard Worker                                                      "uniform sampler2D u_texture;\n"
130*35238bceSAndroid Build Coastguard Worker                                                      "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
131*35238bceSAndroid Build Coastguard Worker                                                      "void main (void)\n"
132*35238bceSAndroid Build Coastguard Worker                                                      "{\n"
133*35238bceSAndroid Build Coastguard Worker                                                      "\tdEQP_FragColor = texture(u_texture, v_texCoord);\n"
134*35238bceSAndroid Build Coastguard Worker                                                      "}\n";
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker const char *TextureRenderer::s_vertexShaderGL3 = "#version 330\n"
137*35238bceSAndroid Build Coastguard Worker                                                  "in mediump vec2 a_coord;\n"
138*35238bceSAndroid Build Coastguard Worker                                                  "out mediump vec2 v_texCoord;\n"
139*35238bceSAndroid Build Coastguard Worker                                                  "void main (void)\n"
140*35238bceSAndroid Build Coastguard Worker                                                  "{\n"
141*35238bceSAndroid Build Coastguard Worker                                                  "\tv_texCoord = 0.5 * (a_coord + vec2(1.0));\n"
142*35238bceSAndroid Build Coastguard Worker                                                  "\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
143*35238bceSAndroid Build Coastguard Worker                                                  "}\n";
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker const char *TextureRenderer::s_fragmentShaderGL3 = "#version 330\n"
146*35238bceSAndroid Build Coastguard Worker                                                    "in mediump vec2 v_texCoord;\n"
147*35238bceSAndroid Build Coastguard Worker                                                    "uniform sampler2D u_texture;\n"
148*35238bceSAndroid Build Coastguard Worker                                                    "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
149*35238bceSAndroid Build Coastguard Worker                                                    "void main (void)\n"
150*35238bceSAndroid Build Coastguard Worker                                                    "{\n"
151*35238bceSAndroid Build Coastguard Worker                                                    "\tdEQP_FragColor = texture(u_texture, v_texCoord);\n"
152*35238bceSAndroid Build Coastguard Worker                                                    "}\n";
153*35238bceSAndroid Build Coastguard Worker 
TextureRenderer(tcu::TestLog & log,glu::RenderContext & renderContext)154*35238bceSAndroid Build Coastguard Worker TextureRenderer::TextureRenderer(tcu::TestLog &log, glu::RenderContext &renderContext)
155*35238bceSAndroid Build Coastguard Worker     : m_program(NULL)
156*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderContext)
157*35238bceSAndroid Build Coastguard Worker     , m_coordBuffer(0)
158*35238bceSAndroid Build Coastguard Worker     , m_indexBuffer(0)
159*35238bceSAndroid Build Coastguard Worker     , m_vao(0)
160*35238bceSAndroid Build Coastguard Worker {
161*35238bceSAndroid Build Coastguard Worker     const glu::ContextType ctxType = renderContext.getType();
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker     if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_300_ES))
164*35238bceSAndroid Build Coastguard Worker         m_program =
165*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGLES3, s_fragmentShaderGLES3));
166*35238bceSAndroid Build Coastguard Worker     else if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_100_ES))
167*35238bceSAndroid Build Coastguard Worker         m_program =
168*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGLES2, s_fragmentShaderGLES2));
169*35238bceSAndroid Build Coastguard Worker     else if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_330))
170*35238bceSAndroid Build Coastguard Worker         m_program =
171*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGL3, s_fragmentShaderGL3));
172*35238bceSAndroid Build Coastguard Worker     else
173*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker     if (ctxType.getProfile() == glu::PROFILE_CORE)
176*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glGenVertexArrays(1, &m_vao));
177*35238bceSAndroid Build Coastguard Worker 
178*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glGenBuffers(1, &m_coordBuffer));
179*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_coordBuffer));
180*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(s_quadCoords), s_quadCoords, GL_STATIC_DRAW));
181*35238bceSAndroid Build Coastguard Worker 
182*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glGenBuffers(1, &m_indexBuffer));
183*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer));
184*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(s_quadIndices), s_quadIndices, GL_STATIC_DRAW));
185*35238bceSAndroid Build Coastguard Worker 
186*35238bceSAndroid Build Coastguard Worker     if (!m_program->isOk())
187*35238bceSAndroid Build Coastguard Worker     {
188*35238bceSAndroid Build Coastguard Worker         log << *m_program;
189*35238bceSAndroid Build Coastguard Worker         TCU_CHECK_MSG(m_program->isOk(), "Shader compilation failed");
190*35238bceSAndroid Build Coastguard Worker     }
191*35238bceSAndroid Build Coastguard Worker }
192*35238bceSAndroid Build Coastguard Worker 
~TextureRenderer(void)193*35238bceSAndroid Build Coastguard Worker TextureRenderer::~TextureRenderer(void)
194*35238bceSAndroid Build Coastguard Worker {
195*35238bceSAndroid Build Coastguard Worker     delete m_program;
196*35238bceSAndroid Build Coastguard Worker     glDeleteBuffers(1, &m_coordBuffer);
197*35238bceSAndroid Build Coastguard Worker     glDeleteBuffers(1, &m_indexBuffer);
198*35238bceSAndroid Build Coastguard Worker }
199*35238bceSAndroid Build Coastguard Worker 
render(uint32_t texture)200*35238bceSAndroid Build Coastguard Worker void TextureRenderer::render(uint32_t texture)
201*35238bceSAndroid Build Coastguard Worker {
202*35238bceSAndroid Build Coastguard Worker     uint32_t coordLoc = -1;
203*35238bceSAndroid Build Coastguard Worker     uint32_t texLoc   = -1;
204*35238bceSAndroid Build Coastguard Worker 
205*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_program->getProgram()));
206*35238bceSAndroid Build Coastguard Worker 
207*35238bceSAndroid Build Coastguard Worker     coordLoc = glGetAttribLocation(m_program->getProgram(), "a_coord");
208*35238bceSAndroid Build Coastguard Worker     GLU_CHECK();
209*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(coordLoc != (uint32_t)-1);
210*35238bceSAndroid Build Coastguard Worker 
211*35238bceSAndroid Build Coastguard Worker     if (m_vao != 0)
212*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glBindVertexArray(m_vao));
213*35238bceSAndroid Build Coastguard Worker 
214*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glEnableVertexAttribArray(coordLoc));
215*35238bceSAndroid Build Coastguard Worker 
216*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_coordBuffer));
217*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glVertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL));
218*35238bceSAndroid Build Coastguard Worker 
219*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glActiveTexture(GL_TEXTURE0));
220*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindTexture(GL_TEXTURE_2D, texture));
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker     texLoc = glGetUniformLocation(m_program->getProgram(), "u_texture");
223*35238bceSAndroid Build Coastguard Worker     GLU_CHECK();
224*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(texLoc != (uint32_t)-1);
225*35238bceSAndroid Build Coastguard Worker 
226*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUniform1i(texLoc, 0));
227*35238bceSAndroid Build Coastguard Worker 
228*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer));
229*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL));
230*35238bceSAndroid Build Coastguard Worker 
231*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glDisableVertexAttribArray(coordLoc));
232*35238bceSAndroid Build Coastguard Worker 
233*35238bceSAndroid Build Coastguard Worker     if (m_vao != 0)
234*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glBindVertexArray(0));
235*35238bceSAndroid Build Coastguard Worker }
236*35238bceSAndroid Build Coastguard Worker 
237*35238bceSAndroid Build Coastguard Worker class BufferRenderer
238*35238bceSAndroid Build Coastguard Worker {
239*35238bceSAndroid Build Coastguard Worker public:
240*35238bceSAndroid Build Coastguard Worker     BufferRenderer(tcu::TestLog &log, glu::RenderContext &renderContext);
241*35238bceSAndroid Build Coastguard Worker     ~BufferRenderer(void);
242*35238bceSAndroid Build Coastguard Worker     void render(uint32_t buffer, int size);
243*35238bceSAndroid Build Coastguard Worker 
244*35238bceSAndroid Build Coastguard Worker private:
245*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_program;
246*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &m_renderCtx;
247*35238bceSAndroid Build Coastguard Worker 
248*35238bceSAndroid Build Coastguard Worker     uint32_t m_coordBuffer;
249*35238bceSAndroid Build Coastguard Worker     uint32_t m_indexBuffer;
250*35238bceSAndroid Build Coastguard Worker     uint32_t m_vao;
251*35238bceSAndroid Build Coastguard Worker 
252*35238bceSAndroid Build Coastguard Worker     static const char *s_vertexShaderGLES2;
253*35238bceSAndroid Build Coastguard Worker     static const char *s_fragmentShaderGLES2;
254*35238bceSAndroid Build Coastguard Worker 
255*35238bceSAndroid Build Coastguard Worker     static const char *s_vertexShaderGLES3;
256*35238bceSAndroid Build Coastguard Worker     static const char *s_fragmentShaderGLES3;
257*35238bceSAndroid Build Coastguard Worker 
258*35238bceSAndroid Build Coastguard Worker     static const char *s_vertexShaderGL3;
259*35238bceSAndroid Build Coastguard Worker     static const char *s_fragmentShaderGL3;
260*35238bceSAndroid Build Coastguard Worker };
261*35238bceSAndroid Build Coastguard Worker 
262*35238bceSAndroid Build Coastguard Worker const char *BufferRenderer::s_vertexShaderGLES2 = "attribute mediump vec2 a_coord;\n"
263*35238bceSAndroid Build Coastguard Worker                                                   "attribute mediump vec4 a_buffer;\n"
264*35238bceSAndroid Build Coastguard Worker                                                   "varying mediump vec4 v_buffer;\n"
265*35238bceSAndroid Build Coastguard Worker                                                   "void main (void)\n"
266*35238bceSAndroid Build Coastguard Worker                                                   "{\n"
267*35238bceSAndroid Build Coastguard Worker                                                   "\tv_buffer = a_buffer;\n"
268*35238bceSAndroid Build Coastguard Worker                                                   "\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
269*35238bceSAndroid Build Coastguard Worker                                                   "}\n";
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker const char *BufferRenderer::s_fragmentShaderGLES2 = "varying mediump vec4 v_buffer;\n"
272*35238bceSAndroid Build Coastguard Worker                                                     "void main (void)\n"
273*35238bceSAndroid Build Coastguard Worker                                                     "{\n"
274*35238bceSAndroid Build Coastguard Worker                                                     "\tgl_FragColor = v_buffer;\n"
275*35238bceSAndroid Build Coastguard Worker                                                     "}\n";
276*35238bceSAndroid Build Coastguard Worker 
277*35238bceSAndroid Build Coastguard Worker const char *BufferRenderer::s_vertexShaderGLES3 = "#version 300 es\n"
278*35238bceSAndroid Build Coastguard Worker                                                   "in mediump vec2 a_coord;\n"
279*35238bceSAndroid Build Coastguard Worker                                                   "in mediump vec4 a_buffer;\n"
280*35238bceSAndroid Build Coastguard Worker                                                   "out mediump vec4 v_buffer;\n"
281*35238bceSAndroid Build Coastguard Worker                                                   "void main (void)\n"
282*35238bceSAndroid Build Coastguard Worker                                                   "{\n"
283*35238bceSAndroid Build Coastguard Worker                                                   "\tv_buffer = a_buffer;\n"
284*35238bceSAndroid Build Coastguard Worker                                                   "\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
285*35238bceSAndroid Build Coastguard Worker                                                   "}\n";
286*35238bceSAndroid Build Coastguard Worker 
287*35238bceSAndroid Build Coastguard Worker const char *BufferRenderer::s_fragmentShaderGLES3 = "#version 300 es\n"
288*35238bceSAndroid Build Coastguard Worker                                                     "in mediump vec4 v_buffer;\n"
289*35238bceSAndroid Build Coastguard Worker                                                     "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
290*35238bceSAndroid Build Coastguard Worker                                                     "void main (void)\n"
291*35238bceSAndroid Build Coastguard Worker                                                     "{\n"
292*35238bceSAndroid Build Coastguard Worker                                                     "\tdEQP_FragColor = v_buffer;\n"
293*35238bceSAndroid Build Coastguard Worker                                                     "}\n";
294*35238bceSAndroid Build Coastguard Worker 
295*35238bceSAndroid Build Coastguard Worker const char *BufferRenderer::s_vertexShaderGL3 = "#version 330\n"
296*35238bceSAndroid Build Coastguard Worker                                                 "in mediump vec2 a_coord;\n"
297*35238bceSAndroid Build Coastguard Worker                                                 "in mediump vec4 a_buffer;\n"
298*35238bceSAndroid Build Coastguard Worker                                                 "out mediump vec4 v_buffer;\n"
299*35238bceSAndroid Build Coastguard Worker                                                 "void main (void)\n"
300*35238bceSAndroid Build Coastguard Worker                                                 "{\n"
301*35238bceSAndroid Build Coastguard Worker                                                 "\tv_buffer = a_buffer;\n"
302*35238bceSAndroid Build Coastguard Worker                                                 "\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
303*35238bceSAndroid Build Coastguard Worker                                                 "}\n";
304*35238bceSAndroid Build Coastguard Worker 
305*35238bceSAndroid Build Coastguard Worker const char *BufferRenderer::s_fragmentShaderGL3 = "#version 330\n"
306*35238bceSAndroid Build Coastguard Worker                                                   "in mediump vec4 v_buffer;\n"
307*35238bceSAndroid Build Coastguard Worker                                                   "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
308*35238bceSAndroid Build Coastguard Worker                                                   "void main (void)\n"
309*35238bceSAndroid Build Coastguard Worker                                                   "{\n"
310*35238bceSAndroid Build Coastguard Worker                                                   "\tdEQP_FragColor = v_buffer;\n"
311*35238bceSAndroid Build Coastguard Worker                                                   "}\n";
312*35238bceSAndroid Build Coastguard Worker 
BufferRenderer(tcu::TestLog & log,glu::RenderContext & renderContext)313*35238bceSAndroid Build Coastguard Worker BufferRenderer::BufferRenderer(tcu::TestLog &log, glu::RenderContext &renderContext)
314*35238bceSAndroid Build Coastguard Worker     : m_program(NULL)
315*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderContext)
316*35238bceSAndroid Build Coastguard Worker     , m_coordBuffer(0)
317*35238bceSAndroid Build Coastguard Worker     , m_indexBuffer(0)
318*35238bceSAndroid Build Coastguard Worker     , m_vao(0)
319*35238bceSAndroid Build Coastguard Worker {
320*35238bceSAndroid Build Coastguard Worker     const glu::ContextType ctxType = renderContext.getType();
321*35238bceSAndroid Build Coastguard Worker 
322*35238bceSAndroid Build Coastguard Worker     if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_300_ES))
323*35238bceSAndroid Build Coastguard Worker         m_program =
324*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGLES3, s_fragmentShaderGLES3));
325*35238bceSAndroid Build Coastguard Worker     else if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_100_ES))
326*35238bceSAndroid Build Coastguard Worker         m_program =
327*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGLES2, s_fragmentShaderGLES2));
328*35238bceSAndroid Build Coastguard Worker     else if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_330))
329*35238bceSAndroid Build Coastguard Worker         m_program =
330*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGL3, s_fragmentShaderGL3));
331*35238bceSAndroid Build Coastguard Worker     else
332*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
333*35238bceSAndroid Build Coastguard Worker 
334*35238bceSAndroid Build Coastguard Worker     if (ctxType.getProfile() == glu::PROFILE_CORE)
335*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glGenVertexArrays(1, &m_vao));
336*35238bceSAndroid Build Coastguard Worker 
337*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glGenBuffers(1, &m_coordBuffer));
338*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_coordBuffer));
339*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(s_quadCoords), s_quadCoords, GL_STATIC_DRAW));
340*35238bceSAndroid Build Coastguard Worker 
341*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glGenBuffers(1, &m_indexBuffer));
342*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer));
343*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(s_quadIndices), s_quadIndices, GL_STATIC_DRAW));
344*35238bceSAndroid Build Coastguard Worker 
345*35238bceSAndroid Build Coastguard Worker     if (!m_program->isOk())
346*35238bceSAndroid Build Coastguard Worker     {
347*35238bceSAndroid Build Coastguard Worker         log << *m_program;
348*35238bceSAndroid Build Coastguard Worker         TCU_CHECK_MSG(m_program->isOk(), "Shader compilation failed");
349*35238bceSAndroid Build Coastguard Worker     }
350*35238bceSAndroid Build Coastguard Worker }
351*35238bceSAndroid Build Coastguard Worker 
~BufferRenderer(void)352*35238bceSAndroid Build Coastguard Worker BufferRenderer::~BufferRenderer(void)
353*35238bceSAndroid Build Coastguard Worker {
354*35238bceSAndroid Build Coastguard Worker     delete m_program;
355*35238bceSAndroid Build Coastguard Worker     glDeleteBuffers(1, &m_coordBuffer);
356*35238bceSAndroid Build Coastguard Worker     glDeleteBuffers(1, &m_indexBuffer);
357*35238bceSAndroid Build Coastguard Worker }
358*35238bceSAndroid Build Coastguard Worker 
render(uint32_t buffer,int size)359*35238bceSAndroid Build Coastguard Worker void BufferRenderer::render(uint32_t buffer, int size)
360*35238bceSAndroid Build Coastguard Worker {
361*35238bceSAndroid Build Coastguard Worker     DE_UNREF(size);
362*35238bceSAndroid Build Coastguard Worker     DE_ASSERT((size_t)size >= sizeof(GLubyte) * 4 * 6);
363*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_program->getProgram()));
364*35238bceSAndroid Build Coastguard Worker 
365*35238bceSAndroid Build Coastguard Worker     uint32_t bufferLoc = glGetAttribLocation(m_program->getProgram(), "a_buffer");
366*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(bufferLoc != (uint32_t)-1);
367*35238bceSAndroid Build Coastguard Worker 
368*35238bceSAndroid Build Coastguard Worker     uint32_t coordLoc = glGetAttribLocation(m_program->getProgram(), "a_coord");
369*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(coordLoc != (uint32_t)-1);
370*35238bceSAndroid Build Coastguard Worker 
371*35238bceSAndroid Build Coastguard Worker     if (m_vao != 0)
372*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glBindVertexArray(m_vao));
373*35238bceSAndroid Build Coastguard Worker 
374*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glEnableVertexAttribArray(bufferLoc));
375*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glEnableVertexAttribArray(coordLoc));
376*35238bceSAndroid Build Coastguard Worker 
377*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_coordBuffer));
378*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glVertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL));
379*35238bceSAndroid Build Coastguard Worker 
380*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, buffer));
381*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glVertexAttribPointer(bufferLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0));
382*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0));
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer));
385*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL));
386*35238bceSAndroid Build Coastguard Worker 
387*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glDisableVertexAttribArray(bufferLoc));
388*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glDisableVertexAttribArray(coordLoc));
389*35238bceSAndroid Build Coastguard Worker 
390*35238bceSAndroid Build Coastguard Worker     if (m_vao != 0)
391*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glBindVertexArray(0));
392*35238bceSAndroid Build Coastguard Worker }
393*35238bceSAndroid Build Coastguard Worker 
394*35238bceSAndroid Build Coastguard Worker class MemObjectAllocator
395*35238bceSAndroid Build Coastguard Worker {
396*35238bceSAndroid Build Coastguard Worker public:
397*35238bceSAndroid Build Coastguard Worker     enum Result
398*35238bceSAndroid Build Coastguard Worker     {
399*35238bceSAndroid Build Coastguard Worker         RESULT_GOT_BAD_ALLOC = 0,
400*35238bceSAndroid Build Coastguard Worker         RESULT_GEN_TEXTURES_FAILED,
401*35238bceSAndroid Build Coastguard Worker         RESULT_GEN_BUFFERS_FAILED,
402*35238bceSAndroid Build Coastguard Worker         RESULT_BUFFER_DATA_FAILED,
403*35238bceSAndroid Build Coastguard Worker         RESULT_BUFFER_SUB_DATA_FAILED,
404*35238bceSAndroid Build Coastguard Worker         RESULT_TEXTURE_IMAGE_FAILED,
405*35238bceSAndroid Build Coastguard Worker         RESULT_TEXTURE_SUB_IMAGE_FAILED,
406*35238bceSAndroid Build Coastguard Worker         RESULT_BIND_TEXTURE_FAILED,
407*35238bceSAndroid Build Coastguard Worker         RESULT_BIND_BUFFER_FAILED,
408*35238bceSAndroid Build Coastguard Worker         RESULT_DELETE_TEXTURES_FAILED,
409*35238bceSAndroid Build Coastguard Worker         RESULT_DELETE_BUFFERS_FAILED,
410*35238bceSAndroid Build Coastguard Worker         RESULT_RENDER_FAILED,
411*35238bceSAndroid Build Coastguard Worker 
412*35238bceSAndroid Build Coastguard Worker         RESULT_LAST
413*35238bceSAndroid Build Coastguard Worker     };
414*35238bceSAndroid Build Coastguard Worker 
415*35238bceSAndroid Build Coastguard Worker     MemObjectAllocator(tcu::TestLog &log, glu::RenderContext &renderContext, MemObjectType objectTypes,
416*35238bceSAndroid Build Coastguard Worker                        const MemObjectConfig &config, int seed);
417*35238bceSAndroid Build Coastguard Worker     ~MemObjectAllocator(void);
418*35238bceSAndroid Build Coastguard Worker     bool allocUntilFailure(void);
419*35238bceSAndroid Build Coastguard Worker     void clearObjects(void);
getResult(void) const420*35238bceSAndroid Build Coastguard Worker     Result getResult(void) const
421*35238bceSAndroid Build Coastguard Worker     {
422*35238bceSAndroid Build Coastguard Worker         return m_result;
423*35238bceSAndroid Build Coastguard Worker     }
getGLError(void) const424*35238bceSAndroid Build Coastguard Worker     uint32_t getGLError(void) const
425*35238bceSAndroid Build Coastguard Worker     {
426*35238bceSAndroid Build Coastguard Worker         return m_glError;
427*35238bceSAndroid Build Coastguard Worker     }
getObjectCount(void) const428*35238bceSAndroid Build Coastguard Worker     int getObjectCount(void) const
429*35238bceSAndroid Build Coastguard Worker     {
430*35238bceSAndroid Build Coastguard Worker         return m_objectCount;
431*35238bceSAndroid Build Coastguard Worker     }
getBytes(void) const432*35238bceSAndroid Build Coastguard Worker     uint32_t getBytes(void) const
433*35238bceSAndroid Build Coastguard Worker     {
434*35238bceSAndroid Build Coastguard Worker         return m_bytesRequired;
435*35238bceSAndroid Build Coastguard Worker     }
436*35238bceSAndroid Build Coastguard Worker 
437*35238bceSAndroid Build Coastguard Worker     static const char *resultToString(Result result);
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker private:
440*35238bceSAndroid Build Coastguard Worker     void allocateTexture(de::Random &rnd);
441*35238bceSAndroid Build Coastguard Worker     void allocateBuffer(de::Random &rnd);
442*35238bceSAndroid Build Coastguard Worker 
443*35238bceSAndroid Build Coastguard Worker     vector<uint32_t> m_buffers;
444*35238bceSAndroid Build Coastguard Worker     vector<uint32_t> m_textures;
445*35238bceSAndroid Build Coastguard Worker     int m_seed;
446*35238bceSAndroid Build Coastguard Worker     int m_objectCount;
447*35238bceSAndroid Build Coastguard Worker     uint32_t m_bytesRequired;
448*35238bceSAndroid Build Coastguard Worker     MemObjectType m_objectTypes;
449*35238bceSAndroid Build Coastguard Worker     Result m_result;
450*35238bceSAndroid Build Coastguard Worker     MemObjectConfig m_config;
451*35238bceSAndroid Build Coastguard Worker     uint32_t m_glError;
452*35238bceSAndroid Build Coastguard Worker     vector<uint8_t> m_unusedData;
453*35238bceSAndroid Build Coastguard Worker     BufferRenderer m_bufferRenderer;
454*35238bceSAndroid Build Coastguard Worker     TextureRenderer m_textureRenderer;
455*35238bceSAndroid Build Coastguard Worker };
456*35238bceSAndroid Build Coastguard Worker 
MemObjectAllocator(tcu::TestLog & log,glu::RenderContext & renderContext,MemObjectType objectTypes,const MemObjectConfig & config,int seed)457*35238bceSAndroid Build Coastguard Worker MemObjectAllocator::MemObjectAllocator(tcu::TestLog &log, glu::RenderContext &renderContext, MemObjectType objectTypes,
458*35238bceSAndroid Build Coastguard Worker                                        const MemObjectConfig &config, int seed)
459*35238bceSAndroid Build Coastguard Worker     : m_seed(seed)
460*35238bceSAndroid Build Coastguard Worker     , m_objectCount(0)
461*35238bceSAndroid Build Coastguard Worker     , m_bytesRequired(0)
462*35238bceSAndroid Build Coastguard Worker     , m_objectTypes(objectTypes)
463*35238bceSAndroid Build Coastguard Worker     , m_result(RESULT_LAST)
464*35238bceSAndroid Build Coastguard Worker     , m_config(config)
465*35238bceSAndroid Build Coastguard Worker     , m_glError(0)
466*35238bceSAndroid Build Coastguard Worker     , m_bufferRenderer(log, renderContext)
467*35238bceSAndroid Build Coastguard Worker     , m_textureRenderer(log, renderContext)
468*35238bceSAndroid Build Coastguard Worker {
469*35238bceSAndroid Build Coastguard Worker     DE_UNREF(renderContext);
470*35238bceSAndroid Build Coastguard Worker 
471*35238bceSAndroid Build Coastguard Worker     if (m_config.useUnusedData)
472*35238bceSAndroid Build Coastguard Worker     {
473*35238bceSAndroid Build Coastguard Worker         int unusedSize = deMax32(m_config.maxBufferSize, m_config.maxTextureSize * m_config.maxTextureSize * 4);
474*35238bceSAndroid Build Coastguard Worker         m_unusedData   = vector<uint8_t>(unusedSize);
475*35238bceSAndroid Build Coastguard Worker     }
476*35238bceSAndroid Build Coastguard Worker     else if (m_config.write)
477*35238bceSAndroid Build Coastguard Worker         m_unusedData = vector<uint8_t>(128);
478*35238bceSAndroid Build Coastguard Worker }
479*35238bceSAndroid Build Coastguard Worker 
~MemObjectAllocator(void)480*35238bceSAndroid Build Coastguard Worker MemObjectAllocator::~MemObjectAllocator(void)
481*35238bceSAndroid Build Coastguard Worker {
482*35238bceSAndroid Build Coastguard Worker }
483*35238bceSAndroid Build Coastguard Worker 
allocUntilFailure(void)484*35238bceSAndroid Build Coastguard Worker bool MemObjectAllocator::allocUntilFailure(void)
485*35238bceSAndroid Build Coastguard Worker {
486*35238bceSAndroid Build Coastguard Worker     de::Random rnd(m_seed);
487*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_MSG("Error in init");
488*35238bceSAndroid Build Coastguard Worker     try
489*35238bceSAndroid Build Coastguard Worker     {
490*35238bceSAndroid Build Coastguard Worker         const uint64_t timeoutUs = 10000000; // 10s
491*35238bceSAndroid Build Coastguard Worker         uint64_t beginTimeUs     = deGetMicroseconds();
492*35238bceSAndroid Build Coastguard Worker         uint64_t currentTimeUs;
493*35238bceSAndroid Build Coastguard Worker 
494*35238bceSAndroid Build Coastguard Worker         do
495*35238bceSAndroid Build Coastguard Worker         {
496*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_MSG("Unkown Error");
497*35238bceSAndroid Build Coastguard Worker             switch (m_objectTypes)
498*35238bceSAndroid Build Coastguard Worker             {
499*35238bceSAndroid Build Coastguard Worker             case MEMOBJECTTYPE_TEXTURE:
500*35238bceSAndroid Build Coastguard Worker                 allocateTexture(rnd);
501*35238bceSAndroid Build Coastguard Worker                 break;
502*35238bceSAndroid Build Coastguard Worker 
503*35238bceSAndroid Build Coastguard Worker             case MEMOBJECTTYPE_BUFFER:
504*35238bceSAndroid Build Coastguard Worker                 allocateBuffer(rnd);
505*35238bceSAndroid Build Coastguard Worker                 break;
506*35238bceSAndroid Build Coastguard Worker 
507*35238bceSAndroid Build Coastguard Worker             default:
508*35238bceSAndroid Build Coastguard Worker             {
509*35238bceSAndroid Build Coastguard Worker                 if (rnd.getBool())
510*35238bceSAndroid Build Coastguard Worker                     allocateBuffer(rnd);
511*35238bceSAndroid Build Coastguard Worker                 else
512*35238bceSAndroid Build Coastguard Worker                     allocateTexture(rnd);
513*35238bceSAndroid Build Coastguard Worker                 break;
514*35238bceSAndroid Build Coastguard Worker             }
515*35238bceSAndroid Build Coastguard Worker             }
516*35238bceSAndroid Build Coastguard Worker 
517*35238bceSAndroid Build Coastguard Worker             if (m_result != RESULT_LAST)
518*35238bceSAndroid Build Coastguard Worker             {
519*35238bceSAndroid Build Coastguard Worker                 glFinish();
520*35238bceSAndroid Build Coastguard Worker                 return true;
521*35238bceSAndroid Build Coastguard Worker             }
522*35238bceSAndroid Build Coastguard Worker 
523*35238bceSAndroid Build Coastguard Worker             currentTimeUs = deGetMicroseconds();
524*35238bceSAndroid Build Coastguard Worker         } while (currentTimeUs - beginTimeUs < timeoutUs);
525*35238bceSAndroid Build Coastguard Worker 
526*35238bceSAndroid Build Coastguard Worker         // Timeout
527*35238bceSAndroid Build Coastguard Worker         if (currentTimeUs - beginTimeUs >= timeoutUs)
528*35238bceSAndroid Build Coastguard Worker             return false;
529*35238bceSAndroid Build Coastguard Worker         else
530*35238bceSAndroid Build Coastguard Worker             return true;
531*35238bceSAndroid Build Coastguard Worker     }
532*35238bceSAndroid Build Coastguard Worker     catch (const std::bad_alloc &)
533*35238bceSAndroid Build Coastguard Worker     {
534*35238bceSAndroid Build Coastguard Worker         m_result = RESULT_GOT_BAD_ALLOC;
535*35238bceSAndroid Build Coastguard Worker         return true;
536*35238bceSAndroid Build Coastguard Worker     }
537*35238bceSAndroid Build Coastguard Worker }
538*35238bceSAndroid Build Coastguard Worker 
clearObjects(void)539*35238bceSAndroid Build Coastguard Worker void MemObjectAllocator::clearObjects(void)
540*35238bceSAndroid Build Coastguard Worker {
541*35238bceSAndroid Build Coastguard Worker     uint32_t error = 0;
542*35238bceSAndroid Build Coastguard Worker 
543*35238bceSAndroid Build Coastguard Worker     if (!m_textures.empty())
544*35238bceSAndroid Build Coastguard Worker     {
545*35238bceSAndroid Build Coastguard Worker         glDeleteTextures((GLsizei)m_textures.size(), &(m_textures[0]));
546*35238bceSAndroid Build Coastguard Worker         error = glGetError();
547*35238bceSAndroid Build Coastguard Worker         if (error != 0)
548*35238bceSAndroid Build Coastguard Worker         {
549*35238bceSAndroid Build Coastguard Worker             m_result  = RESULT_DELETE_TEXTURES_FAILED;
550*35238bceSAndroid Build Coastguard Worker             m_glError = error;
551*35238bceSAndroid Build Coastguard Worker         }
552*35238bceSAndroid Build Coastguard Worker 
553*35238bceSAndroid Build Coastguard Worker         m_textures.clear();
554*35238bceSAndroid Build Coastguard Worker     }
555*35238bceSAndroid Build Coastguard Worker 
556*35238bceSAndroid Build Coastguard Worker     if (!m_buffers.empty())
557*35238bceSAndroid Build Coastguard Worker     {
558*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers((GLsizei)m_buffers.size(), &(m_buffers[0]));
559*35238bceSAndroid Build Coastguard Worker         error = glGetError();
560*35238bceSAndroid Build Coastguard Worker         if (error != 0)
561*35238bceSAndroid Build Coastguard Worker         {
562*35238bceSAndroid Build Coastguard Worker             m_result  = RESULT_DELETE_BUFFERS_FAILED;
563*35238bceSAndroid Build Coastguard Worker             m_glError = error;
564*35238bceSAndroid Build Coastguard Worker         }
565*35238bceSAndroid Build Coastguard Worker 
566*35238bceSAndroid Build Coastguard Worker         m_buffers.clear();
567*35238bceSAndroid Build Coastguard Worker     }
568*35238bceSAndroid Build Coastguard Worker }
569*35238bceSAndroid Build Coastguard Worker 
allocateTexture(de::Random & rnd)570*35238bceSAndroid Build Coastguard Worker void MemObjectAllocator::allocateTexture(de::Random &rnd)
571*35238bceSAndroid Build Coastguard Worker {
572*35238bceSAndroid Build Coastguard Worker     const int vectorBlockSize = 128;
573*35238bceSAndroid Build Coastguard Worker     uint32_t tex              = 0;
574*35238bceSAndroid Build Coastguard Worker     uint32_t error            = 0;
575*35238bceSAndroid Build Coastguard Worker     int width                 = rnd.getInt(m_config.minTextureSize, m_config.maxTextureSize);
576*35238bceSAndroid Build Coastguard Worker     int height                = rnd.getInt(m_config.minTextureSize, m_config.maxTextureSize);
577*35238bceSAndroid Build Coastguard Worker 
578*35238bceSAndroid Build Coastguard Worker     glGenTextures(1, &tex);
579*35238bceSAndroid Build Coastguard Worker     error = glGetError();
580*35238bceSAndroid Build Coastguard Worker     if (error != 0)
581*35238bceSAndroid Build Coastguard Worker     {
582*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_GEN_TEXTURES_FAILED;
583*35238bceSAndroid Build Coastguard Worker         m_glError = error;
584*35238bceSAndroid Build Coastguard Worker         return;
585*35238bceSAndroid Build Coastguard Worker     }
586*35238bceSAndroid Build Coastguard Worker 
587*35238bceSAndroid Build Coastguard Worker     if (m_textures.size() % vectorBlockSize == 0)
588*35238bceSAndroid Build Coastguard Worker         m_textures.reserve(m_textures.size() + vectorBlockSize);
589*35238bceSAndroid Build Coastguard Worker 
590*35238bceSAndroid Build Coastguard Worker     m_textures.push_back(tex);
591*35238bceSAndroid Build Coastguard Worker 
592*35238bceSAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
593*35238bceSAndroid Build Coastguard Worker     error = glGetError();
594*35238bceSAndroid Build Coastguard Worker     if (error != 0)
595*35238bceSAndroid Build Coastguard Worker     {
596*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_BIND_TEXTURE_FAILED;
597*35238bceSAndroid Build Coastguard Worker         m_glError = error;
598*35238bceSAndroid Build Coastguard Worker         return;
599*35238bceSAndroid Build Coastguard Worker     }
600*35238bceSAndroid Build Coastguard Worker 
601*35238bceSAndroid Build Coastguard Worker     if (m_config.useUnusedData)
602*35238bceSAndroid Build Coastguard Worker     {
603*35238bceSAndroid Build Coastguard Worker         DE_ASSERT((int)m_unusedData.size() >= width * height * 4);
604*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &(m_unusedData[0]));
605*35238bceSAndroid Build Coastguard Worker     }
606*35238bceSAndroid Build Coastguard Worker     else
607*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
608*35238bceSAndroid Build Coastguard Worker 
609*35238bceSAndroid Build Coastguard Worker     error = glGetError();
610*35238bceSAndroid Build Coastguard Worker     if (error != 0)
611*35238bceSAndroid Build Coastguard Worker     {
612*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_TEXTURE_IMAGE_FAILED;
613*35238bceSAndroid Build Coastguard Worker         m_glError = error;
614*35238bceSAndroid Build Coastguard Worker         return;
615*35238bceSAndroid Build Coastguard Worker     }
616*35238bceSAndroid Build Coastguard Worker 
617*35238bceSAndroid Build Coastguard Worker     if (m_config.write)
618*35238bceSAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &(m_unusedData[0]));
619*35238bceSAndroid Build Coastguard Worker 
620*35238bceSAndroid Build Coastguard Worker     error = glGetError();
621*35238bceSAndroid Build Coastguard Worker     if (error != 0)
622*35238bceSAndroid Build Coastguard Worker     {
623*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_TEXTURE_SUB_IMAGE_FAILED;
624*35238bceSAndroid Build Coastguard Worker         m_glError = error;
625*35238bceSAndroid Build Coastguard Worker         return;
626*35238bceSAndroid Build Coastguard Worker     }
627*35238bceSAndroid Build Coastguard Worker 
628*35238bceSAndroid Build Coastguard Worker     if (m_config.use)
629*35238bceSAndroid Build Coastguard Worker     {
630*35238bceSAndroid Build Coastguard Worker         try
631*35238bceSAndroid Build Coastguard Worker         {
632*35238bceSAndroid Build Coastguard Worker             m_textureRenderer.render(tex);
633*35238bceSAndroid Build Coastguard Worker         }
634*35238bceSAndroid Build Coastguard Worker         catch (const glu::Error &err)
635*35238bceSAndroid Build Coastguard Worker         {
636*35238bceSAndroid Build Coastguard Worker             m_result  = RESULT_RENDER_FAILED;
637*35238bceSAndroid Build Coastguard Worker             m_glError = err.getError();
638*35238bceSAndroid Build Coastguard Worker             return;
639*35238bceSAndroid Build Coastguard Worker         }
640*35238bceSAndroid Build Coastguard Worker         catch (const glu::OutOfMemoryError &)
641*35238bceSAndroid Build Coastguard Worker         {
642*35238bceSAndroid Build Coastguard Worker             m_result  = RESULT_RENDER_FAILED;
643*35238bceSAndroid Build Coastguard Worker             m_glError = GL_OUT_OF_MEMORY;
644*35238bceSAndroid Build Coastguard Worker             return;
645*35238bceSAndroid Build Coastguard Worker         }
646*35238bceSAndroid Build Coastguard Worker     }
647*35238bceSAndroid Build Coastguard Worker 
648*35238bceSAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, 0);
649*35238bceSAndroid Build Coastguard Worker     error = glGetError();
650*35238bceSAndroid Build Coastguard Worker     if (error != 0)
651*35238bceSAndroid Build Coastguard Worker     {
652*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_BIND_TEXTURE_FAILED;
653*35238bceSAndroid Build Coastguard Worker         m_glError = error;
654*35238bceSAndroid Build Coastguard Worker         return;
655*35238bceSAndroid Build Coastguard Worker     }
656*35238bceSAndroid Build Coastguard Worker 
657*35238bceSAndroid Build Coastguard Worker     m_objectCount++;
658*35238bceSAndroid Build Coastguard Worker     m_bytesRequired += width * height * 4;
659*35238bceSAndroid Build Coastguard Worker }
660*35238bceSAndroid Build Coastguard Worker 
allocateBuffer(de::Random & rnd)661*35238bceSAndroid Build Coastguard Worker void MemObjectAllocator::allocateBuffer(de::Random &rnd)
662*35238bceSAndroid Build Coastguard Worker {
663*35238bceSAndroid Build Coastguard Worker     const int vectorBlockSize = 128;
664*35238bceSAndroid Build Coastguard Worker     uint32_t buffer           = 0;
665*35238bceSAndroid Build Coastguard Worker     uint32_t error            = 0;
666*35238bceSAndroid Build Coastguard Worker     int size                  = rnd.getInt(m_config.minBufferSize, m_config.maxBufferSize);
667*35238bceSAndroid Build Coastguard Worker 
668*35238bceSAndroid Build Coastguard Worker     glGenBuffers(1, &buffer);
669*35238bceSAndroid Build Coastguard Worker     error = glGetError();
670*35238bceSAndroid Build Coastguard Worker     if (error != 0)
671*35238bceSAndroid Build Coastguard Worker     {
672*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_GEN_BUFFERS_FAILED;
673*35238bceSAndroid Build Coastguard Worker         m_glError = error;
674*35238bceSAndroid Build Coastguard Worker         return;
675*35238bceSAndroid Build Coastguard Worker     }
676*35238bceSAndroid Build Coastguard Worker 
677*35238bceSAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, buffer);
678*35238bceSAndroid Build Coastguard Worker     error = glGetError();
679*35238bceSAndroid Build Coastguard Worker     if (error != 0)
680*35238bceSAndroid Build Coastguard Worker     {
681*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_BIND_BUFFER_FAILED;
682*35238bceSAndroid Build Coastguard Worker         m_glError = error;
683*35238bceSAndroid Build Coastguard Worker         return;
684*35238bceSAndroid Build Coastguard Worker     }
685*35238bceSAndroid Build Coastguard Worker 
686*35238bceSAndroid Build Coastguard Worker     if (m_buffers.size() % vectorBlockSize == 0)
687*35238bceSAndroid Build Coastguard Worker         m_buffers.reserve(m_buffers.size() + vectorBlockSize);
688*35238bceSAndroid Build Coastguard Worker 
689*35238bceSAndroid Build Coastguard Worker     m_buffers.push_back(buffer);
690*35238bceSAndroid Build Coastguard Worker 
691*35238bceSAndroid Build Coastguard Worker     if (m_config.useUnusedData)
692*35238bceSAndroid Build Coastguard Worker     {
693*35238bceSAndroid Build Coastguard Worker         DE_ASSERT((int)m_unusedData.size() >= size);
694*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_ARRAY_BUFFER, size, &(m_unusedData[0]), GL_DYNAMIC_DRAW);
695*35238bceSAndroid Build Coastguard Worker     }
696*35238bceSAndroid Build Coastguard Worker     else
697*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW);
698*35238bceSAndroid Build Coastguard Worker 
699*35238bceSAndroid Build Coastguard Worker     error = glGetError();
700*35238bceSAndroid Build Coastguard Worker     if (error != 0)
701*35238bceSAndroid Build Coastguard Worker     {
702*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_BUFFER_DATA_FAILED;
703*35238bceSAndroid Build Coastguard Worker         m_glError = error;
704*35238bceSAndroid Build Coastguard Worker         return;
705*35238bceSAndroid Build Coastguard Worker     }
706*35238bceSAndroid Build Coastguard Worker 
707*35238bceSAndroid Build Coastguard Worker     if (m_config.write)
708*35238bceSAndroid Build Coastguard Worker         glBufferSubData(GL_ARRAY_BUFFER, 0, 1, &(m_unusedData[0]));
709*35238bceSAndroid Build Coastguard Worker 
710*35238bceSAndroid Build Coastguard Worker     error = glGetError();
711*35238bceSAndroid Build Coastguard Worker     if (error != 0)
712*35238bceSAndroid Build Coastguard Worker     {
713*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_BUFFER_SUB_DATA_FAILED;
714*35238bceSAndroid Build Coastguard Worker         m_glError = error;
715*35238bceSAndroid Build Coastguard Worker         return;
716*35238bceSAndroid Build Coastguard Worker     }
717*35238bceSAndroid Build Coastguard Worker 
718*35238bceSAndroid Build Coastguard Worker     if (m_config.use)
719*35238bceSAndroid Build Coastguard Worker     {
720*35238bceSAndroid Build Coastguard Worker         try
721*35238bceSAndroid Build Coastguard Worker         {
722*35238bceSAndroid Build Coastguard Worker             m_bufferRenderer.render(buffer, size);
723*35238bceSAndroid Build Coastguard Worker         }
724*35238bceSAndroid Build Coastguard Worker         catch (const glu::Error &err)
725*35238bceSAndroid Build Coastguard Worker         {
726*35238bceSAndroid Build Coastguard Worker             m_result  = RESULT_RENDER_FAILED;
727*35238bceSAndroid Build Coastguard Worker             m_glError = err.getError();
728*35238bceSAndroid Build Coastguard Worker             return;
729*35238bceSAndroid Build Coastguard Worker         }
730*35238bceSAndroid Build Coastguard Worker         catch (const glu::OutOfMemoryError &)
731*35238bceSAndroid Build Coastguard Worker         {
732*35238bceSAndroid Build Coastguard Worker             m_result  = RESULT_RENDER_FAILED;
733*35238bceSAndroid Build Coastguard Worker             m_glError = GL_OUT_OF_MEMORY;
734*35238bceSAndroid Build Coastguard Worker             return;
735*35238bceSAndroid Build Coastguard Worker         }
736*35238bceSAndroid Build Coastguard Worker     }
737*35238bceSAndroid Build Coastguard Worker 
738*35238bceSAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, 0);
739*35238bceSAndroid Build Coastguard Worker     error = glGetError();
740*35238bceSAndroid Build Coastguard Worker     if (error != 0)
741*35238bceSAndroid Build Coastguard Worker     {
742*35238bceSAndroid Build Coastguard Worker         m_result  = RESULT_BIND_BUFFER_FAILED;
743*35238bceSAndroid Build Coastguard Worker         m_glError = error;
744*35238bceSAndroid Build Coastguard Worker         return;
745*35238bceSAndroid Build Coastguard Worker     }
746*35238bceSAndroid Build Coastguard Worker 
747*35238bceSAndroid Build Coastguard Worker     m_objectCount++;
748*35238bceSAndroid Build Coastguard Worker     m_bytesRequired += size;
749*35238bceSAndroid Build Coastguard Worker }
750*35238bceSAndroid Build Coastguard Worker 
resultToString(Result result)751*35238bceSAndroid Build Coastguard Worker const char *MemObjectAllocator::resultToString(Result result)
752*35238bceSAndroid Build Coastguard Worker {
753*35238bceSAndroid Build Coastguard Worker     switch (result)
754*35238bceSAndroid Build Coastguard Worker     {
755*35238bceSAndroid Build Coastguard Worker     case RESULT_GOT_BAD_ALLOC:
756*35238bceSAndroid Build Coastguard Worker         return "Caught std::bad_alloc";
757*35238bceSAndroid Build Coastguard Worker 
758*35238bceSAndroid Build Coastguard Worker     case RESULT_GEN_TEXTURES_FAILED:
759*35238bceSAndroid Build Coastguard Worker         return "glGenTextures failed";
760*35238bceSAndroid Build Coastguard Worker 
761*35238bceSAndroid Build Coastguard Worker     case RESULT_GEN_BUFFERS_FAILED:
762*35238bceSAndroid Build Coastguard Worker         return "glGenBuffers failed";
763*35238bceSAndroid Build Coastguard Worker 
764*35238bceSAndroid Build Coastguard Worker     case RESULT_BUFFER_DATA_FAILED:
765*35238bceSAndroid Build Coastguard Worker         return "glBufferData failed";
766*35238bceSAndroid Build Coastguard Worker 
767*35238bceSAndroid Build Coastguard Worker     case RESULT_BUFFER_SUB_DATA_FAILED:
768*35238bceSAndroid Build Coastguard Worker         return "glBufferSubData failed";
769*35238bceSAndroid Build Coastguard Worker 
770*35238bceSAndroid Build Coastguard Worker     case RESULT_TEXTURE_IMAGE_FAILED:
771*35238bceSAndroid Build Coastguard Worker         return "glTexImage2D failed";
772*35238bceSAndroid Build Coastguard Worker 
773*35238bceSAndroid Build Coastguard Worker     case RESULT_TEXTURE_SUB_IMAGE_FAILED:
774*35238bceSAndroid Build Coastguard Worker         return "glTexSubImage2D failed";
775*35238bceSAndroid Build Coastguard Worker 
776*35238bceSAndroid Build Coastguard Worker     case RESULT_BIND_TEXTURE_FAILED:
777*35238bceSAndroid Build Coastguard Worker         return "glBindTexture failed";
778*35238bceSAndroid Build Coastguard Worker 
779*35238bceSAndroid Build Coastguard Worker     case RESULT_BIND_BUFFER_FAILED:
780*35238bceSAndroid Build Coastguard Worker         return "glBindBuffer failed";
781*35238bceSAndroid Build Coastguard Worker 
782*35238bceSAndroid Build Coastguard Worker     case RESULT_DELETE_TEXTURES_FAILED:
783*35238bceSAndroid Build Coastguard Worker         return "glDeleteTextures failed";
784*35238bceSAndroid Build Coastguard Worker 
785*35238bceSAndroid Build Coastguard Worker     case RESULT_DELETE_BUFFERS_FAILED:
786*35238bceSAndroid Build Coastguard Worker         return "glDeleteBuffers failed";
787*35238bceSAndroid Build Coastguard Worker 
788*35238bceSAndroid Build Coastguard Worker     case RESULT_RENDER_FAILED:
789*35238bceSAndroid Build Coastguard Worker         return "Rendering result failed";
790*35238bceSAndroid Build Coastguard Worker 
791*35238bceSAndroid Build Coastguard Worker     default:
792*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
793*35238bceSAndroid Build Coastguard Worker         return NULL;
794*35238bceSAndroid Build Coastguard Worker     }
795*35238bceSAndroid Build Coastguard Worker }
796*35238bceSAndroid Build Coastguard Worker 
MemoryStressCase(tcu::TestContext & ctx,glu::RenderContext & renderContext,uint32_t objectTypes,int minTextureSize,int maxTextureSize,int minBufferSize,int maxBufferSize,bool write,bool use,bool useUnusedData,bool clearAfterOOM,const char * name,const char * desc)797*35238bceSAndroid Build Coastguard Worker MemoryStressCase::MemoryStressCase(tcu::TestContext &ctx, glu::RenderContext &renderContext, uint32_t objectTypes,
798*35238bceSAndroid Build Coastguard Worker                                    int minTextureSize, int maxTextureSize, int minBufferSize, int maxBufferSize,
799*35238bceSAndroid Build Coastguard Worker                                    bool write, bool use, bool useUnusedData, bool clearAfterOOM, const char *name,
800*35238bceSAndroid Build Coastguard Worker                                    const char *desc)
801*35238bceSAndroid Build Coastguard Worker     : tcu::TestCase(ctx, name, desc)
802*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
803*35238bceSAndroid Build Coastguard Worker     , m_iterationCount(5)
804*35238bceSAndroid Build Coastguard Worker     , m_objectTypes((MemObjectType)objectTypes)
805*35238bceSAndroid Build Coastguard Worker     , m_zeroAlloc(false)
806*35238bceSAndroid Build Coastguard Worker     , m_clearAfterOOM(clearAfterOOM)
807*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderContext)
808*35238bceSAndroid Build Coastguard Worker {
809*35238bceSAndroid Build Coastguard Worker     m_allocated.reserve(m_iterationCount);
810*35238bceSAndroid Build Coastguard Worker     m_config.maxTextureSize = maxTextureSize;
811*35238bceSAndroid Build Coastguard Worker     m_config.minTextureSize = minTextureSize;
812*35238bceSAndroid Build Coastguard Worker     m_config.maxBufferSize  = maxBufferSize;
813*35238bceSAndroid Build Coastguard Worker     m_config.minBufferSize  = minBufferSize;
814*35238bceSAndroid Build Coastguard Worker     m_config.useUnusedData  = useUnusedData;
815*35238bceSAndroid Build Coastguard Worker     m_config.write          = write;
816*35238bceSAndroid Build Coastguard Worker     m_config.use            = use;
817*35238bceSAndroid Build Coastguard Worker }
818*35238bceSAndroid Build Coastguard Worker 
~MemoryStressCase(void)819*35238bceSAndroid Build Coastguard Worker MemoryStressCase::~MemoryStressCase(void)
820*35238bceSAndroid Build Coastguard Worker {
821*35238bceSAndroid Build Coastguard Worker }
822*35238bceSAndroid Build Coastguard Worker 
init(void)823*35238bceSAndroid Build Coastguard Worker void MemoryStressCase::init(void)
824*35238bceSAndroid Build Coastguard Worker {
825*35238bceSAndroid Build Coastguard Worker     if (!m_testCtx.getCommandLine().isOutOfMemoryTestEnabled())
826*35238bceSAndroid Build Coastguard Worker     {
827*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog()
828*35238bceSAndroid Build Coastguard Worker             << TestLog::Message
829*35238bceSAndroid Build Coastguard Worker             << "Tests that exhaust memory are disabled, use --deqp-test-oom=enable command line option to enable."
830*35238bceSAndroid Build Coastguard Worker             << TestLog::EndMessage;
831*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("OOM tests disabled");
832*35238bceSAndroid Build Coastguard Worker     }
833*35238bceSAndroid Build Coastguard Worker }
834*35238bceSAndroid Build Coastguard Worker 
deinit(void)835*35238bceSAndroid Build Coastguard Worker void MemoryStressCase::deinit(void)
836*35238bceSAndroid Build Coastguard Worker {
837*35238bceSAndroid Build Coastguard Worker     TCU_CHECK(!m_zeroAlloc);
838*35238bceSAndroid Build Coastguard Worker }
839*35238bceSAndroid Build Coastguard Worker 
iterate(void)840*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult MemoryStressCase::iterate(void)
841*35238bceSAndroid Build Coastguard Worker {
842*35238bceSAndroid Build Coastguard Worker     bool end          = false;
843*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log = m_testCtx.getLog();
844*35238bceSAndroid Build Coastguard Worker 
845*35238bceSAndroid Build Coastguard Worker     MemObjectAllocator allocator(log, m_renderCtx, m_objectTypes, m_config, deStringHash(getName()));
846*35238bceSAndroid Build Coastguard Worker 
847*35238bceSAndroid Build Coastguard Worker     if (!allocator.allocUntilFailure())
848*35238bceSAndroid Build Coastguard Worker     {
849*35238bceSAndroid Build Coastguard Worker         // Allocation timed out
850*35238bceSAndroid Build Coastguard Worker         allocator.clearObjects();
851*35238bceSAndroid Build Coastguard Worker 
852*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Timeout. Couldn't exhaust memory in timelimit. Allocated "
853*35238bceSAndroid Build Coastguard Worker             << allocator.getObjectCount() << " objects." << TestLog::EndMessage;
854*35238bceSAndroid Build Coastguard Worker 
855*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
856*35238bceSAndroid Build Coastguard Worker         return STOP;
857*35238bceSAndroid Build Coastguard Worker     }
858*35238bceSAndroid Build Coastguard Worker 
859*35238bceSAndroid Build Coastguard Worker     // Try to cancel rendering operations
860*35238bceSAndroid Build Coastguard Worker     if (m_clearAfterOOM)
861*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT));
862*35238bceSAndroid Build Coastguard Worker 
863*35238bceSAndroid Build Coastguard Worker     allocator.clearObjects();
864*35238bceSAndroid Build Coastguard Worker 
865*35238bceSAndroid Build Coastguard Worker     m_allocated.push_back(allocator.getObjectCount());
866*35238bceSAndroid Build Coastguard Worker 
867*35238bceSAndroid Build Coastguard Worker     if (m_iteration != 0 && allocator.getObjectCount() == 0)
868*35238bceSAndroid Build Coastguard Worker         m_zeroAlloc = true;
869*35238bceSAndroid Build Coastguard Worker 
870*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Got error when allocation object count: " << allocator.getObjectCount()
871*35238bceSAndroid Build Coastguard Worker         << " bytes: " << allocator.getBytes() << TestLog::EndMessage;
872*35238bceSAndroid Build Coastguard Worker 
873*35238bceSAndroid Build Coastguard Worker     if ((allocator.getGLError() == 0) && (allocator.getResult() == MemObjectAllocator::RESULT_GOT_BAD_ALLOC))
874*35238bceSAndroid Build Coastguard Worker     {
875*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "std::bad_alloc" << TestLog::EndMessage;
876*35238bceSAndroid Build Coastguard Worker         end = true;
877*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Memory allocation failed");
878*35238bceSAndroid Build Coastguard Worker     }
879*35238bceSAndroid Build Coastguard Worker     else if (allocator.getGLError() != GL_OUT_OF_MEMORY)
880*35238bceSAndroid Build Coastguard Worker     {
881*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Invalid Error " << MemObjectAllocator::resultToString(allocator.getResult())
882*35238bceSAndroid Build Coastguard Worker             << " GLError: " << glErrorToString(allocator.getGLError()) << TestLog::EndMessage;
883*35238bceSAndroid Build Coastguard Worker 
884*35238bceSAndroid Build Coastguard Worker         end = true;
885*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
886*35238bceSAndroid Build Coastguard Worker     }
887*35238bceSAndroid Build Coastguard Worker 
888*35238bceSAndroid Build Coastguard Worker     if ((m_iteration + 1) == m_iterationCount)
889*35238bceSAndroid Build Coastguard Worker     {
890*35238bceSAndroid Build Coastguard Worker         int min = m_allocated[0];
891*35238bceSAndroid Build Coastguard Worker         int max = m_allocated[0];
892*35238bceSAndroid Build Coastguard Worker 
893*35238bceSAndroid Build Coastguard Worker         float threshold = 50.0f;
894*35238bceSAndroid Build Coastguard Worker 
895*35238bceSAndroid Build Coastguard Worker         for (int allocNdx = 0; allocNdx < (int)m_allocated.size(); allocNdx++)
896*35238bceSAndroid Build Coastguard Worker         {
897*35238bceSAndroid Build Coastguard Worker             min = deMin32(m_allocated[allocNdx], min);
898*35238bceSAndroid Build Coastguard Worker             max = deMax32(m_allocated[allocNdx], max);
899*35238bceSAndroid Build Coastguard Worker         }
900*35238bceSAndroid Build Coastguard Worker 
901*35238bceSAndroid Build Coastguard Worker         if (min == 0 && max != 0)
902*35238bceSAndroid Build Coastguard Worker         {
903*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Allocation count zero" << TestLog::EndMessage;
904*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
905*35238bceSAndroid Build Coastguard Worker         }
906*35238bceSAndroid Build Coastguard Worker         else
907*35238bceSAndroid Build Coastguard Worker         {
908*35238bceSAndroid Build Coastguard Worker             const float change = (float)(min - max) / (float)(max);
909*35238bceSAndroid Build Coastguard Worker             if (change > threshold)
910*35238bceSAndroid Build Coastguard Worker             {
911*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Allocated objects max: " << max << ", min: " << min
912*35238bceSAndroid Build Coastguard Worker                     << ", difference: " << change << "% threshold: " << threshold << "%" << TestLog::EndMessage;
913*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_QUALITY_WARNING, "Allocation count variation");
914*35238bceSAndroid Build Coastguard Worker             }
915*35238bceSAndroid Build Coastguard Worker             else
916*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
917*35238bceSAndroid Build Coastguard Worker         }
918*35238bceSAndroid Build Coastguard Worker         end = true;
919*35238bceSAndroid Build Coastguard Worker     }
920*35238bceSAndroid Build Coastguard Worker 
921*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glFinish());
922*35238bceSAndroid Build Coastguard Worker 
923*35238bceSAndroid Build Coastguard Worker     m_iteration++;
924*35238bceSAndroid Build Coastguard Worker     if (end)
925*35238bceSAndroid Build Coastguard Worker         return STOP;
926*35238bceSAndroid Build Coastguard Worker     else
927*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
928*35238bceSAndroid Build Coastguard Worker }
929*35238bceSAndroid Build Coastguard Worker 
930*35238bceSAndroid Build Coastguard Worker } // namespace gls
931*35238bceSAndroid Build Coastguard Worker } // namespace deqp
932