X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=blittest.cpp;fp=blittest.cpp;h=a438ba8d405f5ddba8c460dda7beb6fdef9eae8e;hb=c72807863fcff447f59b9b52d066ddf32676936d;hp=0000000000000000000000000000000000000000;hpb=8ecaa4c3c620115e4855eda292cc4dbce283ad84;p=glmemperf diff --git a/blittest.cpp b/blittest.cpp new file mode 100644 index 0000000..a438ba8 --- /dev/null +++ b/blittest.cpp @@ -0,0 +1,194 @@ +/** + * OpenGL ES 2.0 memory performance estimator + * Copyright (C) 2009 Nokia + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * \author Sami Kyöstilä + * + * Generic blitter + */ +#include "blittest.h" +#include "util.h" +#include + +const char *defaultVertSource = + "precision mediump float;\n" + "attribute vec2 in_position;\n" + "attribute vec2 in_texcoord;\n" + "varying vec2 texcoord;\n" + "\n" + "void main()\n" + "{\n" + " gl_Position = vec4(in_position, 0.0, 1.0);\n" + " texcoord = in_texcoord;\n" + "}\n"; + +const char *defaultFragSource = + "precision mediump float;\n" + "varying vec2 texcoord;\n" + "uniform sampler2D texture;\n" + "\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(texture, texcoord);\n" + "}\n"; + +BlitTest::BlitTest(int width, int height, + bool rotate, float texW, float texH, + float quadW, float quadH): + m_width(width), + m_height(height), + m_texW(texW), + m_texH(texH), + m_quadW(quadW), + m_quadH(quadH), + m_rotate(rotate), + m_vertSource(defaultVertSource), + m_fragSource(defaultFragSource) +{ +} + +BlitTest::BlitTest(GLenum format, GLenum type, int width, int height, const std::string& fileName, + bool rotate, float texW, float texH, + float quadW, float quadH): + m_format(format), + m_type(type), + m_width(width), + m_height(height), + m_texW(texW), + m_texH(texH), + m_quadW(quadW), + m_quadH(quadH), + m_rotate(rotate), + m_fileName(fileName), + m_vertSource(defaultVertSource), + m_fragSource(defaultFragSource) +{ + if (m_format >= 0x8c00) + { + m_type = m_format; + } +} + +void BlitTest::teardown() +{ + glUseProgram(0); + glDisableVertexAttribArray(m_positionAttr); + glDisableVertexAttribArray(m_texcoordAttr); + glDeleteProgram(m_program); + // Disabled until driver segfault is fixed + //glDeleteTextures(1, &m_texture); +} + +void BlitTest::prepare() +{ + initializeBlitter(); + if (m_fileName.size()) + { + if (m_format >= 0x8c00) + { + loadCompressedTexture(GL_TEXTURE_2D, 0, m_format, m_width, m_height, m_fileName); + } + else + { + loadRawTexture(GL_TEXTURE_2D, 0, m_format, m_width, m_height, m_format, m_type, m_fileName); + } + } + ASSERT_GL(); +} + +void BlitTest::operator()(int frame) +{ + float t = frame / 400.0f; + + // Disable animation for now, since it interferes with the results due + // to lack of wrapping for NPOT textures + t = 0; + + const GLfloat texcoords[] = + { + 0 + t, m_texH + t, + 0 + t, 0 + t, + m_texW + t, m_texH + t, + m_texW + t, 0 + t + }; + + const GLfloat texcoordsRotated[] = + { + m_texW + t, 0 + t, + 0 + t, 0 + t, + m_texW + t, m_texH + t, + 0 + t, m_texH + t + }; + + const GLfloat vertices[] = + { + -m_quadW, -m_quadH, + -m_quadW, m_quadH, + m_quadW, -m_quadH, + m_quadW, m_quadH + }; + + glVertexAttribPointer(m_positionAttr, 2, GL_FLOAT, GL_FALSE, 0, vertices); + glVertexAttribPointer(m_texcoordAttr, 2, GL_FLOAT, GL_FALSE, 0, m_rotate ? texcoordsRotated : texcoords); + glClear(GL_COLOR_BUFFER_BIT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); +} + +std::string BlitTest::name() const +{ + std::stringstream s; + + if (m_rotate) + { + s << "blit_tex_rot90_"; + } + else + { + s << "blit_tex_"; + } + + s << textureFormatName(m_format, m_type); + s << "_" << m_width << "x" << m_height; + + return s.str(); +} + +void BlitTest::initializeBlitter() +{ + m_program = createProgram(m_vertSource, m_fragSource); + glUseProgram(m_program); + + glClearColor(.2, .4, .6, 1.0); + + m_positionAttr = glGetAttribLocation(m_program, "in_position"); + m_texcoordAttr = glGetAttribLocation(m_program, "in_texcoord"); + assert(m_positionAttr >= 0); + assert(m_texcoordAttr >= 0); + + glEnableVertexAttribArray(m_positionAttr); + glEnableVertexAttribArray(m_texcoordAttr); + + m_textureUnif = glGetUniformLocation(m_program, "texture"); + assert(m_textureUnif >= 0); + glUniform1i(m_textureUnif, 0); + + glGenTextures(1, &m_texture); + glBindTexture(GL_TEXTURE_2D, m_texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + ASSERT_GL(); +}