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 80d7234db1a14a553dffb18d6158a0b66afbb85b..c823faa86045760849505492ca0eb3fc9f753288 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -2028,8 +2028,11 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
bool CanUseCopyTextureCHROMIUMInternalFormat(GLenum dest_internal_format); |
CopyTextureMethod ValidateCopyTextureCHROMIUMInternalFormats( |
const char* function_name, |
- TextureRef* source_texture_ref, |
GLint source_level, |
+ GLenum source_internal_format, |
+ GLenum source_type, |
+ GLenum dest_target, |
+ GLint dest_level, |
GLenum dest_internal_format); |
bool ValidateCompressedCopyTextureCHROMIUM(const char* function_name, |
TextureRef* source_texture_ref, |
@@ -16270,15 +16273,12 @@ bool GLES2DecoderImpl::CanUseCopyTextureCHROMIUMInternalFormat( |
CopyTextureMethod GLES2DecoderImpl::ValidateCopyTextureCHROMIUMInternalFormats( |
const char* function_name, |
- TextureRef* source_texture_ref, |
GLint source_level, |
+ GLenum source_internal_format, |
+ GLenum source_type, |
+ GLenum dest_target, |
+ GLint dest_level, |
GLenum dest_internal_format) { |
- GLenum source_type = 0; |
- GLenum source_internal_format = 0; |
- Texture* source_texture = source_texture_ref->texture(); |
- source_texture->GetLevelType(source_texture->target(), source_level, |
- &source_type, &source_internal_format); |
- |
bool valid_dest_format = false; |
// TODO(qiankun.miao@intel.com): ALPHA, LUMINANCE and LUMINANCE_ALPHA formats |
// are not supported on GL core profile. See crbug.com/577144. Enable the |
@@ -16372,12 +16372,26 @@ CopyTextureMethod GLES2DecoderImpl::ValidateCopyTextureCHROMIUMInternalFormats( |
dest_internal_format != GL_BGRA8_EXT && |
ValidateCopyTexFormatHelper(dest_internal_format, source_internal_format, |
source_type, &output_error_msg); |
- if (source_format_color_renderable && copy_tex_image_format_valid) |
- return DIRECT_COPY; |
- if (dest_format_color_renderable) |
+ // TODO(qiankun.miao@intel.com): for WebGL 2.0 or OpenGL ES 3.0, both |
+ // DIRECT_DRAW path for dest_level > 0 and DIRECT_COPY path for source_level > |
+ // 0 are not available due to a framebuffer completeness bug: |
+ // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and |
+ // OpenGL ES 3.0 can be lifted. |
+ // For WebGL 1.0 or OpenGL ES 2.0, DIRECT_DRAW path isn't available for |
+ // dest_level > 0 due to level > 0 isn't supported by glFramebufferTexture2D |
+ // in ES2 context. DIRECT_DRAW path isn't available for cube map dest texture |
+ // either due to it may be cube map incomplete. Go to DRAW_AND_COPY path in |
+ // these cases. |
+ if (source_format_color_renderable && copy_tex_image_format_valid && |
+ source_level == 0) |
+ return DIRECT_COPY; |
+ if (dest_format_color_renderable && dest_level == 0 && |
+ dest_target != GL_TEXTURE_CUBE_MAP) |
return DIRECT_DRAW; |
+ // Draw to a fbo attaching level 0 of an intermediate texture, |
+ // then copy from the fbo to dest texture level with glCopyTexImage2D. |
return DRAW_AND_COPY; |
} |
@@ -16475,31 +16489,14 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
} |
CopyTextureMethod method = ValidateCopyTextureCHROMIUMInternalFormats( |
- kFunctionName, source_texture_ref, source_level, internal_format); |
+ kFunctionName, source_level, source_internal_format, source_type, |
+ dest_binding_target, dest_level, internal_format); |
// INVALID_OPERATION is already generated by |
// ValidateCopyTextureCHROMIUMInternalFormats. |
if (method == NOT_COPYABLE) { |
return; |
} |
- // Draw to a fbo attaching level 0 of an intermediate texture, |
- // then copy from the fbo to dest texture level with glCopyTexImage2D. |
- // For WebGL 1.0 or OpenGL ES 2.0, DIRECT_DRAW path isn't available for |
- // dest_level > 0 due to level > 0 isn't supported by glFramebufferTexture2D |
- // in ES2 context. DIRECT_DRAW path isn't available for cube map dest texture |
- // either due to it may be cube map incomplete. Go to DRAW_AND_COPY path in |
- // these cases. |
- // TODO(qiankun.miao@intel.com): for WebGL 2.0 or OpenGL ES 3.0, both |
- // DIRECT_DRAW path for dest_level > 0 and DIRECT_COPY path for source_level > |
- // 0 are not available due to a framebuffer completeness bug: |
- // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and |
- // OpenGL ES 3.0 can be lifted. |
- if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && |
- method == DIRECT_DRAW) || |
- (source_level > 0 && method == DIRECT_COPY)) { |
- method = DRAW_AND_COPY; |
- } |
- |
if (feature_info_->feature_flags().desktop_srgb_support) { |
bool enable_framebuffer_srgb = |
GLES2Util::GetColorEncodingFromInternalFormat(source_internal_format) == |
@@ -16744,7 +16741,8 @@ void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( |
} |
CopyTextureMethod method = ValidateCopyTextureCHROMIUMInternalFormats( |
- kFunctionName, source_texture_ref, source_level, dest_internal_format); |
+ kFunctionName, source_level, source_internal_format, source_type, |
+ dest_binding_target, dest_level, dest_internal_format); |
// INVALID_OPERATION is already generated by |
// ValidateCopyTextureCHROMIUMInternalFormats. |
if (method == NOT_COPYABLE) { |
@@ -16763,24 +16761,6 @@ void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( |
} |
#endif |
- // Draw to a fbo attaching level 0 of an intermediate texture, |
- // then copy from the fbo to dest texture level with glCopyTexImage2D. |
- // For WebGL 1.0 or OpenGL ES 2.0, DIRECT_DRAW path isn't available for |
- // dest_level > 0 due to level > 0 isn't supported by glFramebufferTexture2D |
- // in ES2 context. DIRECT_DRAW path isn't available for cube map dest texture |
- // either due to it may be cube map incomplete. Go to DRAW_AND_COPY path in |
- // these cases. |
- // TODO(qiankun.miao@intel.com): for WebGL 2.0 or OpenGL ES 3.0, both |
- // DIRECT_DRAW path for dest_level > 0 and DIRECT_COPY path for source_level > |
- // 0 are not available due to a framebuffer completeness bug: |
- // crbug.com/678526. Once the bug is fixed, the limitation for WebGL 2.0 and |
- // OpenGL ES 3.0 can be lifted. |
- if (((dest_level > 0 || dest_binding_target == GL_TEXTURE_CUBE_MAP) && |
- method == DIRECT_DRAW) || |
- (source_level > 0 && method == DIRECT_COPY)) { |
- method = DRAW_AND_COPY; |
- } |
- |
if (feature_info_->feature_flags().desktop_srgb_support) { |
bool enable_framebuffer_srgb = |
GLES2Util::GetColorEncodingFromInternalFormat(source_internal_format) == |