Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index b50b52f8f4ccef45aa76f9a8c7098d64822682c5..8c28900a1d541d7d513adb9a0aca3780e51a5e38 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -10128,9 +10128,19 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
dest_texture_ref, GL_TEXTURE_2D, level, true); |
} |
- DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); |
ScopedModifyPixels modify(dest_texture_ref); |
+ // Try using GLImage::CopyTexImage when possible. |
+ bool unpack_premultiply_alpha_change = |
+ unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_; |
+ if (image && !unpack_flip_y_ && !unpack_premultiply_alpha_change && !level) { |
+ glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); |
+ if (image->CopyTexImage(GL_TEXTURE_2D)) |
+ return; |
+ } |
+ |
+ DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); |
+ |
// GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix |
// before presenting. |
if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { |