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 a2d991d4600eca9e6c46b5a5298b71385909f129..17bb5972cf422f12a2c9bf30218c5dfed81f62af 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm |
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm |
@@ -437,6 +437,10 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
} |
RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { |
+ // If a caller has set this, then when the caller tries to re-set it sometime |
+ // in the future, we will crash. |
+ DCHECK(!about_to_validate_and_paint_); |
+ |
// This is being called from |cocoa_view_|'s destructor, so invalidate the |
// pointer. |
cocoa_view_ = nil; |
@@ -574,6 +578,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 +755,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 +1332,7 @@ void RenderWidgetHostViewMac::CompositorSwapBuffers( |
compositing_iosurface_->CopyToVideoFrame( |
gfx::Rect(size), frame, |
base::Bind(callback, present_time)); |
+ SendPendingSwapAck(); |
return; |
} |
} |
@@ -1440,6 +1452,7 @@ bool RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { |
underlay_view_->compositing_iosurface_ && |
underlay_view_has_drawn_) { |
[underlay_view_->cocoa_view() setNeedsDisplay:YES]; |
+ SendPendingSwapAck(); |
return true; |
} |
@@ -1475,6 +1488,7 @@ bool RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { |
} |
SendPendingLatencyInfoToHost(); |
+ SendPendingSwapAck(); |
return true; |
} |
@@ -1652,19 +1666,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 +1683,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 +2064,32 @@ 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)); |
+ // If we're about to paint, ack this immediatley. |
+ if (about_to_validate_and_paint_) |
+ SendPendingSwapAck(); |
+} |
+ |
+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 --------------------------------------------------- |