diff options
Diffstat (limited to 'chromium/gpu/command_buffer')
3 files changed, 33 insertions, 11 deletions
diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc index a5446a0059a..acc9e6946f0 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -2975,8 +2975,9 @@ bool BackRenderbuffer::AllocateStorage(const gfx::Size& size, size.height()); } else { // TODO(kainino): This path will not perform RegenerateRenderbufferIfNeeded - // on devices where multisample_renderbuffer_resize_emulation is needed. - // Thus any code using this path (pepper?) could encounter issues on those + // on devices where multisample_renderbuffer_resize_emulation or + // depth_stencil_renderbuffer_resize_emulation is needed. Thus any code + // using this path (pepper?) could encounter issues on those // devices. RenderbufferStorageMultisampleWithWorkaround should be used // instead, but can only be used if BackRenderbuffer tracks its // renderbuffers in the renderbuffer manager instead of manually. @@ -8552,11 +8553,7 @@ void GLES2DecoderImpl::RenderbufferStorageMultisampleHelper( bool GLES2DecoderImpl::RegenerateRenderbufferIfNeeded( Renderbuffer* renderbuffer) { - if (!workarounds().multisample_renderbuffer_resize_emulation) { - return false; - } - - if (!renderbuffer->RegenerateAndBindBackingObjectIfNeeded()) { + if (!renderbuffer->RegenerateAndBindBackingObjectIfNeeded(workarounds())) { return false; } diff --git a/chromium/gpu/command_buffer/service/renderbuffer_manager.cc b/chromium/gpu/command_buffer/service/renderbuffer_manager.cc index ecdb81af79e..722330a3ee2 100644 --- a/chromium/gpu/command_buffer/service/renderbuffer_manager.cc +++ b/chromium/gpu/command_buffer/service/renderbuffer_manager.cc @@ -18,6 +18,8 @@ #include "gpu/command_buffer/service/framebuffer_manager.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/command_buffer/service/memory_tracking.h" +#include "gpu/command_buffer/service/texture_manager.h" +#include "gpu/config/gpu_driver_bug_workarounds.h" #include "ui/gl/gl_implementation.h" #include "ui/gl/gl_version_info.h" #include "ui/gl/trace_util.h" @@ -137,9 +139,29 @@ Renderbuffer::Renderbuffer(RenderbufferManager* manager, manager_->StartTracking(this); } -bool Renderbuffer::RegenerateAndBindBackingObjectIfNeeded() { - if (!allocated_ || !has_been_bound_ || samples_ == 0) { - // Not needed - won't trigger bug (multisample_renderbuffer_resize_broken). +bool Renderbuffer::RegenerateAndBindBackingObjectIfNeeded( + const GpuDriverBugWorkarounds& workarounds) { + // There are two workarounds which need this code path: + // depth_stencil_renderbuffer_resize_emulation + // multisample_renderbuffer_resize_emulation + bool multisample_workaround = + workarounds.multisample_renderbuffer_resize_emulation; + bool depth_stencil_workaround = + workarounds.depth_stencil_renderbuffer_resize_emulation; + if (!multisample_workaround && !depth_stencil_workaround) { + return false; + } + + if (!allocated_ || !has_been_bound_) { + return false; + } + + bool workaround_needed = (multisample_workaround && samples_ > 0) || + (depth_stencil_workaround && + TextureManager::ExtractFormatFromStorageFormat( + internal_format_) == GL_DEPTH_STENCIL); + + if (!workaround_needed) { return false; } diff --git a/chromium/gpu/command_buffer/service/renderbuffer_manager.h b/chromium/gpu/command_buffer/service/renderbuffer_manager.h index e87b1303cd0..72373f7adb4 100644 --- a/chromium/gpu/command_buffer/service/renderbuffer_manager.h +++ b/chromium/gpu/command_buffer/service/renderbuffer_manager.h @@ -20,6 +20,8 @@ #include "gpu/gpu_export.h" namespace gpu { +class GpuDriverBugWorkarounds; + namespace gles2 { class FeatureInfo; @@ -76,7 +78,8 @@ class GPU_EXPORT Renderbuffer // Regenerates the object backing this client_id, creating a new service_id. // Also reattaches any framebuffers using this renderbuffer. - bool RegenerateAndBindBackingObjectIfNeeded(); + bool RegenerateAndBindBackingObjectIfNeeded( + const GpuDriverBugWorkarounds& workarounds); void AddFramebufferAttachmentPoint(Framebuffer* framebuffer, GLenum attachment); |