Index: content/browser/renderer_host/render_widget_host_view_mac.mm |
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm |
index 35109e793820e9a8f79a4c2bab1c265e9c6b882e..0fd304e71da38d26002045e5f79f83bf7aed0389 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
@@ -27,7 +27,6 @@ |
#include "base/sys_info.h" |
#import "content/browser/accessibility/browser_accessibility_cocoa.h" |
#include "content/browser/accessibility/browser_accessibility_manager_mac.h" |
-#include "content/browser/compositor/browser_compositor_view_mac.h" |
#include "content/browser/compositor/resize_lock.h" |
#include "content/browser/frame_host/frame_tree.h" |
#include "content/browser/frame_host/frame_tree_node.h" |
@@ -424,7 +423,30 @@ RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { |
void RenderWidgetHostViewMac::SchedulePaintInRect( |
const gfx::Rect& damage_rect_in_dip) { |
- [browser_compositor_view_ compositor]->Draw(); |
+ if (browser_compositor_lock_) |
+ browser_compositor_damaged_during_lock_ = true; |
+ else |
+ [browser_compositor_view_ compositor]->ScheduleFullRedraw(); |
+} |
+ |
+void RenderWidgetHostViewMac::DelegatedCompositorDidSwapBuffers() { |
+ // If this view is not visible then do not lock the compositor, because the |
+ // wait for the surface to be drawn will time out. |
+ NSWindow* window = [cocoa_view_ window]; |
+ if (!window) |
+ return; |
+ if (window && [window respondsToSelector:@selector(occlusionState)]) { |
+ bool window_is_occluded = |
+ !([window occlusionState] & NSWindowOcclusionStateVisible); |
+ if (window_is_occluded) |
+ return; |
+ } |
+ browser_compositor_lock_ = |
+ [browser_compositor_view_ compositor]->GetCompositorLock(); |
+} |
+ |
+void RenderWidgetHostViewMac::DelegatedCompositorAbortedSwapBuffers() { |
+ PostReleaseBrowserCompositorLock(); |
} |
bool RenderWidgetHostViewMac::IsVisible() { |
@@ -509,10 +531,6 @@ RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { |
// pointer. |
cocoa_view_ = nil; |
- // Delete the delegated frame state. |
- delegated_frame_host_.reset(); |
- root_layer_.reset(); |
- |
UnlockMouse(); |
// Make sure that the layer doesn't reach into the now-invalid object. |
@@ -824,6 +842,23 @@ void RenderWidgetHostViewMac::UpdateDisplayLink() { |
} |
} |
+void RenderWidgetHostViewMac::PostReleaseBrowserCompositorLock() { |
+ base::MessageLoop::current()->PostTask(FROM_HERE, |
+ base::Bind(&RenderWidgetHostViewMac::ReleaseBrowserCompositorLock, |
+ weak_factory_.GetWeakPtr())); |
+} |
+ |
+void RenderWidgetHostViewMac::ReleaseBrowserCompositorLock() { |
+ if (!browser_compositor_view_) |
+ return; |
+ |
+ browser_compositor_lock_ = NULL; |
+ if (browser_compositor_damaged_during_lock_) { |
+ browser_compositor_damaged_during_lock_ = false; |
+ [browser_compositor_view_ compositor]->ScheduleFullRedraw(); |
+ } |
+} |
+ |
void RenderWidgetHostViewMac::SendVSyncParametersToRenderer() { |
if (!render_widget_host_ || !display_link_) |
return; |
@@ -880,6 +915,7 @@ void RenderWidgetHostViewMac::WasHidden() { |
// Any pending frames will not be displayed until this is shown again. Ack |
// them now. |
SendPendingSwapAck(); |
+ PostReleaseBrowserCompositorLock(); |
// If we have a renderer, then inform it that we are being hidden so it can |
// reduce its resource utilization. |
@@ -1104,6 +1140,13 @@ void RenderWidgetHostViewMac::Destroy() { |
// object needs to survive until the stack unwinds. |
pepper_fullscreen_window_.autorelease(); |
+ // Delete the delegated frame state, which will reach back into |
+ // render_widget_host_. |
+ browser_compositor_lock_ = NULL; |
+ [browser_compositor_view_ resetClient]; |
+ delegated_frame_host_.reset(); |
+ root_layer_.reset(); |
+ |
// We get this call just before |render_widget_host_| deletes |
// itself. But we are owned by |cocoa_view_|, which may be retained |
// by some other code. Examples are WebContentsViewMac's |
@@ -1892,8 +1935,8 @@ void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
if (frame->delegated_frame_data) { |
if (!browser_compositor_view_) { |
- browser_compositor_view_.reset( |
- [[BrowserCompositorViewMac alloc] initWithSuperview:cocoa_view_]); |
+ browser_compositor_view_.reset([[BrowserCompositorViewMac alloc] |
+ initWithSuperview:cocoa_view_ withClient:this]); |
root_layer_.reset(new ui::Layer(ui::LAYER_TEXTURED)); |
delegated_frame_host_.reset(new DelegatedFrameHost(this)); |
[browser_compositor_view_ compositor]->SetRootLayer(root_layer_.get()); |
@@ -2471,6 +2514,13 @@ SkBitmap::Config RenderWidgetHostViewMac::PreferredReadbackFormat() { |
} |
//////////////////////////////////////////////////////////////////////////////// |
+// BrowserCompositorViewMacClient, public: |
+ |
+void RenderWidgetHostViewMac::BrowserCompositorDidDrawFrame() { |
+ PostReleaseBrowserCompositorLock(); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
// CompositingIOSurfaceLayerClient, public: |
void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { |