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