diff options
author | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-22 02:43:43 +0000 |
---|---|---|
committer | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-22 02:43:43 +0000 |
commit | b381ee37106ad606f96912ffc93365d20ee5dde5 (patch) | |
tree | 5995832591b6f2a8e14cb0bddbd51d0e7469aa83 | |
parent | cdddc0f927a5fac887cc081792189bb06e314dbb (diff) | |
download | chromium_src-b381ee37106ad606f96912ffc93365d20ee5dde5.zip chromium_src-b381ee37106ad606f96912ffc93365d20ee5dde5.tar.gz chromium_src-b381ee37106ad606f96912ffc93365d20ee5dde5.tar.bz2 |
Blacklist partial swaps on linux
BUG=339493
Review URL: https://codereview.chromium.org/207443007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@258740 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/common/gpu/image_transport_surface_mac.cc | 9 | ||||
-rw-r--r-- | content/common/gpu/texture_image_transport_surface.cc | 7 | ||||
-rw-r--r-- | content/common/gpu/texture_image_transport_surface.h | 2 | ||||
-rw-r--r-- | gpu/command_buffer/service/gl_surface_mock.h | 2 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 17 | ||||
-rw-r--r-- | gpu/config/gpu_driver_bug_list_json.cc | 13 | ||||
-rw-r--r-- | gpu/config/gpu_driver_bug_workaround_type.h | 2 | ||||
-rw-r--r-- | ui/gl/gl_surface.cc | 18 | ||||
-rw-r--r-- | ui/gl/gl_surface.h | 9 | ||||
-rw-r--r-- | ui/gl/gl_surface_egl.cc | 9 | ||||
-rw-r--r-- | ui/gl/gl_surface_egl.h | 2 | ||||
-rw-r--r-- | ui/gl/gl_surface_glx.cc | 9 | ||||
-rw-r--r-- | ui/gl/gl_surface_glx.h | 2 | ||||
-rw-r--r-- | ui/gl/gl_surface_win.cc | 9 | ||||
-rw-r--r-- | ui/gl/gl_surface_x11.cc | 9 |
15 files changed, 52 insertions, 67 deletions
diff --git a/content/common/gpu/image_transport_surface_mac.cc b/content/common/gpu/image_transport_surface_mac.cc index 615c7d0..254d747 100644 --- a/content/common/gpu/image_transport_surface_mac.cc +++ b/content/common/gpu/image_transport_surface_mac.cc @@ -50,7 +50,7 @@ class IOSurfaceImageTransportSurface virtual bool IsOffscreen() OVERRIDE; virtual bool SwapBuffers() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; - virtual std::string GetExtensions() OVERRIDE; + virtual bool SupportsPostSubBuffer() OVERRIDE; virtual gfx::Size GetSize() OVERRIDE; virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; @@ -281,11 +281,8 @@ bool IOSurfaceImageTransportSurface::PostSubBuffer( return true; } -std::string IOSurfaceImageTransportSurface::GetExtensions() { - std::string extensions = gfx::GLSurface::GetExtensions(); - extensions += extensions.empty() ? "" : " "; - extensions += "GL_CHROMIUM_post_sub_buffer"; - return extensions; +bool IOSurfaceImageTransportSurface::SupportsPostSubBuffer() { + return true; } gfx::Size IOSurfaceImageTransportSurface::GetSize() { diff --git a/content/common/gpu/texture_image_transport_surface.cc b/content/common/gpu/texture_image_transport_surface.cc index 3de0647..45ce615 100644 --- a/content/common/gpu/texture_image_transport_surface.cc +++ b/content/common/gpu/texture_image_transport_surface.cc @@ -268,11 +268,8 @@ bool TextureImageTransportSurface::PostSubBuffer( return true; } -std::string TextureImageTransportSurface::GetExtensions() { - std::string extensions = gfx::GLSurface::GetExtensions(); - extensions += extensions.empty() ? "" : " "; - extensions += "GL_CHROMIUM_post_sub_buffer"; - return extensions; +bool TextureImageTransportSurface::SupportsPostSubBuffer() { + return true; } gfx::Size TextureImageTransportSurface::GetSize() { diff --git a/content/common/gpu/texture_image_transport_surface.h b/content/common/gpu/texture_image_transport_surface.h index a86ff27..95b75a5 100644 --- a/content/common/gpu/texture_image_transport_surface.h +++ b/content/common/gpu/texture_image_transport_surface.h @@ -37,7 +37,7 @@ class TextureImageTransportSurface virtual gfx::Size GetSize() OVERRIDE; virtual void* GetHandle() OVERRIDE; virtual unsigned GetFormat() OVERRIDE; - virtual std::string GetExtensions() OVERRIDE; + virtual bool SupportsPostSubBuffer() OVERRIDE; virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; virtual bool SetBackbufferAllocation(bool allocated) OVERRIDE; diff --git a/gpu/command_buffer/service/gl_surface_mock.h b/gpu/command_buffer/service/gl_surface_mock.h index 372a9b3..0652be6 100644 --- a/gpu/command_buffer/service/gl_surface_mock.h +++ b/gpu/command_buffer/service/gl_surface_mock.h @@ -20,7 +20,7 @@ class GLSurfaceMock : public gfx::GLSurface { MOCK_METHOD0(IsOffscreen, bool()); MOCK_METHOD0(SwapBuffers, bool()); MOCK_METHOD4(PostSubBuffer, bool(int x, int y, int width, int height)); - MOCK_METHOD0(GetExtensions, std::string()); + MOCK_METHOD0(SupportsPostSubBuffer, bool()); MOCK_METHOD0(GetSize, gfx::Size()); MOCK_METHOD0(GetHandle, void*()); MOCK_METHOD0(GetBackingFrameBufferObject, unsigned int()); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 9eadd75..16ffd96 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -1706,6 +1706,7 @@ class GLES2DecoderImpl : public GLES2Decoder, bool has_robustness_extension_; GLenum reset_status_; bool reset_by_robustness_extension_; + bool supports_post_sub_buffer_; // These flags are used to override the state of the shared feature_info_ // member. Because the same FeatureInfo instance may be shared among many @@ -2211,6 +2212,7 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group) has_robustness_extension_(false), reset_status_(GL_NO_ERROR), reset_by_robustness_extension_(false), + supports_post_sub_buffer_(false), force_webgl_glsl_validation_(false), derivatives_explicitly_enabled_(false), frag_depth_explicitly_enabled_(false), @@ -2571,6 +2573,12 @@ bool GLES2DecoderImpl::Initialize( glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } + supports_post_sub_buffer_ = surface->SupportsPostSubBuffer(); + if (feature_info_->workarounds() + .disable_post_sub_buffers_for_onscreen_surfaces && + !surface->IsOffscreen()) + supports_post_sub_buffer_ = false; + if (feature_info_->workarounds().reverse_point_sprite_coord_origin) { glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT); } @@ -2623,7 +2631,7 @@ Capabilities GLES2DecoderImpl::GetCapabilities() { caps.iosurface = true; #endif - caps.post_sub_buffer = surface_->HasExtension("GL_CHROMIUM_post_sub_buffer"); + caps.post_sub_buffer = supports_post_sub_buffer_; return caps; } @@ -7437,7 +7445,7 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( uint32 immediate_data_size, const cmds::PostSubBufferCHROMIUM& c) { TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandlePostSubBufferCHROMIUM"); - if (!surface_->HasExtension("GL_CHROMIUM_post_sub_buffer")) { + if (!supports_post_sub_buffer_) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glPostSubBufferCHROMIUM", "command not supported by surface"); @@ -7631,9 +7639,8 @@ error::Error GLES2DecoderImpl::HandleGetString( } else { extensions = feature_info_->extensions().c_str(); } - std::string surface_extensions = surface_->GetExtensions(); - if (!surface_extensions.empty()) - extensions += " " + surface_extensions; + if (supports_post_sub_buffer_) + extensions += " GL_CHROMIUM_post_sub_buffer"; str = extensions.c_str(); } break; diff --git a/gpu/config/gpu_driver_bug_list_json.cc b/gpu/config/gpu_driver_bug_list_json.cc index 8d1f98f..08febf0 100644 --- a/gpu/config/gpu_driver_bug_list_json.cc +++ b/gpu/config/gpu_driver_bug_list_json.cc @@ -19,7 +19,7 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST( { "name": "gpu driver bug list", // Please update the version number whenever you change this file. - "version": "4.7", + "version": "4.8", "entries": [ { "id": 1, @@ -908,6 +908,17 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST( "features": [ "force_gl_finish_after_compositing" ] + }, + { + "id": 68, + "description": "Disable partial swaps on linux drivers", + "cr_bugs": [339493], + "os": { + "type": "linux" + }, + "features": [ + "disable_post_sub_buffers_for_onscreen_surfaces" + ] } ] } diff --git a/gpu/config/gpu_driver_bug_workaround_type.h b/gpu/config/gpu_driver_bug_workaround_type.h index 922d971..85776e2 100644 --- a/gpu/config/gpu_driver_bug_workaround_type.h +++ b/gpu/config/gpu_driver_bug_workaround_type.h @@ -36,6 +36,8 @@ disable_multisampling) \ GPU_OP(DISABLE_OES_STANDARD_DERIVATIVES, \ disable_oes_standard_derivatives) \ + GPU_OP(DISABLE_POST_SUB_BUFFERS_FOR_ONSCREEN_SURFACES, \ + disable_post_sub_buffers_for_onscreen_surfaces) \ GPU_OP(ENABLE_CHROMIUM_FAST_NPOT_MO8_TEXTURES, \ enable_chromium_fast_npot_mo8_textures) \ GPU_OP(EXIT_ON_CONTEXT_LOST, \ diff --git a/ui/gl/gl_surface.cc b/ui/gl/gl_surface.cc index 5d35b33..4e74f49 100644 --- a/ui/gl/gl_surface.cc +++ b/ui/gl/gl_surface.cc @@ -177,18 +177,8 @@ bool GLSurface::DeferDraws() { return false; } -std::string GLSurface::GetExtensions() { - return std::string(); -} - -bool GLSurface::HasExtension(const char* name) { - std::string extensions = GetExtensions(); - extensions += " "; - - std::string delimited_name(name); - delimited_name += " "; - - return extensions.find(delimited_name) != std::string::npos; +bool GLSurface::SupportsPostSubBuffer() { + return false; } unsigned int GLSurface::GetBackingFrameBufferObject() { @@ -294,8 +284,8 @@ bool GLSurfaceAdapter::PostSubBuffer(int x, int y, int width, int height) { return surface_->PostSubBuffer(x, y, width, height); } -std::string GLSurfaceAdapter::GetExtensions() { - return surface_->GetExtensions(); +bool GLSurfaceAdapter::SupportsPostSubBuffer() { + return surface_->SupportsPostSubBuffer(); } gfx::Size GLSurfaceAdapter::GetSize() { diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h index f7a02f0..70336ba 100644 --- a/ui/gl/gl_surface.h +++ b/ui/gl/gl_surface.h @@ -57,11 +57,8 @@ class GL_EXPORT GLSurface : public base::RefCounted<GLSurface> { // Get the underlying platform specific surface "handle". virtual void* GetHandle() = 0; - // Returns space separated list of surface specific extensions. - // The surface must be current. - virtual std::string GetExtensions(); - - bool HasExtension(const char* name); + // Returns whether or not the surface supports PostSubBuffer. + virtual bool SupportsPostSubBuffer(); // Returns the internal frame buffer object name if the surface is backed by // FBO. Otherwise returns 0. @@ -147,7 +144,7 @@ class GL_EXPORT GLSurfaceAdapter : public GLSurface { virtual bool IsOffscreen() OVERRIDE; virtual bool SwapBuffers() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; - virtual std::string GetExtensions() OVERRIDE; + virtual bool SupportsPostSubBuffer() OVERRIDE; virtual gfx::Size GetSize() OVERRIDE; virtual void* GetHandle() OVERRIDE; virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc index a2beccd..568c74a 100644 --- a/ui/gl/gl_surface_egl.cc +++ b/ui/gl/gl_surface_egl.cc @@ -559,13 +559,8 @@ EGLSurface NativeViewGLSurfaceEGL::GetHandle() { return surface_; } -std::string NativeViewGLSurfaceEGL::GetExtensions() { - std::string extensions = GLSurface::GetExtensions(); - if (supports_post_sub_buffer_) { - extensions += extensions.empty() ? "" : " "; - extensions += "GL_CHROMIUM_post_sub_buffer"; - } - return extensions; +bool NativeViewGLSurfaceEGL::SupportsPostSubBuffer() { + return supports_post_sub_buffer_; } bool NativeViewGLSurfaceEGL::PostSubBuffer( diff --git a/ui/gl/gl_surface_egl.h b/ui/gl/gl_surface_egl.h index 73ec213..ae132e6 100644 --- a/ui/gl/gl_surface_egl.h +++ b/ui/gl/gl_surface_egl.h @@ -62,7 +62,7 @@ class GL_EXPORT NativeViewGLSurfaceEGL : public GLSurfaceEGL { virtual bool SwapBuffers() OVERRIDE; virtual gfx::Size GetSize() OVERRIDE; virtual EGLSurface GetHandle() OVERRIDE; - virtual std::string GetExtensions() OVERRIDE; + virtual bool SupportsPostSubBuffer() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; virtual VSyncProvider* GetVSyncProvider() OVERRIDE; diff --git a/ui/gl/gl_surface_glx.cc b/ui/gl/gl_surface_glx.cc index b08a5d0..17a481a 100644 --- a/ui/gl/gl_surface_glx.cc +++ b/ui/gl/gl_surface_glx.cc @@ -615,13 +615,8 @@ void* NativeViewGLSurfaceGLX::GetHandle() { return reinterpret_cast<void*>(GetDrawableHandle()); } -std::string NativeViewGLSurfaceGLX::GetExtensions() { - std::string extensions = GLSurface::GetExtensions(); - if (gfx::g_driver_glx.ext.b_GLX_MESA_copy_sub_buffer) { - extensions += extensions.empty() ? "" : " "; - extensions += "GL_CHROMIUM_post_sub_buffer"; - } - return extensions; +bool NativeViewGLSurfaceGLX::SupportsPostSubBuffer() { + return gfx::g_driver_glx.ext.b_GLX_MESA_copy_sub_buffer; } void* NativeViewGLSurfaceGLX::GetConfig() { diff --git a/ui/gl/gl_surface_glx.h b/ui/gl/gl_surface_glx.h index c41f4ef..f9bff2b 100644 --- a/ui/gl/gl_surface_glx.h +++ b/ui/gl/gl_surface_glx.h @@ -60,7 +60,7 @@ class GL_EXPORT NativeViewGLSurfaceGLX : public GLSurfaceGLX { virtual bool SwapBuffers() OVERRIDE; virtual gfx::Size GetSize() OVERRIDE; virtual void* GetHandle() OVERRIDE; - virtual std::string GetExtensions() OVERRIDE; + virtual bool SupportsPostSubBuffer() OVERRIDE; virtual void* GetConfig() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; virtual VSyncProvider* GetVSyncProvider() OVERRIDE; diff --git a/ui/gl/gl_surface_win.cc b/ui/gl/gl_surface_win.cc index 6307f14..494c7b0 100644 --- a/ui/gl/gl_surface_win.cc +++ b/ui/gl/gl_surface_win.cc @@ -33,7 +33,7 @@ class NativeViewGLSurfaceOSMesa : public GLSurfaceOSMesa { virtual void Destroy() OVERRIDE; virtual bool IsOffscreen() OVERRIDE; virtual bool SwapBuffers() OVERRIDE; - virtual std::string GetExtensions() OVERRIDE; + virtual bool SupportsPostSubBuffer() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; private: @@ -171,11 +171,8 @@ bool NativeViewGLSurfaceOSMesa::SwapBuffers() { return true; } -std::string NativeViewGLSurfaceOSMesa::GetExtensions() { - std::string extensions = gfx::GLSurfaceOSMesa::GetExtensions(); - extensions += extensions.empty() ? "" : " "; - extensions += "GL_CHROMIUM_post_sub_buffer"; - return extensions; +bool NativeViewGLSurfaceOSMesa::SupportsPostSubBuffer() { + return true; } bool NativeViewGLSurfaceOSMesa::PostSubBuffer( diff --git a/ui/gl/gl_surface_x11.cc b/ui/gl/gl_surface_x11.cc index 54c7f43..cde04f1 100644 --- a/ui/gl/gl_surface_x11.cc +++ b/ui/gl/gl_surface_x11.cc @@ -32,7 +32,7 @@ class NativeViewGLSurfaceOSMesa : public GLSurfaceOSMesa { virtual bool Resize(const gfx::Size& new_size) OVERRIDE; virtual bool IsOffscreen() OVERRIDE; virtual bool SwapBuffers() OVERRIDE; - virtual std::string GetExtensions() OVERRIDE; + virtual bool SupportsPostSubBuffer() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; protected: @@ -218,11 +218,8 @@ bool NativeViewGLSurfaceOSMesa::SwapBuffers() { return true; } -std::string NativeViewGLSurfaceOSMesa::GetExtensions() { - std::string extensions = gfx::GLSurfaceOSMesa::GetExtensions(); - extensions += extensions.empty() ? "" : " "; - extensions += "GL_CHROMIUM_post_sub_buffer"; - return extensions; +bool NativeViewGLSurfaceOSMesa::SupportsPostSubBuffer() { + return true; } bool NativeViewGLSurfaceOSMesa::PostSubBuffer( |