Index: gpu/command_buffer/tests/gl_copy_tex_image_2d_workaround_unittest.cc |
diff --git a/gpu/command_buffer/tests/gl_copy_tex_image_2d_workaround_unittest.cc b/gpu/command_buffer/tests/gl_copy_tex_image_2d_workaround_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cb80ae3e7897ab492ff95d32aa91646da9d66cba |
--- /dev/null |
+++ b/gpu/command_buffer/tests/gl_copy_tex_image_2d_workaround_unittest.cc |
@@ -0,0 +1,122 @@ |
+// Copyright 2016 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. |
+ |
+#ifndef GL_GLEXT_PROTOTYPES |
+#define GL_GLEXT_PROTOTYPES |
+#endif |
+ |
+#include <GLES2/gl2.h> |
+#include <GLES2/gl2ext.h> |
+#include <GLES2/gl2extchromium.h> |
+ |
+#include "base/command_line.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "build/build_config.h" |
+#include "gpu/command_buffer/tests/gl_manager.h" |
+#include "gpu/command_buffer/tests/gl_test_utils.h" |
+#include "gpu/config/gpu_switches.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace gpu { |
+ |
+#if defined(OS_MACOSX) |
+// A collection of tests that exercise the glCopyTexImage2D workaround. The |
+// parameter expresses different formats of the destination texture. |
+class GLCopyTexImage2DWorkaroundTest : public testing::TestWithParam<GLenum> { |
+ public: |
+ GLCopyTexImage2DWorkaroundTest() {} |
+ |
+ protected: |
+ void SetUp() override { |
+ base::CommandLine command_line(0, NULL); |
+ command_line.AppendSwitchASCII( |
+ switches::kGpuDriverBugWorkarounds, |
+ base::IntToString(gpu::USE_INTERMEDIARY_FOR_COPY_TEXTURE_IMAGE)); |
+ gl_.InitializeWithCommandLine(GLManager::Options(), &command_line); |
+ gl_.set_use_iosurface_memory_buffers(true); |
+ DCHECK(gl_.workarounds().use_intermediary_for_copy_texture_image); |
+ } |
+ |
+ void TearDown() override { |
+ GLTestHelper::CheckGLError("no errors", __LINE__); |
+ gl_.Destroy(); |
+ } |
+ |
+ GLManager gl_; |
+}; |
+ |
+INSTANTIATE_TEST_CASE_P(GLCopyTexImage2DWorkaroundTestWithParam, |
+ GLCopyTexImage2DWorkaroundTest, |
+ ::testing::Values(GL_RGBA)); |
+ |
+TEST_P(GLCopyTexImage2DWorkaroundTest, UseIntermediaryTexture) { |
+ int width = 1; |
+ int height = 1; |
+ GLuint source_texture = 0; |
+ GLenum source_target = GL_TEXTURE_RECTANGLE_ARB; |
+ glGenTextures(1, &source_texture); |
+ glBindTexture(source_target, source_texture); |
+ glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
+ glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
+ GLuint image_id = glCreateGpuMemoryBufferImageCHROMIUM( |
+ width, height, GL_BGRA_EXT, GL_READ_WRITE_CHROMIUM); |
+ ASSERT_NE(0u, image_id); |
+ glBindTexImage2DCHROMIUM(source_target, image_id); |
+ |
+ GLuint framebuffer = 0; |
+ glGenFramebuffers(1, &framebuffer); |
+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); |
+ glFramebufferTexture2D( |
+ GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, source_target, source_texture, 0); |
+ EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), |
+ glCheckFramebufferStatus(GL_FRAMEBUFFER)); |
+ |
+ |
+ GLenum dest_formats[] = {GL_RGBA, GL_RGB, GL_ALPHA, GL_LUMINANCE}; |
+ const uint8_t expectations[4][4] = { |
+ {33, 44, 55, 66}, {33, 44, 55, 255}, {0, 0, 0, 66}, {33, 33, 33, 255}}; |
+ for (size_t i = 0; i < sizeof(dest_formats) / sizeof(GLenum); ++i) { |
+ glClearColor(33.0 / 255.0, 44.0 / 255.0, 55.0 / 255.0, 66.0 / 255.0); |
+ glClear(GL_COLOR_BUFFER_BIT); |
+ EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR)); |
+ |
+ GLuint dest_texture = 0; |
+ GLenum dest_target = GL_TEXTURE_2D; |
+ GLenum dest_format = dest_formats[i]; |
+ glGenTextures(1, &dest_texture); |
+ glBindTexture(dest_target, dest_texture); |
+ glTexParameteri(dest_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
+ glTexParameteri(dest_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
+ |
+ glCopyTexImage2D(dest_target, 0, dest_format, 0, 0, width, height, 0); |
+ EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR)); |
+ |
+ // Check that bound textures haven't changed. |
+ GLint boundTexture = -1; |
+ glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &boundTexture); |
+ EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR)); |
+ EXPECT_EQ(static_cast<GLint>(source_texture), boundTexture); |
+ |
+ boundTexture = -1; |
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &boundTexture); |
+ EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR)); |
+ EXPECT_EQ(static_cast<GLint>(dest_texture), boundTexture); |
+ |
+ glClearColor(1.0 / 255.0, 2.0 / 255.0, 3.0 / 255.0, 4.0 / 255.0); |
+ glClear(GL_COLOR_BUFFER_BIT); |
+ EXPECT_EQ(glGetError(), GLenum(GL_NO_ERROR)); |
+ |
+ glViewport(0, 0, width, height); |
+ GLTestHelper::DrawTextureQuad(dest_target, gfx::Size(width, height)); |
+ |
+ // Verify. |
+ const uint8_t* expected = expectations[i]; |
+ EXPECT_TRUE( |
+ GLTestHelper::CheckPixels(0, 0, 1, 1, 1 /* tolerance */, expected)); |
+ } |
+} |
+ |
+#endif // defined(OS_MACOSX) |
+ |
+} // namespace gpu |