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