| 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) {
|
|
|