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