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

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

Issue 236193013: Android: Consolidate and simplify VSync logic (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 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
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 de2ac4ba292cea89e8bb1105942102dc8d99be45..1fd81b128e5044b5a585fe605ea022026605ced9 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -145,6 +145,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
ContentViewCoreImpl* content_view_core)
: host_(widget_host),
needs_begin_frame_(false),
+ requested_vsync_for_touch_event_(false),
is_showing_(!widget_host->is_hidden()),
content_view_core_(NULL),
ime_adapter_android_(this),
@@ -485,36 +486,14 @@ void RenderWidgetHostViewAndroid::OnDidChangeBodyBackgroundColor(
content_view_core_->OnBackgroundColorChanged(color);
}
-void RenderWidgetHostViewAndroid::SendBeginFrame(
- const cc::BeginFrameArgs& args) {
- TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame");
- if (!host_)
- return;
-
- if (flush_input_requested_) {
- flush_input_requested_ = false;
- host_->FlushInput();
- content_view_core_->RemoveBeginFrameSubscriber();
- }
-
- host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args));
-}
-
void RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame(
bool enabled) {
TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame",
"enabled", enabled);
- // ContentViewCoreImpl handles multiple subscribers to the BeginFrame, so
- // we have to make sure calls to ContentViewCoreImpl's
- // {Add,Remove}BeginFrameSubscriber are balanced, even if
- // RenderWidgetHostViewAndroid's may not be.
- if (content_view_core_ && needs_begin_frame_ != enabled) {
- if (enabled)
- content_view_core_->AddBeginFrameSubscriber();
- else
- content_view_core_->RemoveBeginFrameSubscriber();
- needs_begin_frame_ = enabled;
- }
+ if (content_view_core_ && enabled)
Sami 2014/04/16 17:26:54 Are we sure the calls here are balanced and never
no sievers 2014/04/25 22:23:33 Maybe that was just a problem with CVC<->RWHV badn
+ content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
+
+ needs_begin_frame_ = enabled;
}
void RenderWidgetHostViewAndroid::OnStartContentIntent(
@@ -984,6 +963,10 @@ void RenderWidgetHostViewAndroid::RemoveLayers() {
overscroll_effect_->Disable();
}
+void RenderWidgetHostViewAndroid::SetNeedsAnimate() {
+ content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
+}
+
bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) {
return overscroll_effect_->Animate(frame_time);
}
@@ -1090,7 +1073,6 @@ void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() {
return;
TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput");
flush_input_requested_ = true;
- content_view_core_->AddBeginFrameSubscriber();
}
void RenderWidgetHostViewAndroid::CreateBrowserAccessibilityManagerIfNeeded() {
@@ -1181,6 +1163,14 @@ void RenderWidgetHostViewAndroid::SendTouchEvent(
const blink::WebTouchEvent& event) {
if (host_)
host_->ForwardTouchEventWithLatencyInfo(event, CreateLatencyInfo(event));
+
+ // Send a proactive BeginFrame on the next vsync to reduce latency.
Sami 2014/04/16 17:26:54 I don't think this is needed any more since VSyncM
no sievers 2014/04/25 22:23:33 Chatted with Brian. I'll leave it in this patch ju
brianderson 2014/04/25 23:26:02 Does the Browser send a BeginFrame to the Renderer
+ // This is good enough as long as the first touch event has Begin semantics
+ // and the actual scroll happens on the next vsync.
+ if (content_view_core_) {
+ content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
+ requested_vsync_for_touch_event_ = true;
+ }
}
void RenderWidgetHostViewAndroid::SendMouseEvent(
@@ -1226,7 +1216,7 @@ void RenderWidgetHostViewAndroid::OnOverscrolled(
base::TimeTicks::Now(),
gfx::ScaleVector2d(accumulated_overscroll, device_scale_factor),
gfx::ScaleVector2d(current_fling_velocity, device_scale_factor))) {
- content_view_core_->SetNeedsAnimate();
+ SetNeedsAnimate();
}
}
@@ -1264,6 +1254,8 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
if (content_view_core_ && !root_window_destroyed_ &&
!using_synchronous_compositor_) {
content_view_core_->GetWindowAndroid()->AddObserver(this);
+ if (needs_begin_frame_)
+ content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
}
}
@@ -1288,6 +1280,39 @@ void RenderWidgetHostViewAndroid::OnWillDestroyWindow() {
root_window_destroyed_ = true;
}
+void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time,
+ base::TimeDelta vsync_period) {
+ TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::OnVSync");
+ if (!host_)
+ return;
+
+ if (flush_input_requested_) {
+ flush_input_requested_ = false;
+ host_->FlushInput();
+ }
+
+ if (needs_begin_frame_ || requested_vsync_for_touch_event_) {
no sievers 2014/04/25 22:23:33 I removed this if-condition as it seems to be a fu
+ TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame");
+ base::TimeTicks display_time = frame_time + vsync_period;
+
+ // TODO(brianderson): Use adaptive draw-time estimation.
+ base::TimeDelta estimated_browser_composite_time =
+ base::TimeDelta::FromMilliseconds(1000.0 / (3 * 60));
Sami 2014/04/16 17:26:54 This drops some precision -- better use FromMicros
no sievers 2014/04/25 22:23:33 Done.
+
+ base::TimeTicks deadline = display_time - estimated_browser_composite_time;
+
+ host_->Send(new ViewMsg_BeginFrame(
+ host_->GetRoutingID(),
+ cc::BeginFrameArgs::Create(frame_time, deadline, vsync_period)));
+ requested_vsync_for_touch_event_ = false;
+ }
+
+ // TODO(sievers): This should use the LayerTreeHostClient callback
+ bool needs_animate = Animate(frame_time);
+ if (needs_begin_frame_ || needs_animate)
+ content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
+}
+
void RenderWidgetHostViewAndroid::OnLostResources() {
ReleaseLocksOnSurface();
if (layer_.get())

Powered by Google App Engine
This is Rietveld 408576698