summaryrefslogtreecommitdiff
path: root/chromium/gpu/command_buffer/service/renderbuffer_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/gpu/command_buffer/service/renderbuffer_manager.cc')
-rw-r--r--chromium/gpu/command_buffer/service/renderbuffer_manager.cc28
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;
}