blob: fc78349a20c6e4099c5ed18c7afd6a4a1d058f5f [file] [log] [blame]
// 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_RGBA, 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