diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-24 15:43:19 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-24 15:43:19 +0000 |
commit | 1743af3b377f4e37b666b4badb6113a104f6fbc1 (patch) | |
tree | 53d4d4f56f63ad7953c76ebfefcd5b27f9fe6a59 | |
parent | cdbfffe2ada95679b3274a2f39d3cd371b76cdc7 (diff) | |
download | chromium_src-1743af3b377f4e37b666b4badb6113a104f6fbc1.zip chromium_src-1743af3b377f4e37b666b4badb6113a104f6fbc1.tar.gz chromium_src-1743af3b377f4e37b666b4badb6113a104f6fbc1.tar.bz2 |
Plumb thru that we cache the front buffer.
This allows us to drop the root layer textures and save on VRAM (10 MB on a 30" display).
WebKit side patch: https://bugs.webkit.org/show_bug.cgi?id=72956
BUG=none
TEST='cat /proc/meminfo | grep Shmem' on Intel graphics and use_aura=1 attached to 30" display
Review URL: http://codereview.chromium.org/8637014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@111532 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/common/gpu/image_transport_surface_linux.cc | 24 | ||||
-rw-r--r-- | content/common/gpu/image_transport_surface_mac.cc | 17 | ||||
-rw-r--r-- | content/common/gpu/image_transport_surface_win.cc | 25 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info.cc | 4 | ||||
-rw-r--r-- | third_party/khronos/GLES2/gl2ext.h | 10 |
5 files changed, 68 insertions, 12 deletions
diff --git a/content/common/gpu/image_transport_surface_linux.cc b/content/common/gpu/image_transport_surface_linux.cc index e106a9f..10ceae2 100644 --- a/content/common/gpu/image_transport_surface_linux.cc +++ b/content/common/gpu/image_transport_surface_linux.cc @@ -62,7 +62,7 @@ class EGLImageTransportSurface : public ImageTransportSurface, int32 renderer_id, int32 command_buffer_id); - // GLSurface implementation + // gfx::GLSurface implementation virtual bool Initialize() OVERRIDE; virtual void Destroy() OVERRIDE; virtual bool IsOffscreen() OVERRIDE; @@ -115,6 +115,7 @@ class GLXImageTransportSurface : public ImageTransportSurface, virtual void Destroy() OVERRIDE; virtual bool SwapBuffers() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; + virtual std::string GetExtensions(); virtual gfx::Size GetSize() OVERRIDE; virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; virtual void SetVisible(bool visible) OVERRIDE; @@ -254,7 +255,7 @@ EGLImageTransportSurface::~EGLImageTransportSurface() { bool EGLImageTransportSurface::Initialize() { if (!helper_->Initialize()) return false; - return PbufferGLSurfaceEGL::Initialize(); + return gfx::PbufferGLSurfaceEGL::Initialize(); } void EGLImageTransportSurface::Destroy() { @@ -264,7 +265,7 @@ void EGLImageTransportSurface::Destroy() { ReleaseSurface(&front_surface_); helper_->Destroy(); - PbufferGLSurfaceEGL::Destroy(); + gfx::PbufferGLSurfaceEGL::Destroy(); } // Make sure that buffer swaps occur for the surface, so we can send the data @@ -378,7 +379,10 @@ bool EGLImageTransportSurface::PostSubBuffer( } std::string EGLImageTransportSurface::GetExtensions() { - return GLSurface::GetExtensions(); + std::string extensions = gfx::GLSurface::GetExtensions(); + extensions += extensions.empty() ? "" : " "; + extensions += "GL_CHROMIUM_front_buffer_cached"; + return extensions; } gfx::Size EGLImageTransportSurface::GetSize() { @@ -562,6 +566,13 @@ bool GLXImageTransportSurface::PostSubBuffer( return true; } +std::string GLXImageTransportSurface::GetExtensions() { + std::string extensions = gfx::NativeViewGLSurfaceGLX::GetExtensions(); + extensions += extensions.empty() ? "" : " "; + extensions += "GL_CHROMIUM_front_buffer_cached"; + return extensions; +} + gfx::Size GLXImageTransportSurface::GetSize() { return size_; } @@ -708,7 +719,10 @@ bool OSMesaImageTransportSurface::PostSubBuffer( } std::string OSMesaImageTransportSurface::GetExtensions() { - return GLSurface::GetExtensions(); + std::string extensions = gfx::GLSurface::GetExtensions(); + extensions += extensions.empty() ? "" : " "; + extensions += "GL_CHROMIUM_front_buffer_cached"; + return extensions; } void OSMesaImageTransportSurface::OnBuffersSwappedACK() { diff --git a/content/common/gpu/image_transport_surface_mac.cc b/content/common/gpu/image_transport_surface_mac.cc index b7d9676..91af588 100644 --- a/content/common/gpu/image_transport_surface_mac.cc +++ b/content/common/gpu/image_transport_surface_mac.cc @@ -89,6 +89,7 @@ class TransportDIBImageTransportSurface : public gfx::PbufferGLSurfaceCGL, virtual void Destroy() OVERRIDE; 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 gfx::Size GetSize() OVERRIDE; virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; @@ -238,7 +239,10 @@ bool IOSurfaceImageTransportSurface::PostSubBuffer( } std::string IOSurfaceImageTransportSurface::GetExtensions() { - return gfx::GLSurface::GetExtensions(); + std::string extensions = gfx::GLSurface::GetExtensions(); + extensions += extensions.empty() ? "" : " "; + extensions += "GL_CHROMIUM_front_buffer_cached"; + return extensions; } gfx::Size IOSurfaceImageTransportSurface::GetSize() { @@ -451,8 +455,17 @@ bool TransportDIBImageTransportSurface::SwapBuffers() { return true; } +bool TransportDIBImageTransportSurface::PostSubBuffer( + int x, int y, int width, int height) { + NOTREACHED(); + return false; +} + std::string TransportDIBImageTransportSurface::GetExtensions() { - return gfx::GLSurface::GetExtensions(); + std::string extensions = gfx::GLSurface::GetExtensions(); + extensions += extensions.empty() ? "" : " "; + extensions += "GL_CHROMIUM_front_buffer_cached"; + return extensions; } gfx::Size TransportDIBImageTransportSurface::GetSize() { diff --git a/content/common/gpu/image_transport_surface_win.cc b/content/common/gpu/image_transport_surface_win.cc index f3eb9d5a..a33c466 100644 --- a/content/common/gpu/image_transport_surface_win.cc +++ b/content/common/gpu/image_transport_surface_win.cc @@ -32,11 +32,13 @@ class PbufferImageTransportSurface int32 renderer_id, int32 command_buffer_id); - // GLSurface implementation - virtual bool Initialize(); - virtual void Destroy(); - virtual bool IsOffscreen(); - virtual bool SwapBuffers(); + // gfx::GLSurface implementation + virtual bool Initialize() OVERRIDE; + virtual void Destroy() OVERRIDE; + 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; protected: // ImageTransportSurface implementation @@ -109,6 +111,19 @@ bool PbufferImageTransportSurface::SwapBuffers() { return true; } +bool PbufferImageTransportSurface::PostSubBuffer( + int x, int y, int width, int height) { + NOTREACHED(); + return false; +} + +std::string PbufferImageTransportSurface::GetExtensions() { + std::string extensions = gfx::GLSurface::GetExtensions(); + extensions += extensions.empty() ? "" : " "; + extensions += "GL_CHROMIUM_front_buffer_cached"; + return extensions; +} + void PbufferImageTransportSurface::SendBuffersSwapped() { GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; params.surface_id = reinterpret_cast<int64>(GetShareHandle()); diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index 66c05a8..ea74412 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc @@ -393,6 +393,10 @@ void FeatureInfo::AddFeatures(const char* desired_features) { if (ext.HaveAndDesire("GL_CHROMIUM_post_sub_buffer")) { AddExtensionString("GL_CHROMIUM_post_sub_buffer"); } + + if (ext.HaveAndDesire("GL_CHROMIUM_front_buffer_cached")) { + AddExtensionString("GL_CHROMIUM_front_buffer_cached"); + } } void FeatureInfo::AddExtensionString(const std::string& str) { diff --git a/third_party/khronos/GLES2/gl2ext.h b/third_party/khronos/GLES2/gl2ext.h index 4ddf729..f1a49dc 100644 --- a/third_party/khronos/GLES2/gl2ext.h +++ b/third_party/khronos/GLES2/gl2ext.h @@ -1366,6 +1366,16 @@ typedef void (GL_APIENTRYP PFNGLPOSTSUBBUFFERCHROMIUM) (GLint x, GLint y, GLint #endif #endif +/* GL_CHROMIUM_front_buffer_cached */ +/* This extension implies that there is a cache of the front buffer of the + * surface supporting this extension (e.g. on OSX the front buffer + * is often backed by an IOSurface). Hence we do not need to redraw + * (via a SwapBuffers) in order to display the last frame. + */ +#ifndef GL_CHROMIUM_front_buffer_cached +#define GL_CHROMIUM_front_buffer_cached 1 +#endif + /* GL_ARB_robustness */ /* This extension is subsetted for the moment, incorporating only the * enums necessary to describe the reasons that we might encounter for |