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

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 2767933002: [cc] Don't send missed BeginFrames with past deadline.
Patch Set: add ExternalBFS tests, don't check in DelayBasedBFS. Created 3 years, 9 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_android.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_android.cc
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 51658bd97e183299957fffad8d66b27452d4f7e5..8573ddf067ca0b0d92d57edc62ada054fc4b6836 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1556,16 +1556,12 @@ void RenderWidgetHostViewAndroid::StopObservingRootWindow() {
DCHECK(!begin_frame_source_);
}
-void RenderWidgetHostViewAndroid::SendBeginFrame(cc::BeginFrameArgs args) {
+void RenderWidgetHostViewAndroid::SendBeginFrame(
+ const cc::BeginFrameArgs& args) {
TRACE_EVENT2("cc", "RenderWidgetHostViewAndroid::SendBeginFrame",
"frame_number", args.sequence_number, "frame_time_us",
args.frame_time.ToInternalValue());
- // Synchronous compositor does not use deadline-based scheduling.
- // TODO(brianderson): Replace this hardcoded deadline after Android
- // switches to Surfaces and the Browser's commit isn't in the critical path.
- args.deadline = sync_compositor_ ? base::TimeTicks()
- : args.frame_time + (args.interval * 0.6);
host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args));
if (sync_compositor_)
sync_compositor_->DidSendBeginFrame(view_.GetWindowAndroid());
@@ -1993,6 +1989,7 @@ void RenderWidgetHostViewAndroid::OnDetachCompositor() {
}
void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) {
+ // TODO(eseckler): Acknowledge BeginFrames.
TRACE_EVENT0("cc,benchmark", "RenderWidgetHostViewAndroid::OnBeginFrame");
if (!host_)
return;
@@ -2003,6 +2000,23 @@ void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) {
if (sync_compositor_ && args.type == cc::BeginFrameArgs::MISSED)
return;
+ cc::BeginFrameArgs adjusted_args = args;
+
+ if (sync_compositor_) {
+ // Synchronous compositor does not use deadline-based scheduling.
+ adjusted_args.deadline = base::TimeTicks();
+ } else {
+ // TODO(brianderson): Replace this hardcoded deadline after Android
+ // switches to Surfaces and the Browser's commit isn't in the critical path.
+ adjusted_args.deadline =
+ adjusted_args.frame_time + (adjusted_args.interval * 0.6);
+ // Avoid unnecessary IPC round trips of missed args with past deadline.
+ if (adjusted_args.type == cc::BeginFrameArgs::MISSED &&
+ base::TimeTicks::Now() > adjusted_args.deadline) {
+ return;
+ }
+ }
+
// Update |last_begin_frame_args_| before handling
// |outstanding_begin_frame_requests_| to prevent the BeginFrameSource from
// sending the same MISSED args in infinite recursion. This may otherwise
@@ -2020,7 +2034,7 @@ void RenderWidgetHostViewAndroid::OnBeginFrame(const cc::BeginFrameArgs& args) {
if ((outstanding_begin_frame_requests_ & BEGIN_FRAME) ||
(outstanding_begin_frame_requests_ & PERSISTENT_BEGIN_FRAME)) {
ClearBeginFrameRequest(BEGIN_FRAME);
- SendBeginFrame(args);
+ SendBeginFrame(adjusted_args);
}
}
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698