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..23241dede1f939a52be44abc08d7687821d8926c 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -183,7 +183,6 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
RenderWidgetHostImpl* widget_host, |
ContentViewCoreImpl* content_view_core) |
: host_(widget_host), |
- needs_begin_frame_(false), |
is_showing_(!widget_host->is_hidden()), |
content_view_core_(NULL), |
ime_adapter_android_(this), |
@@ -196,14 +195,13 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
gesture_text_selector_(this), |
touch_scrolling_(false), |
potentially_active_fling_count_(0), |
- flush_input_requested_(false), |
accelerated_surface_route_id_(0), |
using_synchronous_compositor_(SynchronousCompositorImpl::FromID( |
widget_host->GetProcess()->GetID(), |
widget_host->GetRoutingID()) != NULL), |
+ vsync_subscribers_bitmask_(0), |
frame_evictor_(new DelegatedFrameEvictor(this)), |
- locks_on_frame_count_(0), |
- observing_root_window_(false) { |
+ locks_on_frame_count_(0) { |
host_->SetView(this); |
SetContentViewCore(content_view_core); |
ImageTransportFactoryAndroid::AddObserver(this); |
@@ -259,11 +257,8 @@ void RenderWidgetHostViewAndroid::WasShown() { |
host_->WasShown(ui::LatencyInfo()); |
- if (content_view_core_ && !using_synchronous_compositor_) { |
- content_view_core_->GetWindowAndroid()->AddObserver(this); |
- content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
- observing_root_window_ = true; |
- } |
+ if (content_view_core_ && !using_synchronous_compositor_) |
+ SubscribeToVSync(INPUT | BEGIN_FRAME); |
} |
void RenderWidgetHostViewAndroid::WasHidden() { |
@@ -276,10 +271,8 @@ void RenderWidgetHostViewAndroid::WasHidden() { |
// utilization. |
host_->WasHidden(); |
- if (content_view_core_ && !using_synchronous_compositor_) { |
- content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
- observing_root_window_ = false; |
- } |
+ if (content_view_core_ && !using_synchronous_compositor_) |
+ UnsubscribeToVSync(INPUT | BEGIN_FRAME); |
} |
void RenderWidgetHostViewAndroid::WasResized() { |
@@ -551,15 +544,15 @@ void RenderWidgetHostViewAndroid::OnDidChangeBodyBackgroundColor( |
} |
void RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame(bool enabled) { |
- if (enabled == needs_begin_frame_) |
+ if (enabled == IsSubscribedToType(BEGIN_FRAME) || !content_view_core_) |
boliu
2014/08/20 20:30:00
No need to check for !content_view_core_ here.
|
return; |
TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame", |
"enabled", enabled); |
- if (content_view_core_ && enabled) |
- content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
- |
- needs_begin_frame_ = enabled; |
+ if (enabled) |
+ SubscribeToVSync(BEGIN_FRAME); |
+ else |
+ UnsubscribeToVSync(BEGIN_FRAME); |
} |
void RenderWidgetHostViewAndroid::OnStartContentIntent( |
@@ -811,6 +804,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())); |
} |
@@ -1300,11 +1297,11 @@ InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent( |
} |
void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() { |
- if (flush_input_requested_ || !content_view_core_) |
+ if ((IsSubscribedToType(INPUT)) || !content_view_core_) |
return; |
+ |
TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput"); |
boliu
2014/08/20 20:30:00
unrelated side note, this should be an instant eve
|
- flush_input_requested_ = true; |
- content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
+ SubscribeToVSync(INPUT); |
} |
BrowserAccessibilityManager* |
@@ -1345,9 +1342,8 @@ void RenderWidgetHostViewAndroid::SendTouchEvent( |
// This is good enough as long as the first touch event has Begin semantics |
// and the actual scroll happens on the next vsync. |
// TODO: Is this actually still needed? |
- if (content_view_core_) { |
boliu
2014/08/20 20:30:00
You need to rebase, I added something here to not
|
- content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
- } |
+ if (content_view_core_) |
+ SubscribeToVSync(BEGIN_FRAME); |
boliu
2014/08/20 20:30:00
This is not the same as simply calling RequestVSyn
|
} |
void RenderWidgetHostViewAndroid::SendMouseEvent( |
@@ -1440,10 +1436,8 @@ void RenderWidgetHostViewAndroid::DidStopFlinging() { |
void RenderWidgetHostViewAndroid::SetContentViewCore( |
ContentViewCoreImpl* content_view_core) { |
RemoveLayers(); |
- if (observing_root_window_ && content_view_core_) { |
- content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
- observing_root_window_ = false; |
- } |
+ if (vsync_subscribers_bitmask_ && content_view_core_) |
+ UnsubscribeToVSync(INPUT | BEGIN_FRAME); |
boliu
2014/08/20 20:30:00
I think we need an catch all enum value here.
|
bool resize = false; |
if (content_view_core != content_view_core_) { |
@@ -1469,12 +1463,9 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
if (!content_view_core_) |
return; |
- if (!using_synchronous_compositor_) { |
- content_view_core_->GetWindowAndroid()->AddObserver(this); |
- observing_root_window_ = true; |
- if (needs_begin_frame_) |
- content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
- } |
+ if (!using_synchronous_compositor_) |
+ SubscribeToVSync(INPUT | BEGIN_FRAME); |
boliu
2014/08/20 20:30:00
Only subscribe to what was subscribed before.
|
+ |
if (resize) |
WasResized(); |
@@ -1518,17 +1509,44 @@ void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
RunAckCallbacks(); |
} |
+void RenderWidgetHostViewAndroid::SubscribeToVSync(uint32 type) { |
+ if (!vsync_subscribers_bitmask_) |
+ content_view_core_->GetWindowAndroid()->AddObserver(this); |
+ |
+ vsync_subscribers_bitmask_ |= type; |
+ |
+ content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
+ |
+ // Synchronous compositor does not request begin frames OnVSync. |
+ DCHECK(!using_synchronous_compositor_ || !IsSubscribedToType(BEGIN_FRAME)); |
+} |
+ |
+void RenderWidgetHostViewAndroid::UnsubscribeToVSync(uint32 type) { |
+ vsync_subscribers_bitmask_ &= ~type; |
+ if (!vsync_subscribers_bitmask_) |
+ content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
+} |
+ |
+bool RenderWidgetHostViewAndroid::IsSubscribedToType(uint32 type) { |
boliu
2014/08/20 20:30:00
const
|
+ return !!(vsync_subscribers_bitmask_ & type); |
+} |
+ |
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; |
+ if (IsSubscribedToType(INPUT)) { |
+ // Need to unsubscribe before host_->FlushInput(), because FlushInput() |
+ // could cause RWHVA to subscribe to input again. |
+ UnsubscribeToVSync(INPUT); |
host_->FlushInput(); |
} |
+ if (!IsSubscribedToType(BEGIN_FRAME)) |
+ return; |
+ |
TRACE_EVENT0("cc", "RenderWidgetHostViewAndroid::SendBeginFrame"); |
base::TimeTicks display_time = frame_time + vsync_period; |
@@ -1543,8 +1561,7 @@ void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time, |
host_->GetRoutingID(), |
cc::BeginFrameArgs::Create(frame_time, deadline, vsync_period))); |
- if (needs_begin_frame_) |
- content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
+ content_view_core_->GetWindowAndroid()->RequestVSyncUpdate(); |
boliu
2014/08/20 20:30:00
This is still called outside of SubscribeToVSync.
|
} |
void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) { |