Index: content/browser/renderer_host/render_widget_host_view_mac.h |
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h |
index 5380fa73d24e74e1e84aef066d42a5f8a0905c10..181784138bb9a7defcdf01ac1dfa009623742ccc 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_mac.h |
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h |
@@ -16,6 +16,7 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/memory/weak_ptr.h" |
#include "base/time/time.h" |
+#include "content/browser/compositor/browser_compositor_view_mac.h" |
#include "content/browser/compositor/delegated_frame_host.h" |
#include "content/browser/renderer_host/compositing_iosurface_layer_mac.h" |
#include "content/browser/renderer_host/display_link_mac.h" |
@@ -213,6 +214,7 @@ class CONTENT_EXPORT RenderWidgetHostViewMac |
public DelegatedFrameHostClient, |
public IPC::Sender, |
public SoftwareFrameManagerClient, |
+ public BrowserCompositorViewMacClient, |
public CompositingIOSurfaceLayerClient { |
public: |
// The view will associate itself with the given widget. The native view must |
@@ -343,6 +345,9 @@ class CONTENT_EXPORT RenderWidgetHostViewMac |
virtual SkBitmap::Config PreferredReadbackFormat() OVERRIDE; |
+ // BrowserCompositorViewMacHelper implementation. |
+ virtual void BrowserCompositorDidDrawFrame() OVERRIDE; |
+ |
// CompositingIOSurfaceLayerClient implementation. |
virtual void AcceleratedLayerDidDrawFrame(bool succeeded) OVERRIDE; |
@@ -448,6 +453,12 @@ class CONTENT_EXPORT RenderWidgetHostViewMac |
scoped_ptr<DelegatedFrameHost> delegated_frame_host_; |
scoped_ptr<ui::Layer> root_layer_; |
+ // This lock is taken when the browser compositor produces a frame, and is |
+ // released when that frame is displayed. It is by this mechanism that the |
+ // browser compositor can exert GPU backpressure on the renderer compositor. |
+ scoped_refptr<ui::CompositorLock> browser_compositor_lock_; |
+ bool browser_compositor_damaged_during_lock_; |
+ |
// This holds the current software compositing framebuffer, if any. |
scoped_ptr<SoftwareFrameManager> software_frame_manager_; |
@@ -518,6 +529,8 @@ class CONTENT_EXPORT RenderWidgetHostViewMac |
virtual RenderWidgetHostImpl* GetHost() OVERRIDE; |
virtual void SchedulePaintInRect( |
const gfx::Rect& damage_rect_in_dip) OVERRIDE; |
+ virtual void DelegatedCompositorDidSwapBuffers() OVERRIDE; |
+ virtual void DelegatedCompositorAbortedSwapBuffers() OVERRIDE; |
virtual bool IsVisible() OVERRIDE; |
virtual scoped_ptr<ResizeLock> CreateResizeLock( |
bool defer_compositor_lock) OVERRIDE; |
@@ -590,6 +603,12 @@ class CONTENT_EXPORT RenderWidgetHostViewMac |
// Send updated vsync parameters to the renderer. |
void SendVSyncParametersToRenderer(); |
+ // Release the browser compositor lock, and request another frame from the |
+ // browser compositor. Because this can be requested from inside compositor |
+ // calbacks, post it as task instead of calling it directly. |
+ void PostReleaseBrowserCompositorLock(); |
+ void ReleaseBrowserCompositorLock(); |
+ |
// The associated view. This is weak and is inserted into the view hierarchy |
// to own this RenderWidgetHostViewMac object. Set to nil at the start of the |
// destructor. |