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