Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(252)

Unified Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 165703002: Do not send a frame swap ack from the browser until the frame is drawn (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@dynamic_async
Patch Set: Add swap ack missed with devtools overlays Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_mac.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 ---------------------------------------------------
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698