| 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
|
| index 09b451c5b3c9491ae1d308ebf418498c9476b465..a7e6267572d1cd06bd5b18f7a38d20bcc4345e51 100644
|
| --- a/ui/gl/test/gl_image_test_template.h
|
| +++ b/ui/gl/test/gl_image_test_template.h
|
| @@ -28,38 +28,58 @@
|
| namespace gl {
|
| namespace {
|
|
|
| -std::string PrependFragmentSamplerType(unsigned target,
|
| - std::string shader_string) {
|
| +// Compiles a fragment shader for sampling out of a texture of |size| bound to
|
| +// |target| and checks for compilation errors.
|
| +GLuint LoadFragmentShader(unsigned target, const gfx::Size& size) {
|
| + // clang-format off
|
| + const char kFragmentShader[] = STRINGIZE(
|
| + uniform SamplerType a_texture;
|
| + varying vec2 v_texCoord;
|
| + void main() {
|
| + gl_FragColor = TextureLookup(a_texture, v_texCoord * TextureScale);
|
| + }
|
| + );
|
| + const char kShaderFloatPrecision[] = STRINGIZE(
|
| + precision mediump float;
|
| + );
|
| + // clang-format on
|
| +
|
| + bool is_gles = gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2;
|
| switch (target) {
|
| case GL_TEXTURE_2D:
|
| - DCHECK_NE(shader_string.find("SamplerType"), std::string::npos);
|
| - DCHECK_NE(shader_string.find("TextureLookup"), std::string::npos);
|
| - return "#define SamplerType sampler2D\n"
|
| - "#define TextureLookup texture2D\n" +
|
| - shader_string;
|
| + return gfx::GLHelper::LoadShader(
|
| + GL_FRAGMENT_SHADER,
|
| + base::StringPrintf("%s\n"
|
| + "#define SamplerType sampler2D\n"
|
| + "#define TextureLookup texture2D\n"
|
| + "#define TextureScale vec2(1.0, 1.0)\n"
|
| + "%s",
|
| + is_gles ? kShaderFloatPrecision : "",
|
| + kFragmentShader)
|
| + .c_str());
|
| case GL_TEXTURE_RECTANGLE_ARB:
|
| - DCHECK_NE(shader_string.find("SamplerType"), std::string::npos);
|
| - DCHECK_NE(shader_string.find("TextureLookup"), std::string::npos);
|
| - return "#extension GL_ARB_texture_rectangle : require\n"
|
| - "#define SamplerType sampler2DRect\n"
|
| - "#define TextureLookup texture2DRect\n" +
|
| - shader_string;
|
| + return gfx::GLHelper::LoadShader(
|
| + GL_FRAGMENT_SHADER,
|
| + base::StringPrintf("%s\n"
|
| + "#extension GL_ARB_texture_rectangle : require\n"
|
| + "#define SamplerType sampler2DRect\n"
|
| + "#define TextureLookup texture2DRect\n"
|
| + "#define TextureScale vec2(%f, %f)\n"
|
| + "%s",
|
| + is_gles ? kShaderFloatPrecision : "",
|
| + static_cast<double>(size.width()),
|
| + static_cast<double>(size.height()),
|
| + kFragmentShader)
|
| + .c_str());
|
| default:
|
| NOTREACHED();
|
| - break;
|
| + return 0;
|
| }
|
| - return shader_string;
|
| }
|
|
|
| -struct ProgramAndShaders {
|
| - GLuint program;
|
| - GLuint vertex_shader;
|
| - GLuint fragment_shader;
|
| -};
|
| -
|
| -// Creates a shader that reads from a texture.
|
| -// Returns the newly created programs and shaders.
|
| -void SetUpVertexAndFragmentShader(GLenum target, ProgramAndShaders* pas) {
|
| +// Draws texture bound to |target| of texture unit 0 to the currently bound
|
| +// frame buffer.
|
| +void DrawTextureQuad(GLenum target, const gfx::Size& size) {
|
| // clang-format off
|
| const char kVertexShader[] = STRINGIZE(
|
| attribute vec2 a_position;
|
| @@ -69,27 +89,11 @@ void SetUpVertexAndFragmentShader(GLenum target, ProgramAndShaders* pas) {
|
| v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5;
|
| }
|
| );
|
| - const char kFragmentShader[] = STRINGIZE(
|
| - uniform SamplerType a_texture;
|
| - varying vec2 v_texCoord;
|
| - void main() {
|
| - gl_FragColor = TextureLookup(a_texture, v_texCoord);
|
| - }
|
| - );
|
| - const char kShaderFloatPrecision[] = STRINGIZE(
|
| - precision mediump float;
|
| - );
|
| // clang-format on
|
|
|
| GLuint vertex_shader =
|
| gfx::GLHelper::LoadShader(GL_VERTEX_SHADER, kVertexShader);
|
| - bool is_gles = gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2;
|
| - GLuint fragment_shader = gfx::GLHelper::LoadShader(
|
| - GL_FRAGMENT_SHADER,
|
| - base::StringPrintf(
|
| - "%s\n%s", is_gles ? kShaderFloatPrecision : "",
|
| - PrependFragmentSamplerType(target, kFragmentShader).c_str())
|
| - .c_str());
|
| + GLuint fragment_shader = LoadFragmentShader(target, size);
|
| GLuint program = gfx::GLHelper::SetupProgram(vertex_shader, fragment_shader);
|
| EXPECT_NE(program, 0u);
|
| glUseProgram(program);
|
| @@ -98,9 +102,13 @@ void SetUpVertexAndFragmentShader(GLenum target, ProgramAndShaders* pas) {
|
| ASSERT_NE(sampler_location, -1);
|
| glUniform1i(sampler_location, 0);
|
|
|
| - pas->program = program;
|
| - pas->vertex_shader = vertex_shader;
|
| - pas->fragment_shader = fragment_shader;
|
| + GLuint vertex_buffer = gfx::GLHelper::SetupQuadVertexBuffer();
|
| + gfx::GLHelper::DrawQuad(vertex_buffer);
|
| +
|
| + glDeleteShader(vertex_shader);
|
| + glDeleteShader(fragment_shader);
|
| + glDeleteProgram(program);
|
| + glDeleteBuffersARB(1, &vertex_buffer);
|
| }
|
|
|
| } // namespace
|
| @@ -173,36 +181,40 @@ TYPED_TEST_CASE_P(GLImageZeroInitializeTest);
|
| // https://crbug.com/584760.
|
| TYPED_TEST_P(GLImageZeroInitializeTest, DISABLED_ZeroInitialize) {
|
| const gfx::Size image_size(256, 256);
|
| - scoped_refptr<gl::GLImage> image = this->delegate_.CreateImage(image_size);
|
| - GLenum target = this->delegate_.GetTextureTarget();
|
| - GLuint uninitialized_texture = GLTestHelper::CreateTexture(target);
|
|
|
| - glBindTexture(target, uninitialized_texture);
|
| - ASSERT_TRUE(image->BindTexImage(target));
|
| 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());
|
| - GLuint vertex_buffer = gfx::GLHelper::SetupQuadVertexBuffer();
|
|
|
| - ProgramAndShaders pas;
|
| - SetUpVertexAndFragmentShader(target, &pas);
|
| - gfx::GLHelper::DrawQuad(vertex_buffer);
|
| + // Create an uninitialized image of preferred format.
|
| + scoped_refptr<gl::GLImage> image = this->delegate_.CreateImage(image_size);
|
| +
|
| + // Create a texture that |image| will be bound to.
|
| + GLenum target = this->delegate_.GetTextureTarget();
|
| + GLuint texture = GLTestHelper::CreateTexture(target);
|
| + glBindTexture(target, texture);
|
| +
|
| + // Bind |image| to |texture|.
|
| + bool rv = image->BindTexImage(target);
|
| + EXPECT_TRUE(rv);
|
|
|
| + // Draw |texture| to viewport.
|
| + DrawTextureQuad(target, image_size);
|
| +
|
| + // Release |image| from |texture|.
|
| + image->ReleaseTexImage(target);
|
| +
|
| + // Read back pixels to check expectations.
|
| const uint8_t zero_color[] = {0, 0, 0, 0};
|
| GLTestHelper::CheckPixels(0, 0, image_size.width(), image_size.height(),
|
| zero_color);
|
|
|
| - glDeleteProgram(pas.program);
|
| - glDeleteShader(pas.vertex_shader);
|
| - glDeleteShader(pas.fragment_shader);
|
| - glDeleteBuffersARB(1, &vertex_buffer);
|
| + // Clean up.
|
| + glDeleteTextures(1, &texture);
|
| glDeleteFramebuffersEXT(1, &framebuffer);
|
| -
|
| - image->ReleaseTexImage(target);
|
| - image->Destroy(true);
|
| - glDeleteTextures(1, &uninitialized_texture);
|
| + image->Destroy(true /* have_context */);
|
| }
|
|
|
| REGISTER_TYPED_TEST_CASE_P(GLImageZeroInitializeTest, DISABLED_ZeroInitialize);
|
| @@ -248,27 +260,19 @@ TYPED_TEST_P(GLImageCopyTest, CopyTexImage) {
|
|
|
| // Copy |image| to |texture|.
|
| bool rv = image->CopyTexImage(target);
|
| -
|
| EXPECT_TRUE(rv);
|
|
|
| - ProgramAndShaders pas;
|
| - SetUpVertexAndFragmentShader(target, &pas);
|
| -
|
| - GLuint vertex_buffer = gfx::GLHelper::SetupQuadVertexBuffer();
|
| - // Draw |texture| to viewport and read back pixels to check expectations.
|
| - gfx::GLHelper::DrawQuad(vertex_buffer);
|
| + // Draw |texture| to viewport.
|
| + DrawTextureQuad(target, image_size);
|
|
|
| + // Read back pixels to check expectations.
|
| GLTestHelper::CheckPixels(0, 0, image_size.width(), image_size.height(),
|
| image_color);
|
|
|
| // Clean up.
|
| - glDeleteProgram(pas.program);
|
| - glDeleteShader(pas.vertex_shader);
|
| - glDeleteShader(pas.fragment_shader);
|
| - glDeleteBuffersARB(1, &vertex_buffer);
|
| glDeleteTextures(1, &texture);
|
| glDeleteFramebuffersEXT(1, &framebuffer);
|
| - image->Destroy(true);
|
| + image->Destroy(true /* have_context */);
|
| }
|
|
|
| // The GLImageCopyTest test case verifies that the GLImage implementation
|
|
|