13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Memory object stress test
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsMemoryStressCase.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuCommandLine.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deClock.h"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h"
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glw.h"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <iostream>
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector;
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog;
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gls
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const char* glErrorToString (deUint32 error)
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (error)
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_OUT_OF_MEMORY:
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "GL_OUT_OF_MEMORY";
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_INVALID_ENUM:
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "GL_INVALID_ENUM";
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_INVALID_FRAMEBUFFER_OPERATION:
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "GL_INVALID_FRAMEBUFFER_OPERATION";
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_INVALID_OPERATION:
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "GL_INVALID_OPERATION";
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case GL_INVALID_VALUE:
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "GL_INVALID_VALUE";
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case 0:
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "<none>";
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			// \todo [mika] Handle uknown errors?
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return NULL;
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const float s_quadCoords[] =
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	-1.0f, -1.0f,
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	 1.0f, -1.0f,
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	 1.0f,  1.0f,
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	-1.0f,  1.0f
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic const GLubyte s_quadIndices[] =
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	0, 1, 2,
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	2, 3, 0
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TextureRenderer
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TextureRenderer		(tcu::TestLog& log, glu::RenderContext& renderContext);
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			~TextureRenderer	(void);
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	render				(deUint32 texture);
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*	m_program;
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::RenderContext&	m_renderCtx;
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_coordBuffer;
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_indexBuffer;
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_vao;
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_vertexShaderGLES2;
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_fragmentShaderGLES2;
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_vertexShaderGLES3;
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_fragmentShaderGLES3;
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_vertexShaderGL3;
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_fragmentShaderGL3;
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* TextureRenderer::s_vertexShaderGLES2 =
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"attribute mediump vec2 a_coord;\n"
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"varying mediump vec2 v_texCoord;\n"
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tv_texCoord = 0.5 * (a_coord + vec2(1.0));\n"
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* TextureRenderer::s_fragmentShaderGLES2 =
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"varying mediump vec2 v_texCoord;\n"
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"uniform sampler2D u_texture;\n"
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tgl_FragColor = texture2D(u_texture, v_texCoord);\n"
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* TextureRenderer::s_vertexShaderGLES3 =
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"#version 300 es\n"
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec2 a_coord;\n"
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"out mediump vec2 v_texCoord;\n"
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tv_texCoord = 0.5 * (a_coord + vec2(1.0));\n"
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* TextureRenderer::s_fragmentShaderGLES3 =
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"#version 300 es\n"
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec2 v_texCoord;\n"
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"uniform sampler2D u_texture;\n"
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tdEQP_FragColor = texture(u_texture, v_texCoord);\n"
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* TextureRenderer::s_vertexShaderGL3 =
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"#version 330\n"
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec2 a_coord;\n"
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"out mediump vec2 v_texCoord;\n"
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tv_texCoord = 0.5 * (a_coord + vec2(1.0));\n"
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* TextureRenderer::s_fragmentShaderGL3 =
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"#version 330\n"
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec2 v_texCoord;\n"
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"uniform sampler2D u_texture;\n"
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tdEQP_FragColor = texture(u_texture, v_texCoord);\n"
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureRenderer::TextureRenderer (tcu::TestLog& log, glu::RenderContext& renderContext)
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_program		(NULL)
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_renderCtx	(renderContext)
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_coordBuffer	(0)
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_indexBuffer	(0)
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_vao			(0)
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const glu::ContextType ctxType = renderContext.getType();
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_300_ES))
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program = new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGLES3, s_fragmentShaderGLES3));
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_100_ES))
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program = new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGLES2, s_fragmentShaderGLES2));
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_330))
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program = new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGL3, s_fragmentShaderGL3));
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (ctxType.getProfile() == glu::PROFILE_CORE)
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glGenVertexArrays(1, &m_vao));
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glGenBuffers(1, &m_coordBuffer));
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_coordBuffer));
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(s_quadCoords), s_quadCoords, GL_STATIC_DRAW));
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glGenBuffers(1, &m_indexBuffer));
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer));
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(s_quadIndices), s_quadIndices, GL_STATIC_DRAW));
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_program->isOk())
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << *m_program;
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK_MSG(m_program->isOk(), "Shader compilation failed");
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2133c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTextureRenderer::~TextureRenderer (void)
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_program;
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glDeleteBuffers(1, &m_coordBuffer);
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glDeleteBuffers(1, &m_indexBuffer);
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid TextureRenderer::render (deUint32 texture)
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 coordLoc = -1;
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 texLoc	= -1;
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_program->getProgram()));
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	coordLoc = glGetAttribLocation(m_program->getProgram(), "a_coord");
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK();
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(coordLoc != (deUint32)-1);
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_vao != 0)
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glBindVertexArray(m_vao));
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glEnableVertexAttribArray(coordLoc));
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_coordBuffer));
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glVertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL));
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glActiveTexture(GL_TEXTURE0));
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindTexture(GL_TEXTURE_2D, texture));
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	texLoc = glGetUniformLocation(m_program->getProgram(), "u_texture");
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK();
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(texLoc != (deUint32)-1);
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUniform1i(texLoc, 0));
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer));
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL));
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glDisableVertexAttribArray(coordLoc));
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_vao != 0)
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glBindVertexArray(0));
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass BufferRenderer
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			BufferRenderer	(tcu::TestLog& log, glu::RenderContext& renderContext);
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			~BufferRenderer	(void);
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void	render			(deUint32 buffer, int size);
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::ShaderProgram*	m_program;
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glu::RenderContext&	m_renderCtx;
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_coordBuffer;
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_indexBuffer;
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_vao;
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_vertexShaderGLES2;
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_fragmentShaderGLES2;
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_vertexShaderGLES3;
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_fragmentShaderGLES3;
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_vertexShaderGL3;
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	s_fragmentShaderGL3;
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* BufferRenderer::s_vertexShaderGLES2 =
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"attribute mediump vec2 a_coord;\n"
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"attribute mediump vec4 a_buffer;\n"
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"varying mediump vec4 v_buffer;\n"
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tv_buffer = a_buffer;\n"
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* BufferRenderer::s_fragmentShaderGLES2 =
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"varying mediump vec4 v_buffer;\n"
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tgl_FragColor = v_buffer;\n"
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* BufferRenderer::s_vertexShaderGLES3 =
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"#version 300 es\n"
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec2 a_coord;\n"
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec4 a_buffer;\n"
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"out mediump vec4 v_buffer;\n"
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tv_buffer = a_buffer;\n"
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* BufferRenderer::s_fragmentShaderGLES3 =
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"#version 300 es\n"
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec4 v_buffer;\n"
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tdEQP_FragColor = v_buffer;\n"
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* BufferRenderer::s_vertexShaderGL3 =
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"#version 330\n"
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec2 a_coord;\n"
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec4 a_buffer;\n"
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"out mediump vec4 v_buffer;\n"
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tv_buffer = a_buffer;\n"
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tgl_Position = vec4(a_coord, 0.0, 1.0);\n"
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* BufferRenderer::s_fragmentShaderGL3 =
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"#version 330\n"
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"in mediump vec4 v_buffer;\n"
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"void main (void)\n"
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"{\n"
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"\tdEQP_FragColor = v_buffer;\n"
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"}\n";
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3393c827367444ee418f129b2c238299f49d3264554Jarkko PoyryBufferRenderer::BufferRenderer (tcu::TestLog& log, glu::RenderContext& renderContext)
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_program		(NULL)
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_renderCtx	(renderContext)
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_coordBuffer	(0)
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_indexBuffer	(0)
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_vao			(0)
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const glu::ContextType ctxType = renderContext.getType();
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_300_ES))
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program = new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGLES3, s_fragmentShaderGLES3));
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_100_ES))
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program = new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGLES2, s_fragmentShaderGLES2));
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (glu::isGLSLVersionSupported(ctxType, glu::GLSL_VERSION_330))
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_program = new glu::ShaderProgram(m_renderCtx, glu::makeVtxFragSources(s_vertexShaderGL3, s_fragmentShaderGL3));
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT(false);
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (ctxType.getProfile() == glu::PROFILE_CORE)
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glGenVertexArrays(1, &m_vao));
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glGenBuffers(1, &m_coordBuffer));
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_coordBuffer));
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(s_quadCoords), s_quadCoords, GL_STATIC_DRAW));
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glGenBuffers(1, &m_indexBuffer));
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer));
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(s_quadIndices), s_quadIndices, GL_STATIC_DRAW));
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_program->isOk())
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << *m_program;
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TCU_CHECK_MSG(m_program->isOk(), "Shader compilation failed");
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3753c827367444ee418f129b2c238299f49d3264554Jarkko PoyryBufferRenderer::~BufferRenderer (void)
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	delete m_program;
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glDeleteBuffers(1, &m_coordBuffer);
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glDeleteBuffers(1, &m_indexBuffer);
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid BufferRenderer::render (deUint32 buffer, int size)
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(size);
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_ASSERT((size_t)size >= sizeof(GLubyte) * 4 * 6);
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glUseProgram(m_program->getProgram()));
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 bufferLoc = glGetAttribLocation(m_program->getProgram(), "a_buffer");
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(bufferLoc != (deUint32)-1);
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 coordLoc = glGetAttribLocation(m_program->getProgram(), "a_coord");
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(coordLoc != (deUint32)-1);
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_vao != 0)
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glBindVertexArray(m_vao));
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glEnableVertexAttribArray(bufferLoc));
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glEnableVertexAttribArray(coordLoc));
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_coordBuffer));
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glVertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL));
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, buffer));
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glVertexAttribPointer(bufferLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0));
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0));
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer));
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, NULL));
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glDisableVertexAttribArray(bufferLoc));
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glDisableVertexAttribArray(coordLoc));
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_vao != 0)
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glBindVertexArray(0));
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass MemObjectAllocator
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum Result
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_GOT_BAD_ALLOC = 0,
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_GEN_TEXTURES_FAILED,
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_GEN_BUFFERS_FAILED,
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_BUFFER_DATA_FAILED,
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_BUFFER_SUB_DATA_FAILED,
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_TEXTURE_IMAGE_FAILED,
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_TEXTURE_SUB_IMAGE_FAILED,
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_BIND_TEXTURE_FAILED,
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_BIND_BUFFER_FAILED,
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_DELETE_TEXTURES_FAILED,
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_DELETE_BUFFERS_FAILED,
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_RENDER_FAILED,
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		RESULT_LAST
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						MemObjectAllocator	(tcu::TestLog& log, glu::RenderContext& renderContext, MemObjectType objectTypes, const MemObjectConfig& config, int seed);
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						~MemObjectAllocator	(void);
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool				allocUntilFailure	(void);
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				clearObjects		(void);
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Result				getResult			(void) const { return m_result; }
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			getGLError			(void) const { return m_glError; }
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					getObjectCount		(void) const { return m_objectCount; }
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			getBytes			(void) const { return m_bytesRequired; }
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const char*	resultToString		(Result result);
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				allocateTexture		(de::Random& rnd);
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				allocateBuffer		(de::Random& rnd);
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<deUint32>	m_buffers;
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<deUint32>	m_textures;
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					m_seed;
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int					m_objectCount;
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_bytesRequired;
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	MemObjectType		m_objectTypes;
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Result				m_result;
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	MemObjectConfig		m_config;
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32			m_glError;
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	vector<deUint8>		m_dummyData;
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	BufferRenderer		m_bufferRenderer;
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TextureRenderer		m_textureRenderer;
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4683c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMemObjectAllocator::MemObjectAllocator (tcu::TestLog& log, glu::RenderContext& renderContext, MemObjectType objectTypes, const MemObjectConfig& config, int seed)
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: m_seed			(seed)
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_objectCount		(0)
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_bytesRequired	(0)
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_objectTypes		(objectTypes)
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_result			(RESULT_LAST)
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_config			(config)
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_glError			(0)
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_bufferRenderer	(log, renderContext)
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_textureRenderer	(log, renderContext)
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	DE_UNREF(renderContext);
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useDummyData)
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int dummySize = deMax32(m_config.maxBufferSize, m_config.maxTextureSize*m_config.maxTextureSize*4);
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_dummyData = vector<deUint8>(dummySize);
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (m_config.write)
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_dummyData = vector<deUint8>(128);
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMemObjectAllocator::~MemObjectAllocator (void)
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrybool MemObjectAllocator::allocUntilFailure (void)
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	de::Random rnd(m_seed);
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_MSG("Error in init");
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	try
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const deUint64	timeoutUs	= 10000000; // 10s
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint64		beginTimeUs	= deGetMicroseconds();
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		deUint64		currentTimeUs;
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		do
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			GLU_CHECK_MSG("Unkown Error");
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			switch (m_objectTypes)
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case MEMOBJECTTYPE_TEXTURE:
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					allocateTexture(rnd);
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				case MEMOBJECTTYPE_BUFFER:
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					allocateBuffer(rnd);
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				default:
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				{
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					if (rnd.getBool())
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						allocateBuffer(rnd);
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					else
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						allocateTexture(rnd);
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					break;
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				}
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (m_result != RESULT_LAST)
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				glFinish();
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				return true;
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			currentTimeUs = deGetMicroseconds();
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		} while (currentTimeUs - beginTimeUs < timeoutUs);
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Timeout
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (currentTimeUs - beginTimeUs >= timeoutUs)
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return false;
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return true;
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	catch (const std::bad_alloc&)
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result = RESULT_GOT_BAD_ALLOC;
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return true;
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MemObjectAllocator::clearObjects (void)
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32 error = 0;
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_textures.empty())
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteTextures((GLsizei)m_textures.size(), &(m_textures[0]));
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		error = glGetError();
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (error != 0)
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_result	= RESULT_DELETE_TEXTURES_FAILED;
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_glError	= error;
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_textures.clear();
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_buffers.empty())
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glDeleteBuffers((GLsizei)m_buffers.size(), &(m_buffers[0]));
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		error = glGetError();
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (error != 0)
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_result	= RESULT_DELETE_BUFFERS_FAILED;
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_glError	= error;
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_buffers.clear();
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MemObjectAllocator::allocateTexture (de::Random& rnd)
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	vectorBlockSize = 128;
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	tex		= 0;
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	error	= 0;
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			width	= rnd.getInt(m_config.minTextureSize, m_config.maxTextureSize);
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			height	= rnd.getInt(m_config.minTextureSize, m_config.maxTextureSize);
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGenTextures(1, &tex);
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_GEN_TEXTURES_FAILED;
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_textures.size() % vectorBlockSize == 0)
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_textures.reserve(m_textures.size() + vectorBlockSize);
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_textures.push_back(tex);
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glBindTexture(GL_TEXTURE_2D, tex);
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_BIND_TEXTURE_FAILED;
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useDummyData)
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT((int)m_dummyData.size() >= width*height*4);
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &(m_dummyData[0]));
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_TEXTURE_IMAGE_FAILED;
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.write)
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &(m_dummyData[0]));
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_TEXTURE_SUB_IMAGE_FAILED;
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.use)
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		try
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_textureRenderer.render(tex);
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		catch (const glu::Error& err)
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_result	= RESULT_RENDER_FAILED;
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_glError	= err.getError();
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		catch (const glu::OutOfMemoryError&)
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_result	= RESULT_RENDER_FAILED;
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_glError	= GL_OUT_OF_MEMORY;
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glBindTexture(GL_TEXTURE_2D, 0);
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_BIND_TEXTURE_FAILED;
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_objectCount++;
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_bytesRequired += width*height*4;
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MemObjectAllocator::allocateBuffer (de::Random& rnd)
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int	vectorBlockSize = 128;
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	buffer			= 0;
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32	error			= 0;
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int			size			= rnd.getInt(m_config.minBufferSize, m_config.maxBufferSize);
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glGenBuffers(1, &buffer);
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_GEN_BUFFERS_FAILED;
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glBindBuffer(GL_ARRAY_BUFFER, buffer);
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_BIND_BUFFER_FAILED;
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_buffers.size() % vectorBlockSize == 0)
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_buffers.reserve(m_buffers.size() + vectorBlockSize);
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_buffers.push_back(buffer);
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.useDummyData)
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		DE_ASSERT((int)m_dummyData.size() >= size);
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBufferData(GL_ARRAY_BUFFER, size, &(m_dummyData[0]), GL_DYNAMIC_DRAW);
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW);
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_BUFFER_DATA_FAILED;
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.write)
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		glBufferSubData(GL_ARRAY_BUFFER, 0, 1, &(m_dummyData[0]));
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_BUFFER_SUB_DATA_FAILED;
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_config.use)
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		try
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_bufferRenderer.render(buffer, size);
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		catch (const glu::Error& err)
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_result	= RESULT_RENDER_FAILED;
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_glError	= err.getError();
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		catch (const glu::OutOfMemoryError&)
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_result	= RESULT_RENDER_FAILED;
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_glError	= GL_OUT_OF_MEMORY;
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return;
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	glBindBuffer(GL_ARRAY_BUFFER, 0);
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	error = glGetError();
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (error != 0)
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_result	= RESULT_BIND_BUFFER_FAILED;
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_glError	= error;
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return;
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_objectCount++;
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_bytesRequired += size;
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* MemObjectAllocator::resultToString (Result result)
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (result)
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_GOT_BAD_ALLOC:
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "Caught std::bad_alloc";
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_GEN_TEXTURES_FAILED:
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glGenTextures failed";
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_GEN_BUFFERS_FAILED:
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glGenBuffers failed";
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_BUFFER_DATA_FAILED:
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glBufferData failed";
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_BUFFER_SUB_DATA_FAILED:
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glBufferSubData failed";
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_TEXTURE_IMAGE_FAILED:
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glTexImage2D failed";
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_TEXTURE_SUB_IMAGE_FAILED:
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glTexSubImage2D failed";
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_BIND_TEXTURE_FAILED:
7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glBindTexture failed";
7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_BIND_BUFFER_FAILED:
7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glBindBuffer failed";
7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_DELETE_TEXTURES_FAILED:
8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glDeleteTextures failed";
8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_DELETE_BUFFERS_FAILED:
8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "glDeleteBuffers failed";
8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		case RESULT_RENDER_FAILED:
8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "Rendering result failed";
8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			break;
8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		default:
8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			DE_ASSERT(false);
8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return NULL;
8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8193c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMemoryStressCase::MemoryStressCase (tcu::TestContext& ctx, glu::RenderContext& renderContext, deUint32 objectTypes, int minTextureSize, int maxTextureSize, int minBufferSize, int maxBufferSize, bool write, bool use, bool useDummyData, bool clearAfterOOM, const char* name, const char* desc)
8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::TestCase					(ctx, name, desc)
8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_iteration					(0)
8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_iterationCount				(5)
8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_objectTypes					((MemObjectType)objectTypes)
8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_zeroAlloc					(false)
8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_clearAfterOOM				(clearAfterOOM)
8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_renderCtx					(renderContext)
8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_allocated.reserve(m_iterationCount);
8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_config.maxTextureSize = maxTextureSize;
8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_config.minTextureSize = minTextureSize;
8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_config.maxBufferSize	= maxBufferSize;
8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_config.minBufferSize	= minBufferSize;
8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_config.useDummyData	= useDummyData;
8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_config.write			= write;
8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_config.use			= use;
8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8383c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMemoryStressCase::~MemoryStressCase (void)
8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MemoryStressCase::init (void)
8433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!m_testCtx.getCommandLine().isOutOfMemoryTestEnabled())
8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.getLog() << TestLog::Message << "Tests that exhaust memory are disabled, use --deqp-test-oom=enable command line option to enable." << TestLog::EndMessage;
8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw tcu::NotSupportedError("OOM tests disabled");
8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MemoryStressCase::deinit (void)
8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	TCU_CHECK(!m_zeroAlloc);
8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytcu::TestCase::IterateResult MemoryStressCase::iterate (void)
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			end		= false;
8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tcu::TestLog&	log		= m_testCtx.getLog();
8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	MemObjectAllocator allocator(log, m_renderCtx, m_objectTypes, m_config, deStringHash(getName()));
8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!allocator.allocUntilFailure())
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		// Allocation timed out
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		allocator.clearObjects();
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << "Timeout. Couldn't exhaust memory in timelimit. Allocated " << allocator.getObjectCount() << " objects." << TestLog::EndMessage;
8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Try to cancel rendering operations
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_clearAfterOOM)
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT));
8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	allocator.clearObjects();
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_allocated.push_back(allocator.getObjectCount());
8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_iteration != 0  && allocator.getObjectCount() == 0)
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_zeroAlloc = true;
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	log << TestLog::Message << "Got error when allocation object count: " << allocator.getObjectCount() << " bytes: " << allocator.getBytes() << TestLog::EndMessage;
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((allocator.getGLError() == 0) && (allocator.getResult() == MemObjectAllocator::RESULT_GOT_BAD_ALLOC))
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << "std::bad_alloc" << TestLog::EndMessage;
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		end = true;
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_RESOURCE_ERROR, "Memory allocation failed");
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else if (allocator.getGLError() != GL_OUT_OF_MEMORY)
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		log << TestLog::Message << "Invalid Error " << MemObjectAllocator::resultToString(allocator.getResult())
8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			<< " GLError: " << glErrorToString(allocator.getGLError()) <<
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		TestLog::EndMessage;
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		end = true;
9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if ((m_iteration+1) == m_iterationCount)
9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int min = m_allocated[0];
9063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		int max = m_allocated[0];
9073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		float threshold = 50.0f;
9093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int allocNdx = 0; allocNdx < (int)m_allocated.size(); allocNdx++)
9113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			min = deMin32(m_allocated[allocNdx], min);
9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			max = deMax32(m_allocated[allocNdx], max);
9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (min == 0 && max != 0)
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			log << TestLog::Message << "Allocation count zero" << TestLog::EndMessage;
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const float change = (min - max) / ((float)(max));
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if (change > threshold)
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			{
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				log << TestLog::Message << "Allocated objects max: " << max << ", min: " << min << ", difference: " << change << "% threshold: " << threshold << "%" << TestLog::EndMessage;
9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_testCtx.setTestResult(QP_TEST_RESULT_QUALITY_WARNING, "Allocation count variation");
9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			}
9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else
9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		end = true;
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	GLU_CHECK_CALL(glFinish());
9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	m_iteration++;
9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (end)
9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return STOP;
9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return CONTINUE;
9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gls
9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
946