Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(965)

Unified Diff: ui/gl/test/gl_image_test_template.h

Issue 1354483004: Re-land: ui: Add GLImage unit test framework. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gl/test/gl_image_test_support.cc ('k') | ui/gl/test/gl_surface_test_support.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gl/test/gl_image_test_template.h
diff --git a/ui/gl/test/gl_image_test_template.h b/ui/gl/test/gl_image_test_template.h
new file mode 100644
index 0000000000000000000000000000000000000000..8533ce20c44d7c824e4e1fdf3e52d5935ae57406
--- /dev/null
+++ b/ui/gl/test/gl_image_test_template.h
@@ -0,0 +1,182 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file defines tests that implementations of GLImage should pass in order
+// to be conformant.
+
+#ifndef UI_GL_TEST_GL_IMAGE_TEST_TEMPLATE_H_
+#define UI_GL_TEST_GL_IMAGE_TEST_TEMPLATE_H_
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/stringize_macros.h"
+#include "base/strings/stringprintf.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/buffer_format_util.h"
+#include "ui/gfx/buffer_types.h"
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_image.h"
+#include "ui/gl/gl_implementation.h"
+#include "ui/gl/gl_surface.h"
+#include "ui/gl/test/gl_image_test_support.h"
+#include "ui/gl/test/gl_test_helper.h"
+
+namespace gfx {
+
+template <typename GLImageTestDelegate>
+class GLImageTest : public testing::Test {
+ protected:
+ // Overridden from testing::Test:
+ void SetUp() override {
+ GLImageTestSupport::InitializeGL();
+ surface_ = GLSurface::CreateOffscreenGLSurface(Size());
+ context_ = GLContext::CreateGLContext(nullptr, surface_.get(),
+ PreferIntegratedGpu);
+ context_->MakeCurrent(surface_.get());
+ }
+ void TearDown() override {
+ context_->ReleaseCurrent(surface_.get());
+ context_ = nullptr;
+ surface_ = nullptr;
+ GLImageTestSupport::CleanupGL();
+ }
+
+ protected:
+ scoped_refptr<GLSurface> surface_;
+ scoped_refptr<GLContext> context_;
+ GLImageTestDelegate delegate_;
+};
+
+TYPED_TEST_CASE_P(GLImageTest);
+
+// Copy image to texture. Support is optional. Texels should be updated if
+// supported, and left unchanged if not.
+TYPED_TEST_P(GLImageTest, CopyTexSubImage) {
+ const Size image_size(256, 256);
+ const uint8_t image_color[] = {0, 0xff, 0, 0xff};
+ const uint8_t texture_color[] = {0, 0, 0xff, 0xff};
+
+ GLuint framebuffer =
+ GLTestHelper::SetupFramebuffer(image_size.width(), image_size.height());
+ ASSERT_TRUE(framebuffer);
+ glBindFramebufferEXT(GL_FRAMEBUFFER, framebuffer);
+ glViewport(0, 0, image_size.width(), image_size.height());
+
+ // Create a solid color green image of preferred format. This must succeed
+ // in order for a GLImage to be conformant.
+ scoped_refptr<GLImage> image = this->delegate_.CreateSolidColorImage(
+ image_size, GLImageTestSupport::GetPreferredInternalFormat(),
+ GLImageTestSupport::GetPreferredBufferFormat(), image_color);
+ ASSERT_TRUE(image);
+
+ // Create a solid color blue texture of the same size as |image|.
+ GLuint texture = GLTestHelper::CreateTexture(GL_TEXTURE_2D);
+ scoped_ptr<uint8_t[]> pixels(new uint8_t[BufferSizeForBufferFormat(
+ image_size, GLImageTestSupport::GetPreferredBufferFormat())]);
+ GLImageTestSupport::SetBufferDataToColor(
+ image_size.width(), image_size.height(),
+ static_cast<int>(RowSizeForBufferFormat(
+ image_size.width(), GLImageTestSupport::GetPreferredBufferFormat(),
+ 0)),
+ GLImageTestSupport::GetPreferredBufferFormat(), texture_color,
+ pixels.get());
+ // Note: This test assume that |image| can be used with GL_TEXTURE_2D but
+ // that might not be the case for some GLImage implementations.
+ glBindTexture(GL_TEXTURE_2D, texture);
+ glTexImage2D(GL_TEXTURE_2D, 0,
+ GLImageTestSupport::GetPreferredInternalFormat(),
+ image_size.width(), image_size.height(), 0,
+ GLImageTestSupport::GetPreferredInternalFormat(),
+ GL_UNSIGNED_BYTE, pixels.get());
+
+ // Attempt to copy |image| to |texture|.
+ // Returns true on success, false on failure.
+ bool rv = image->CopyTexSubImage(GL_TEXTURE_2D, Point(), Rect(image_size));
+
+ // clang-format off
+ const char kVertexShader[] = STRINGIZE(
+ attribute vec2 a_position;
+ attribute vec2 a_texCoord;
+ varying vec2 v_texCoord;
+ void main() {
+ gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0);
+ v_texCoord = a_texCoord;
+ }
+ );
+ const char kFragmentShader[] = STRINGIZE(
+ uniform sampler2D a_texture;
+ varying vec2 v_texCoord;
+ void main() {
+ gl_FragColor = texture2D(a_texture, v_texCoord);
+ }
+ );
+ const char kShaderFloatPrecision[] = STRINGIZE(
+ precision mediump float;
+ );
+ // clang-format on
+
+ GLuint vertex_shader =
+ GLTestHelper::LoadShader(GL_VERTEX_SHADER, kVertexShader);
+ bool is_gles = GetGLImplementation() == kGLImplementationEGLGLES2;
+ GLuint fragment_shader = GLTestHelper::LoadShader(
+ GL_FRAGMENT_SHADER,
+ base::StringPrintf("%s%s", is_gles ? kShaderFloatPrecision : "",
+ kFragmentShader)
+ .c_str());
+ GLuint program = GLTestHelper::SetupProgram(vertex_shader, fragment_shader);
+ EXPECT_NE(program, 0u);
+ glUseProgram(program);
+
+ GLint sampler_location = glGetUniformLocation(program, "a_texture");
+ ASSERT_NE(sampler_location, -1);
+ glUniform1i(sampler_location, 0);
+
+ // clang-format off
+ static GLfloat vertices[] = {
+ -1.f, -1.f, 0.f, 0.f,
+ 1.f, -1.f, 1.f, 0.f,
+ -1.f, 1.f, 0.f, 1.f,
+ 1.f, 1.f, 1.f, 1.f
+ };
+ // clang-format on
+
+ GLuint vertex_buffer;
+ glGenBuffersARB(1, &vertex_buffer);
+ glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+ GLint position_location = glGetAttribLocation(program, "a_position");
+ ASSERT_NE(position_location, -1);
+ glEnableVertexAttribArray(position_location);
+ glVertexAttribPointer(position_location, 2, GL_FLOAT, GL_FALSE,
+ sizeof(GLfloat) * 4, 0);
+ GLint tex_coord_location = glGetAttribLocation(program, "a_texCoord");
+ EXPECT_NE(tex_coord_location, -1);
+ glEnableVertexAttribArray(tex_coord_location);
+ glVertexAttribPointer(tex_coord_location, 2, GL_FLOAT, GL_FALSE,
+ sizeof(GLfloat) * 4,
+ reinterpret_cast<void*>(sizeof(GLfloat) * 2));
+
+ // Draw |texture| to viewport and read back pixels to check expectations.
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+ GLTestHelper::CheckPixels(0, 0, image_size.width(), image_size.height(),
+ rv ? image_color : texture_color);
+
+ // Clean up.
+ glDeleteProgram(program);
+ glDeleteShader(vertex_shader);
+ glDeleteShader(fragment_shader);
+ glDeleteBuffersARB(1, &vertex_buffer);
+ glDeleteTextures(1, &texture);
+ glDeleteFramebuffersEXT(1, &framebuffer);
+ image->Destroy(true);
+}
+
+// The GLImageTest test case verifies behaviour that is expected from a
+// GLImage in order to be conformant.
+REGISTER_TYPED_TEST_CASE_P(GLImageTest, CopyTexSubImage);
+
+} // namespace gfx
+
+#endif // UI_GL_TEST_GL_IMAGE_TEST_TEMPLATE_H_
« no previous file with comments | « ui/gl/test/gl_image_test_support.cc ('k') | ui/gl/test/gl_surface_test_support.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698