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 dd65887f78db5d47ad01b2adc5b5da168d243a18..a0437b11d2a291f0f5e51be3e6f71fa2e8c971eb 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -201,6 +201,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
using_synchronous_compositor_(SynchronousCompositorImpl::FromID( |
widget_host->GetProcess()->GetID(), |
widget_host->GetRoutingID()) != NULL), |
+ vsync_subscribers_(0), |
frame_evictor_(new DelegatedFrameEvictor(this)), |
locks_on_frame_count_(0), |
observing_root_window_(false) { |
boliu
2014/08/20 02:54:16
vsync_subscribers_ can replace observing_root_wind
hush (inactive)
2014/08/20 03:47:21
yes indeed.
|
@@ -260,9 +261,8 @@ void RenderWidgetHostViewAndroid::WasShown() { |
host_->WasShown(ui::LatencyInfo()); |
if (content_view_core_ && !using_synchronous_compositor_) { |
- content_view_core_->GetWindowAndroid()->AddObserver(this); |
+ SubscribeToVSync(INPUT | BEGIN_FRAME); |
content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
- observing_root_window_ = true; |
} |
} |
@@ -811,6 +811,10 @@ void RenderWidgetHostViewAndroid::ShowDisambiguationPopup( |
scoped_ptr<SyntheticGestureTarget> |
RenderWidgetHostViewAndroid::CreateSyntheticGestureTarget() { |
+ DCHECK(content_view_core_); |
+ if (using_synchronous_compositor_) |
+ SubscribeToVSync(INPUT); |
+ |
return scoped_ptr<SyntheticGestureTarget>(new SyntheticGestureTargetAndroid( |
host_, content_view_core_->CreateTouchEventSynthesizer())); |
} |
@@ -1470,8 +1474,7 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
return; |
if (!using_synchronous_compositor_) { |
- content_view_core_->GetWindowAndroid()->AddObserver(this); |
- observing_root_window_ = true; |
+ SubscribeToVSync(INPUT | BEGIN_FRAME); |
if (needs_begin_frame_) |
content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
} |
@@ -1518,17 +1521,31 @@ void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
RunAckCallbacks(); |
} |
+void RenderWidgetHostViewAndroid::SubscribeToVSync(int type) { |
boliu
2014/08/20 02:54:16
Where is Unsubscribe?
hush (inactive)
2014/08/20 03:47:21
Will add it...
On 2014/08/20 02:54:16, boliu wrote
|
+ if (!observing_root_window_) { |
+ content_view_core_->GetWindowAndroid()->AddObserver(this); |
+ observing_root_window_ = true; |
+ } |
+ |
+ vsync_subscribers_ |= type; |
+ // Synchronous compositor does not request begin frames OnVSync. |
+ DCHECK(using_synchronous_compositor_ && !(vsync_subscribers_ & BEGIN_FRAME)); |
boliu
2014/08/20 02:54:16
This DCHECK can't be right. It fails if using_sync
hush (inactive)
2014/08/20 03:47:21
yeah.. you are right.
Done
On 2014/08/20 02:54:16,
|
+} |
+ |
void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time, |
base::TimeDelta vsync_period) { |
TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::OnVSync"); |
if (!host_) |
return; |
- if (flush_input_requested_) { |
+ if (vsync_subscribers_ & INPUT & flush_input_requested_) { |
flush_input_requested_ = false; |
host_->FlushInput(); |
} |
+ if (!(vsync_subscribers_ & BEGIN_FRAME)) |
+ return; |
+ |
TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame"); |
base::TimeTicks display_time = frame_time + vsync_period; |