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 a6aa44761b452c25806131f22b1d9ddb8e582ad6..059ab5b2c2957868d2b7472fca7a6cf6507c0f98 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -1295,9 +1295,6 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
// Returns: true if glEnable/glDisable should actually be called. |
bool SetCapabilityState(GLenum cap, bool enabled); |
- // Infer color encoding from internalformat |
- static GLint GetColorEncodingFromInternalFormat(GLenum internalformat); |
- |
// Check that the currently bound read framebuffer's color image |
// isn't the target texture of the glCopyTex{Sub}Image{2D|3D}. |
bool FormsTextureCopyingFeedbackLoop( |
@@ -4421,19 +4418,6 @@ bool GLES2DecoderImpl::CheckBoundFramebufferValid(const char* func_name) { |
return valid; |
} |
-GLint GLES2DecoderImpl::GetColorEncodingFromInternalFormat( |
- GLenum internalformat) { |
- switch (internalformat) { |
- case GL_SRGB_EXT: |
- case GL_SRGB_ALPHA_EXT: |
- case GL_SRGB8: |
- case GL_SRGB8_ALPHA8: |
- return GL_SRGB; |
- default: |
- return GL_LINEAR; |
- } |
-} |
- |
bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop( |
TextureRef* texture, GLint level, GLint layer) { |
Framebuffer* framebuffer = GetBoundReadFramebuffer(); |
@@ -6234,8 +6218,8 @@ void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { |
bool enable_srgb = 0; |
if (target == GL_TEXTURE_2D) { |
tex->GetLevelType(target, tex->base_level(), &type, &internal_format); |
- enable_srgb = |
- GetColorEncodingFromInternalFormat(internal_format) == GL_SRGB; |
+ enable_srgb = GLES2Util::GetColorEncodingFromInternalFormat( |
+ internal_format) == GL_SRGB; |
} |
if (enable_srgb && feature_info_->feature_flags().desktop_srgb_support) { |
state_.EnableDisableFramebufferSRGB(enable_srgb); |
@@ -8055,8 +8039,8 @@ void GLES2DecoderImpl::DoBlitFramebufferCHROMIUM( |
GLenum src_internal_format = GetBoundReadFramebufferInternalFormat(); |
GLenum src_type = GetBoundReadFramebufferTextureType(); |
- bool read_buffer_has_srgb = |
- GetColorEncodingFromInternalFormat(src_internal_format) == GL_SRGB; |
+ bool read_buffer_has_srgb = GLES2Util::GetColorEncodingFromInternalFormat( |
+ src_internal_format) == GL_SRGB; |
bool draw_buffers_has_srgb = false; |
if ((mask & GL_COLOR_BUFFER_BIT) != 0) { |
bool is_src_signed_int = |
@@ -8088,7 +8072,7 @@ void GLES2DecoderImpl::DoBlitFramebufferCHROMIUM( |
if (!src_internal_format) { |
read_framebuffer_miss_image = true; |
} |
- if (GetColorEncodingFromInternalFormat(dst_format) == GL_SRGB) |
+ if (GLES2Util::GetColorEncodingFromInternalFormat(dst_format) == GL_SRGB) |
draw_buffers_has_srgb = true; |
if (read_buffer_samples > 0 && |
(src_sized_format != |
@@ -13968,15 +13952,16 @@ bool GLES2DecoderImpl::ValidateCopyTexFormatHelper( |
return false; |
} |
if (feature_info_->IsWebGL2OrES3Context()) { |
- GLint color_encoding = GetColorEncodingFromInternalFormat(read_format); |
+ GLint color_encoding = |
+ GLES2Util::GetColorEncodingFromInternalFormat(read_format); |
bool float_mismatch = feature_info_->ext_color_buffer_float_available() ? |
(GLES2Util::IsIntegerFormat(internal_format) != |
GLES2Util::IsIntegerFormat(read_format)) : |
GLES2Util::IsFloatFormat(internal_format); |
- if (color_encoding != GetColorEncodingFromInternalFormat(internal_format) || |
- float_mismatch || |
- (GLES2Util::IsSignedIntegerFormat(internal_format) != |
- GLES2Util::IsSignedIntegerFormat(read_format)) || |
+ if (color_encoding != |
+ GLES2Util::GetColorEncodingFromInternalFormat(internal_format) || |
+ float_mismatch || (GLES2Util::IsSignedIntegerFormat(internal_format) != |
+ GLES2Util::IsSignedIntegerFormat(read_format)) || |
(GLES2Util::IsUnsignedIntegerFormat(internal_format) != |
GLES2Util::IsUnsignedIntegerFormat(read_format))) { |
*output_error_msg = std::string("incompatible format"); |
@@ -16475,8 +16460,10 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
if (feature_info_->feature_flags().desktop_srgb_support) { |
bool enable_framebuffer_srgb = |
- GetColorEncodingFromInternalFormat(source_internal_format) == GL_SRGB || |
- GetColorEncodingFromInternalFormat(internal_format) == GL_SRGB; |
+ GLES2Util::GetColorEncodingFromInternalFormat(source_internal_format) == |
+ GL_SRGB || |
+ GLES2Util::GetColorEncodingFromInternalFormat(internal_format) == |
+ GL_SRGB; |
state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); |
} |
@@ -16722,6 +16709,18 @@ void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( |
return; |
} |
+#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
+ // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver, |
+ // although opposite in Android. |
+ // TODO(dshwang): After Mesa fixes this issue, remove this hack. |
+ // https://bugs.freedesktop.org/show_bug.cgi?id=98478, crbug.com/535198. |
+ if (Texture::ColorRenderable(GetFeatureInfo(), dest_internal_format, |
+ dest_texture->IsImmutable()) && |
+ method == DIRECT_COPY) { |
+ method = DIRECT_DRAW; |
+ } |
+#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 |
@@ -16742,8 +16741,10 @@ void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( |
if (feature_info_->feature_flags().desktop_srgb_support) { |
bool enable_framebuffer_srgb = |
- GetColorEncodingFromInternalFormat(source_internal_format) == GL_SRGB || |
- GetColorEncodingFromInternalFormat(dest_internal_format) == GL_SRGB; |
+ GLES2Util::GetColorEncodingFromInternalFormat(source_internal_format) == |
+ GL_SRGB || |
+ GLES2Util::GetColorEncodingFromInternalFormat(dest_internal_format) == |
+ GL_SRGB; |
state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); |
} |