diff options
Diffstat (limited to 'chromium/gpu/command_buffer/service/renderbuffer_manager.cc')
-rw-r--r-- | chromium/gpu/command_buffer/service/renderbuffer_manager.cc | 28 |
1 files changed, 25 insertions, 3 deletions
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; } |