Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 2519603002: Add command buffer support for EXT_sRGB_write_control (Closed)
Patch Set: And more cleanup Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 bool GenSamplersHelper(GLsizei n, const GLuint* client_ids); 700 bool GenSamplersHelper(GLsizei n, const GLuint* client_ids);
701 void DeleteSamplersHelper(GLsizei n, const volatile GLuint* client_ids); 701 void DeleteSamplersHelper(GLsizei n, const volatile GLuint* client_ids);
702 bool GenTransformFeedbacksHelper(GLsizei n, const GLuint* client_ids); 702 bool GenTransformFeedbacksHelper(GLsizei n, const GLuint* client_ids);
703 void DeleteTransformFeedbacksHelper(GLsizei n, 703 void DeleteTransformFeedbacksHelper(GLsizei n,
704 const volatile GLuint* client_ids); 704 const volatile GLuint* client_ids);
705 void DeleteSyncHelper(GLuint sync); 705 void DeleteSyncHelper(GLuint sync);
706 706
707 // Workarounds 707 // Workarounds
708 void OnFboChanged() const; 708 void OnFboChanged() const;
709 void OnUseFramebuffer() const; 709 void OnUseFramebuffer() const;
710 void UpdateFramebufferSRGB(Framebuffer* framebuffer);
710 711
711 error::ContextLostReason GetContextLostReasonFromResetStatus( 712 error::ContextLostReason GetContextLostReasonFromResetStatus(
712 GLenum reset_status) const; 713 GLenum reset_status) const;
713 714
714 // TODO(gman): Cache these pointers? 715 // TODO(gman): Cache these pointers?
715 BufferManager* buffer_manager() { 716 BufferManager* buffer_manager() {
716 return group_->buffer_manager(); 717 return group_->buffer_manager();
717 } 718 }
718 719
719 RenderbufferManager* renderbuffer_manager() { 720 RenderbufferManager* renderbuffer_manager() {
(...skipping 2731 matching lines...) Expand 10 before | Expand all | Expand 10 after
3451 return false; 3452 return false;
3452 } 3453 }
3453 } 3454 }
3454 3455
3455 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); 3456 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit);
3456 3457
3457 DoBindBuffer(GL_ARRAY_BUFFER, 0); 3458 DoBindBuffer(GL_ARRAY_BUFFER, 0);
3458 DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 3459 DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
3459 DoBindFramebuffer(GL_FRAMEBUFFER, 0); 3460 DoBindFramebuffer(GL_FRAMEBUFFER, 0);
3460 DoBindRenderbuffer(GL_RENDERBUFFER, 0); 3461 DoBindRenderbuffer(GL_RENDERBUFFER, 0);
3462 UpdateFramebufferSRGB(nullptr);
3461 3463
3462 bool call_gl_clear = !surfaceless_ && !offscreen; 3464 bool call_gl_clear = !surfaceless_ && !offscreen;
3463 #if defined(OS_ANDROID) 3465 #if defined(OS_ANDROID)
3464 // Temporary workaround for Android WebView because this clear ignores the 3466 // Temporary workaround for Android WebView because this clear ignores the
3465 // clip and corrupts that external UI of the App. Not calling glClear is ok 3467 // clip and corrupts that external UI of the App. Not calling glClear is ok
3466 // because the system already clears the buffer before each draw. Proper 3468 // because the system already clears the buffer before each draw. Proper
3467 // fix might be setting the scissor clip properly before initialize. See 3469 // fix might be setting the scissor clip properly before initialize. See
3468 // crbug.com/259023 for details. 3470 // crbug.com/259023 for details.
3469 call_gl_clear = surface_->GetHandle(); 3471 call_gl_clear = surface_->GetHandle();
3470 #endif 3472 #endif
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after
4286 } 4288 }
4287 return true; 4289 return true;
4288 } 4290 }
4289 4291
4290 bool GLES2DecoderImpl::CheckBoundDrawFramebufferValid(const char* func_name) { 4292 bool GLES2DecoderImpl::CheckBoundDrawFramebufferValid(const char* func_name) {
4291 GLenum target = features().chromium_framebuffer_multisample ? 4293 GLenum target = features().chromium_framebuffer_multisample ?
4292 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER; 4294 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER;
4293 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); 4295 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
4294 bool valid = CheckFramebufferValid( 4296 bool valid = CheckFramebufferValid(
4295 framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name); 4297 framebuffer, target, GL_INVALID_FRAMEBUFFER_OPERATION, func_name);
4296 if (valid && !features().chromium_framebuffer_multisample) 4298 if (!valid)
4299 return false;
4300
4301 if (!features().chromium_framebuffer_multisample)
4297 OnUseFramebuffer(); 4302 OnUseFramebuffer();
4298 if (valid && feature_info_->feature_flags().desktop_srgb_support) { 4303
4299 // If framebuffer contains sRGB images, then enable FRAMEBUFFER_SRGB. 4304 UpdateFramebufferSRGB(framebuffer);
4300 // Otherwise, disable FRAMEBUFFER_SRGB. Assume default fbo does not have 4305 return true;
4301 // sRGB image. 4306 }
4302 // In theory, we can just leave FRAMEBUFFER_SRGB on. However, many drivers 4307
4303 // behave incorrectly when all images are linear encoding, they still apply 4308 void GLES2DecoderImpl::UpdateFramebufferSRGB(Framebuffer* framebuffer) {
4304 // the sRGB conversion, but when at least one image is sRGB, then they 4309 // Manually set the value of FRAMEBUFFER_SRGB based on the state that was set
4305 // behave correctly. 4310 // by the client.
4306 bool enable_framebuffer_srgb = 4311 bool needs_enable_disable_framebuffer_srgb = false;
4307 framebuffer && framebuffer->HasSRGBAttachments(); 4312 bool enable_framebuffer_srgb = true;
4313 if (feature_info_->feature_flags().ext_srgb_write_control) {
4314 needs_enable_disable_framebuffer_srgb = true;
4315 enable_framebuffer_srgb &= state_.GetEnabled(GL_FRAMEBUFFER_SRGB);
4316 }
4317 // On desktop, enable FRAMEBUFFER_SRGB only if the framebuffer contains sRGB
4318 // attachments. In theory, we can just leave FRAMEBUFFER_SRGB enabled,
4319 // however,
4320 // many drivers behave incorrectly when no attachments are sRGB. When at
4321 // least one attachment is sRGB, then they behave correctly.
4322 if (feature_info_->feature_flags().desktop_srgb_support) {
4323 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
4324 // Assume that the default fbo does not have an sRGB image.
4325 enable_framebuffer_srgb &= framebuffer && framebuffer->HasSRGBAttachments();
4326 }
4327 if (needs_enable_disable_framebuffer_srgb)
4308 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb); 4328 state_.EnableDisableFramebufferSRGB(enable_framebuffer_srgb);
4309 }
4310 return valid;
4311 } 4329 }
4312 4330
4313 bool GLES2DecoderImpl::CheckBoundReadFramebufferValid( 4331 bool GLES2DecoderImpl::CheckBoundReadFramebufferValid(
4314 const char* func_name, GLenum gl_error) { 4332 const char* func_name, GLenum gl_error) {
4315 GLenum target = features().chromium_framebuffer_multisample ? 4333 GLenum target = features().chromium_framebuffer_multisample ?
4316 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER; 4334 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
4317 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target); 4335 Framebuffer* framebuffer = GetFramebufferInfoForTarget(target);
4318 bool valid = CheckFramebufferValid( 4336 bool valid = CheckFramebufferValid(
4319 framebuffer, target, gl_error, func_name); 4337 framebuffer, target, gl_error, func_name);
4320 return valid; 4338 return valid;
(...skipping 3089 matching lines...) Expand 10 before | Expand all | Expand 10 after
7410 } 7428 }
7411 7429
7412 void GLES2DecoderImpl::DoDisable(GLenum cap) { 7430 void GLES2DecoderImpl::DoDisable(GLenum cap) {
7413 if (SetCapabilityState(cap, false)) { 7431 if (SetCapabilityState(cap, false)) {
7414 if (cap == GL_PRIMITIVE_RESTART_FIXED_INDEX && 7432 if (cap == GL_PRIMITIVE_RESTART_FIXED_INDEX &&
7415 feature_info_->feature_flags().emulate_primitive_restart_fixed_index) { 7433 feature_info_->feature_flags().emulate_primitive_restart_fixed_index) {
7416 // Enable and Disable PRIMITIVE_RESTART only before and after 7434 // Enable and Disable PRIMITIVE_RESTART only before and after
7417 // DrawElements* for old desktop GL. 7435 // DrawElements* for old desktop GL.
7418 return; 7436 return;
7419 } 7437 }
7438 if (cap == GL_FRAMEBUFFER_SRGB) {
7439 // Enable and Disable GL_FRAMEBUFFER_SRGB is done manually in
7440 // CheckBoundDrawFramebufferValid.
7441 return;
7442 }
7420 glDisable(cap); 7443 glDisable(cap);
7421 } 7444 }
7422 } 7445 }
7423 7446
7424 void GLES2DecoderImpl::DoEnable(GLenum cap) { 7447 void GLES2DecoderImpl::DoEnable(GLenum cap) {
7425 if (SetCapabilityState(cap, true)) { 7448 if (SetCapabilityState(cap, true)) {
7426 if (cap == GL_PRIMITIVE_RESTART_FIXED_INDEX && 7449 if (cap == GL_PRIMITIVE_RESTART_FIXED_INDEX &&
7427 feature_info_->feature_flags().emulate_primitive_restart_fixed_index) { 7450 feature_info_->feature_flags().emulate_primitive_restart_fixed_index) {
7428 // Enable and Disable PRIMITIVE_RESTART only before and after 7451 // Enable and Disable PRIMITIVE_RESTART only before and after
7429 // DrawElements* for old desktop GL. 7452 // DrawElements* for old desktop GL.
7430 return; 7453 return;
7431 } 7454 }
7455 if (cap == GL_FRAMEBUFFER_SRGB) {
7456 // Enable and Disable GL_FRAMEBUFFER_SRGB is done manually in
7457 // CheckBoundDrawFramebufferValid.
7458 return;
7459 }
7432 glEnable(cap); 7460 glEnable(cap);
7433 } 7461 }
7434 } 7462 }
7435 7463
7436 void GLES2DecoderImpl::DoDepthRangef(GLclampf znear, GLclampf zfar) { 7464 void GLES2DecoderImpl::DoDepthRangef(GLclampf znear, GLclampf zfar) {
7437 state_.z_near = std::min(1.0f, std::max(0.0f, znear)); 7465 state_.z_near = std::min(1.0f, std::max(0.0f, znear));
7438 state_.z_far = std::min(1.0f, std::max(0.0f, zfar)); 7466 state_.z_far = std::min(1.0f, std::max(0.0f, zfar));
7439 glDepthRange(znear, zfar); 7467 glDepthRange(znear, zfar);
7440 } 7468 }
7441 7469
(...skipping 11423 matching lines...) Expand 10 before | Expand all | Expand 10 after
18865 } 18893 }
18866 18894
18867 // Include the auto-generated part of this file. We split this because it means 18895 // Include the auto-generated part of this file. We split this because it means
18868 // we can easily edit the non-auto generated parts right here in this file 18896 // we can easily edit the non-auto generated parts right here in this file
18869 // instead of having to edit some template or the code generator. 18897 // instead of having to edit some template or the code generator.
18870 #include "base/macros.h" 18898 #include "base/macros.h"
18871 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 18899 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
18872 18900
18873 } // namespace gles2 18901 } // namespace gles2
18874 } // namespace gpu 18902 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698