Chromium Code Reviews| 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..a4bd8be9534b9a28d724c7eec447af246cd5bdd7 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. |
| + CHECK(!about_to_validate_and_paint_); |
|
piman
2014/02/18 21:47:04
nit: DCHECK.
ccameron
2014/02/18 22:33:10
Done.
|
| + |
| // 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; |
| } |
| } |
| @@ -1475,6 +1487,7 @@ bool RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { |
| } |
| SendPendingLatencyInfoToHost(); |
| + SendPendingSwapAck(); |
| return true; |
| } |
| @@ -1652,19 +1665,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 +1682,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 +2063,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 --------------------------------------------------- |