Chromium Code Reviews| 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 3c0f126881452c0bd00de777adffe0901a3d2aa6..e8df82b84e455f46f6448c1187a15a9cf3c04e50 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| @@ -707,6 +707,7 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
| // Workarounds |
| void OnFboChanged() const; |
| void OnUseFramebuffer() const; |
| + void UpdateFramebufferSRGB(Framebuffer* framebuffer); |
| error::ContextLostReason GetContextLostReasonFromResetStatus( |
| GLenum reset_status) const; |
| @@ -3458,6 +3459,7 @@ bool GLES2DecoderImpl::Initialize( |
| DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); |
| DoBindFramebuffer(GL_FRAMEBUFFER, 0); |
| DoBindRenderbuffer(GL_RENDERBUFFER, 0); |
| + UpdateFramebufferSRGB(nullptr); |
| bool call_gl_clear = !surfaceless_ && !offscreen; |
| #if defined(OS_ANDROID) |
| @@ -4293,21 +4295,37 @@ bool GLES2DecoderImpl::CheckBoundDrawFramebufferValid(const char* func_name) { |
| Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); |
| bool valid = CheckFramebufferValid( |
| framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name); |
| - if (valid && !features().chromium_framebuffer_multisample) |
| + if (!valid) |
| + return false; |
| + |
| + if (!features().chromium_framebuffer_multisample) |
| OnUseFramebuffer(); |
| - if (valid && feature_info_->feature_flags().desktop_srgb_support) { |
| - // If framebuffer contains sRGB images, then enable FRAMEBUFFER_SRGB. |
| - // Otherwise, disable FRAMEBUFFER_SRGB. Assume default fbo does not have |
| - // sRGB image. |
| - // In theory, we can just leave FRAMEBUFFER_SRGB on. However, many drivers |
| - // behave incorrectly when all images are linear encoding, they still apply |
| - // the sRGB conversion, but when at least one image is sRGB, then they |
| - // behave correctly. |
| - bool enable_framebuffer_srgb = |
| - framebuffer && framebuffer->HasSRGBAttachments(); |
| + |
| + UpdateFramebufferSRGB(framebuffer); |
| + return true; |
| +} |
| + |
| +void GLES2DecoderImpl::UpdateFramebufferSRGB(Framebuffer* framebuffer) { |
| + // Manually set the value of FRAMEBUFFER_SRGB based on the state that was set |
| + // by the client. |
| + bool needs_enable_disable_framebuffer_srgb = false; |
| + bool enable_framebuffer_srgb = true; |
| + if (feature_info_->feature_flags().ext_srgb_write_control) { |
| + needs_enable_disable_framebuffer_srgb = true; |
| + enable_framebuffer_srgb &= state_.GetEnabled(GL_FRAMEBUFFER_SRGB); |
| + } |
| + // On desktop, enable FRAMEBUFFER_SRGB only if the framebuffer contains sRGB |
| + // attachments. In theory, we can just leave FRAMEBUFFER_SRGB enabled, |
| + // however, |
| + // many drivers behave incorrectly when no attachments are sRGB. When at |
| + // least one attachment is sRGB, then they behave correctly. |
| + if (feature_info_->feature_flags().desktop_srgb_support) { |
| + needs_enable_disable_framebuffer_srgb = true; |
|
Zhenyao Mo
2016/11/30 19:31:11
You can DCHECK this because desktop_srgb_support s
ccameron
2016/11/30 23:59:44
Done.
ccameron
2016/12/01 02:14:34
Oops, now that I'm not enabling write control for
|
| + // Assume that the default fbo does not have an sRGB image. |
| + enable_framebuffer_srgb &= framebuffer && framebuffer->HasSRGBAttachments(); |
| + } |
| + if (needs_enable_disable_framebuffer_srgb) |
| state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); |
| - } |
| - return valid; |
| } |
| bool GLES2DecoderImpl::CheckBoundReadFramebufferValid( |
| @@ -7417,6 +7435,11 @@ void GLES2DecoderImpl::DoDisable(GLenum cap) { |
| // DrawElements* for old desktop GL. |
| return; |
| } |
| + if (cap == GL_FRAMEBUFFER_SRGB) { |
| + // Enable and Disable GL_FRAMEBUFFER_SRGB is done manually in |
| + // CheckBoundDrawFramebufferValid. |
| + return; |
| + } |
| glDisable(cap); |
| } |
| } |
| @@ -7429,6 +7452,11 @@ void GLES2DecoderImpl::DoEnable(GLenum cap) { |
| // DrawElements* for old desktop GL. |
| return; |
| } |
| + if (cap == GL_FRAMEBUFFER_SRGB) { |
| + // Enable and Disable GL_FRAMEBUFFER_SRGB is done manually in |
| + // CheckBoundDrawFramebufferValid. |
| + return; |
| + } |
| glEnable(cap); |
| } |
| } |