--- /dev/null
+/**
+ * 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ä <sami.kyostila@nokia.com>
+ *
+ * Framebuffer object blit test
+ */
+#include "fboblittest.h"
+#include "util.h"
+#include <sstream>
+
+FBOBlitTest::FBOBlitTest(GLenum format, GLenum type, int width, int height,
+ bool rotate, float texW, float texH, bool useDepth):
+ BlitTest(width, height, rotate, texW, texH),
+ m_type(type),
+ m_useDepth(useDepth)
+{
+ m_format = format;
+ m_type = type;
+}
+
+void FBOBlitTest::prepare()
+{
+ BlitTest::prepare();
+
+ glTexImage2D(GL_TEXTURE_2D, 0, m_format, m_width, m_height, 0, m_format, m_type, NULL);
+ ASSERT_GL();
+
+ glGenRenderbuffers(1, &m_depthbuffer);
+ glBindRenderbuffer(GL_RENDERBUFFER, m_depthbuffer);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, m_width, m_height);
+ ASSERT_GL();
+
+ glGenFramebuffers(1, &m_framebuffer);
+ glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_texture, 0);
+ if (m_useDepth)
+ {
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+ GL_RENDERBUFFER, m_depthbuffer);
+ }
+ ASSERT_GL();
+
+ GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ assert(status == GL_FRAMEBUFFER_COMPLETE);
+
+ GLint viewport[4];
+ glGetIntegerv(GL_VIEWPORT, viewport);
+ glViewport(0, 0, m_width, m_height);
+ fillTexture();
+ glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+ ASSERT_GL();
+}
+
+void FBOBlitTest::fillTexture()
+{
+ int i;
+ glEnable(GL_SCISSOR_TEST);
+ for (i = 0; i < m_width; i++)
+ {
+ glScissor(i, 0, 1, m_height);
+ glClearColor(i / (float)m_width, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+ }
+ glDisable(GL_SCISSOR_TEST);
+}
+
+void FBOBlitTest::teardown()
+{
+ glDeleteFramebuffers(1, &m_framebuffer);
+ glDeleteRenderbuffers(1, &m_depthbuffer);
+ BlitTest::teardown();
+}
+
+std::string FBOBlitTest::name() const
+{
+ std::stringstream s;
+
+ if (m_rotate)
+ {
+ s << "blit_fbo_rot90_";
+ }
+ else
+ {
+ s << "blit_fbo_";
+ }
+
+ s << textureFormatName(m_format, m_type);
+ s << "_" << m_width << "x" << m_height;
+
+ return s.str();
+}