| 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 ce23b6606b2b03fb7e22278db70c37be14916e30..b77140a14ba4e18fae899fb62dcfbeac92d8adf9 100644
|
| --- a/content/browser/renderer_host/render_widget_host_view_mac.mm
|
| +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
|
| @@ -434,6 +434,9 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget)
|
| }
|
|
|
| render_widget_host_->SetView(this);
|
| + render_widget_host_->SetAboutToWaitForBackingStoreCallback(
|
| + base::Bind(&RenderWidgetHostViewMac::SendPendingSwapAck,
|
| + weak_factory_.GetWeakPtr()));
|
| }
|
|
|
| RenderWidgetHostViewMac::~RenderWidgetHostViewMac() {
|
| @@ -574,6 +577,9 @@ bool RenderWidgetHostViewMac::CreateCompositedIOSurfaceLayer() {
|
|
|
| void RenderWidgetHostViewMac::DestroyCompositedIOSurfaceAndLayer(
|
| DestroyContextBehavior destroy_context_behavior) {
|
| + // Any pending frames will not be displayed, so ack them now.
|
| + SendPendingSwapAck();
|
| +
|
| ScopedCAActionDisabler disabler;
|
|
|
| compositing_iosurface_.reset();
|
| @@ -748,6 +754,10 @@ void RenderWidgetHostViewMac::WasHidden() {
|
| if (render_widget_host_->is_hidden())
|
| return;
|
|
|
| + // Any pending frames will not be displayed until this is shown again. Ack
|
| + // them now.
|
| + SendPendingSwapAck();
|
| +
|
| // If we have a renderer, then inform it that we are being hidden so it can
|
| // reduce its resource utilization.
|
| render_widget_host_->WasHidden();
|
| @@ -1321,6 +1331,7 @@ void RenderWidgetHostViewMac::CompositorSwapBuffers(
|
| compositing_iosurface_->CopyToVideoFrame(
|
| gfx::Rect(size), frame,
|
| base::Bind(callback, present_time));
|
| + SendPendingSwapAck();
|
| return;
|
| }
|
| }
|
| @@ -1475,6 +1486,7 @@ bool RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() {
|
| }
|
|
|
| SendPendingLatencyInfoToHost();
|
| + SendPendingSwapAck();
|
| return true;
|
| }
|
|
|
| @@ -1652,19 +1664,14 @@ void RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped(
|
| "RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped");
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| + AddPendingSwapAck(params.route_id,
|
| + gpu_host_id,
|
| + compositing_iosurface_ ?
|
| + compositing_iosurface_->GetRendererID() : 0);
|
| CompositorSwapBuffers(params.surface_handle,
|
| params.size,
|
| params.scale_factor,
|
| params.latency_info);
|
| -
|
| - AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
|
| - ack_params.sync_point = 0;
|
| - ack_params.renderer_id = compositing_iosurface_ ?
|
| - compositing_iosurface_->GetRendererID() : 0;
|
| - RenderWidgetHostImpl::AcknowledgeBufferPresent(params.route_id,
|
| - gpu_host_id,
|
| - ack_params);
|
| - render_widget_host_->AcknowledgeSwapBuffersToRenderer();
|
| }
|
|
|
| void RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer(
|
| @@ -1674,19 +1681,14 @@ void RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer(
|
| "RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer");
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| + AddPendingSwapAck(params.route_id,
|
| + gpu_host_id,
|
| + compositing_iosurface_ ?
|
| + compositing_iosurface_->GetRendererID() : 0);
|
| CompositorSwapBuffers(params.surface_handle,
|
| params.surface_size,
|
| params.surface_scale_factor,
|
| params.latency_info);
|
| -
|
| - AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
|
| - ack_params.sync_point = 0;
|
| - ack_params.renderer_id = compositing_iosurface_ ?
|
| - compositing_iosurface_->GetRendererID() : 0;
|
| - RenderWidgetHostImpl::AcknowledgeBufferPresent(params.route_id,
|
| - gpu_host_id,
|
| - ack_params);
|
| - render_widget_host_->AcknowledgeSwapBuffersToRenderer();
|
| }
|
|
|
| void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() {
|
| @@ -2060,6 +2062,29 @@ void RenderWidgetHostViewMac::TickPendingLatencyInfoDelay() {
|
| [compositing_iosurface_layer_ setNeedsDisplay];
|
| }
|
|
|
| +void RenderWidgetHostViewMac::AddPendingSwapAck(
|
| + int32 route_id, int gpu_host_id, int32 renderer_id) {
|
| + DCHECK(!pending_swap_ack_);
|
| + pending_swap_ack_.reset(new PendingSwapAck(
|
| + route_id, gpu_host_id, renderer_id));
|
| +}
|
| +
|
| +void RenderWidgetHostViewMac::SendPendingSwapAck() {
|
| + if (!pending_swap_ack_)
|
| + return;
|
| +
|
| + AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
|
| + ack_params.sync_point = 0;
|
| + ack_params.renderer_id = pending_swap_ack_->renderer_id;
|
| + RenderWidgetHostImpl::AcknowledgeBufferPresent(pending_swap_ack_->route_id,
|
| + pending_swap_ack_->gpu_host_id,
|
| + ack_params);
|
| + if (render_widget_host_)
|
| + render_widget_host_->AcknowledgeSwapBuffersToRenderer();
|
| +
|
| + pending_swap_ack_.reset();
|
| +}
|
| +
|
| } // namespace content
|
|
|
| // RenderWidgetHostViewCocoa ---------------------------------------------------
|
|
|