summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-24 15:43:19 +0000
committerbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-24 15:43:19 +0000
commit1743af3b377f4e37b666b4badb6113a104f6fbc1 (patch)
tree53d4d4f56f63ad7953c76ebfefcd5b27f9fe6a59
parentcdbfffe2ada95679b3274a2f39d3cd371b76cdc7 (diff)
downloadchromium_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.cc24
-rw-r--r--content/common/gpu/image_transport_surface_mac.cc17
-rw-r--r--content/common/gpu/image_transport_surface_win.cc25
-rw-r--r--gpu/command_buffer/service/feature_info.cc4
-rw-r--r--third_party/khronos/GLES2/gl2ext.h10
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