Chromium Code Reviews| 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 fe333fa1997ca1a6f76f6c99144014c7ebbdfbb5..28b2606e92065179d6925ab3af635b342b498e6a 100644 |
| --- a/ui/gl/test/gl_image_test_template.h |
| +++ b/ui/gl/test/gl_image_test_template.h |
| @@ -35,61 +35,85 @@ |
| namespace gl { |
| namespace { |
| +GLuint LoadVertexShader() { |
| + bool is_desktop_core_profile = |
| + GLContext::GetCurrent()->GetVersionInfo()->is_desktop_core_profile; |
| + std::string vertex_shader = base::StringPrintf( |
| + "%s" // version |
| + "%s vec2 a_position;\n" |
| + "%s vec2 v_texCoord;\n" |
| + "void main() {\n" |
| + " gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0);\n" |
| + " v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5;\n" |
| + "}", |
| + is_desktop_core_profile ? "#version 150\n" : "", |
| + is_desktop_core_profile ? "in" : "attribute", |
| + is_desktop_core_profile ? "out" : "varying"); |
| + return GLHelper::LoadShader(GL_VERTEX_SHADER, vertex_shader.c_str()); |
| +} |
| + |
| // 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_desktop_core_profile = |
| + GLContext::GetCurrent()->GetVersionInfo()->is_desktop_core_profile; |
| bool is_gles = GLContext::GetCurrent()->GetVersionInfo()->is_es; |
| + |
| + std::string fragment_shader_main = base::StringPrintf( |
| + "uniform SamplerType a_texture;\n" |
|
reveman
2016/08/18 17:27:56
nit: did you cl format this? please do if you didn
Zhenyao Mo
2016/08/18 17:57:23
Done.
|
| + "%s vec2 v_texCoord;\n" |
| + "%s" // output variable declaration |
| + "void main() {\n" |
| + " %s = TextureLookup(a_texture, v_texCoord * TextureScale);\n" |
| + "}", |
| + is_desktop_core_profile ? "in" : "varying", |
| + is_desktop_core_profile ? "out vec4 my_FragData;\n" : "", |
| + is_desktop_core_profile ? "my_FragData" : "gl_FragData[0]"); |
| + |
| switch (target) { |
| case GL_TEXTURE_2D: |
| return 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()); |
| + base::StringPrintf( |
| + "%s" // version |
| + "%s" // precision |
| + "#define SamplerType sampler2D\n" |
| + "#define TextureLookup %s\n" |
| + "#define TextureScale vec2(1.0, 1.0)\n" |
| + "%s", // main function |
| + is_desktop_core_profile ? "#version 150\n" : "", |
| + is_gles ? "precision mediump float;\n" : "", |
| + is_desktop_core_profile ? "texture" : "texture2D", |
| + fragment_shader_main.c_str()).c_str()); |
| case GL_TEXTURE_RECTANGLE_ARB: |
| + DCHECK(!is_gles); |
| return GLHelper::LoadShader( |
| GL_FRAGMENT_SHADER, |
| - base::StringPrintf("#extension GL_ARB_texture_rectangle : require\n" |
| - "%s\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()); |
| + base::StringPrintf( |
| + "%s" // version |
| + "%s" // extension |
| + "#define SamplerType sampler2DRect\n" |
| + "#define TextureLookup %s\n" |
| + "#define TextureScale vec2(%f, %f)\n" |
| + "%s", // main function |
| + is_desktop_core_profile ? "#version 150\n" : "", |
| + is_desktop_core_profile ? "" : |
| + "#extension GL_ARB_texture_rectangle : require\n", |
| + is_desktop_core_profile ? "texture" : "texture2DRect", |
| + static_cast<double>(size.width()), |
| + static_cast<double>(size.height()), |
| + fragment_shader_main.c_str()).c_str()); |
| case GL_TEXTURE_EXTERNAL_OES: |
| + DCHECK(is_gles); |
| return GLHelper::LoadShader( |
| GL_FRAGMENT_SHADER, |
| - base::StringPrintf("#extension GL_OES_EGL_image_external : require\n" |
| - "%s\n" |
| - "#define SamplerType samplerExternalOES\n" |
| - "#define TextureLookup texture2D\n" |
| - "#define TextureScale vec2(1.0, 1.0)\n" |
| - "%s", |
| - is_gles ? kShaderFloatPrecision : "", |
| - kFragmentShader) |
| - .c_str()); |
| + base::StringPrintf( |
| + "#extension GL_OES_EGL_image_external : require\n" |
| + "#define SamplerType samplerExternalOES\n" |
| + "#define TextureLookup texture2D\n" |
| + "#define TextureScale vec2(1.0, 1.0)\n" |
| + "%s", // main function |
| + fragment_shader_main.c_str()).c_str()); |
| default: |
| NOTREACHED(); |
| return 0; |
| @@ -99,24 +123,13 @@ GLuint LoadFragmentShader(unsigned target, const gfx::Size& size) { |
| // 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; |
| - varying vec2 v_texCoord; |
| - void main() { |
| - gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0); |
| - v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5; |
| - } |
| - ); |
| - // clang-format on |
| - |
| GLuint vao = 0; |
| if (GLHelper::ShouldTestsUseVAOs()) { |
| glGenVertexArraysOES(1, &vao); |
| glBindVertexArrayOES(vao); |
| } |
| - GLuint vertex_shader = GLHelper::LoadShader(GL_VERTEX_SHADER, kVertexShader); |
| + GLuint vertex_shader = LoadVertexShader(); |
| GLuint fragment_shader = LoadFragmentShader(target, size); |
| GLuint program = GLHelper::SetupProgram(vertex_shader, fragment_shader); |
| EXPECT_NE(program, 0u); |
| @@ -314,6 +327,13 @@ TYPED_TEST_P(GLImageCopyTest, CopyTexImage) { |
| const uint8_t* image_color = this->delegate_.GetImageColor(); |
| const uint8_t texture_color[] = {0, 0, 0xff, 0xff}; |
| + GLuint vao = 0; |
| + if (GLContext::GetCurrent()->GetVersionInfo()->IsAtLeastGL(3, 3)) { |
| + // To avoid glGetVertexAttribiv(0, ...) failing. |
| + glGenVertexArraysOES(1, &vao); |
| + glBindVertexArrayOES(vao); |
| + } |
| + |
| GLuint framebuffer = |
| GLTestHelper::SetupFramebuffer(image_size.width(), image_size.height()); |
| ASSERT_TRUE(framebuffer); |
| @@ -355,6 +375,9 @@ TYPED_TEST_P(GLImageCopyTest, CopyTexImage) { |
| glDeleteTextures(1, &texture); |
| glDeleteFramebuffersEXT(1, &framebuffer); |
| image->Destroy(true /* have_context */); |
| + if (vao) { |
| + glDeleteVertexArraysOES(1, &vao); |
| + } |
| } |
| // The GLImageCopyTest test case verifies that the GLImage implementation |