| 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 138df78cf07f1541b2ed06b022954fd82078df49..062ad08ff44756ac344e7a8bee7ed3671007b692 100644
|
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
|
| @@ -245,7 +245,7 @@
|
| RenderWidgetHostImpl* widget_host,
|
| ContentViewCoreImpl* content_view_core)
|
| : host_(widget_host),
|
| - outstanding_vsync_requests_(0),
|
| + needs_begin_frame_(false),
|
| is_showing_(!widget_host->is_hidden()),
|
| content_view_core_(NULL),
|
| ime_adapter_android_(this),
|
| @@ -259,6 +259,7 @@
|
| 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(),
|
| @@ -322,9 +323,10 @@
|
|
|
| host_->WasShown(ui::LatencyInfo());
|
|
|
| - if (content_view_core_) {
|
| - StartObservingRootWindow();
|
| - RequestVSyncUpdate(BEGIN_FRAME);
|
| + if (content_view_core_ && !using_synchronous_compositor_) {
|
| + content_view_core_->GetWindowAndroid()->AddObserver(this);
|
| + content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
|
| + observing_root_window_ = true;
|
| }
|
| }
|
|
|
| @@ -338,7 +340,10 @@
|
| // utilization.
|
| host_->WasHidden();
|
|
|
| - StopObservingRootWindow();
|
| + if (content_view_core_ && !using_synchronous_compositor_) {
|
| + content_view_core_->GetWindowAndroid()->RemoveObserver(this);
|
| + observing_root_window_ = false;
|
| + }
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::WasResized() {
|
| @@ -623,13 +628,15 @@
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame(bool enabled) {
|
| - DCHECK(!using_synchronous_compositor_);
|
| + if (enabled == needs_begin_frame_)
|
| + return;
|
| +
|
| TRACE_EVENT1("cc", "RenderWidgetHostViewAndroid::OnSetNeedsBeginFrame",
|
| "enabled", enabled);
|
| - if (enabled)
|
| - RequestVSyncUpdate(PERSISTENT_BEGIN_FRAME);
|
| - else
|
| - outstanding_vsync_requests_ &= ~PERSISTENT_BEGIN_FRAME;
|
| + if (content_view_core_ && enabled)
|
| + content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
|
| +
|
| + needs_begin_frame_ = enabled;
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::OnStartContentIntent(
|
| @@ -1248,62 +1255,6 @@
|
| content_view_core_->RemoveLayer(layer_);
|
| if (overscroll_effect_)
|
| overscroll_effect_->Disable();
|
| -}
|
| -
|
| -void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32 requests) {
|
| - // The synchronous compositor does not requre BeginFrame messages.
|
| - if (using_synchronous_compositor_)
|
| - requests &= FLUSH_INPUT;
|
| -
|
| - bool should_request_vsync = !outstanding_vsync_requests_ && requests;
|
| - outstanding_vsync_requests_ |= requests;
|
| - // Note that if we're not currently observing the root window, outstanding
|
| - // vsync requests will be pushed if/when we resume observing in
|
| - // |StartObservingRootWindow()|.
|
| - if (observing_root_window_ && should_request_vsync)
|
| - content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
|
| -}
|
| -
|
| -void RenderWidgetHostViewAndroid::StartObservingRootWindow() {
|
| - DCHECK(content_view_core_);
|
| - DCHECK(!observing_root_window_);
|
| - observing_root_window_ = true;
|
| - content_view_core_->GetWindowAndroid()->AddObserver(this);
|
| -
|
| - // Clear existing vsync requests to allow a request to the new window.
|
| - uint32 outstanding_vsync_requests = outstanding_vsync_requests_;
|
| - outstanding_vsync_requests_ = 0;
|
| - RequestVSyncUpdate(outstanding_vsync_requests);
|
| -}
|
| -
|
| -void RenderWidgetHostViewAndroid::StopObservingRootWindow() {
|
| - if (!content_view_core_) {
|
| - DCHECK(!observing_root_window_);
|
| - return;
|
| - }
|
| -
|
| - if (!observing_root_window_)
|
| - return;
|
| -
|
| - observing_root_window_ = false;
|
| - content_view_core_->GetWindowAndroid()->RemoveObserver(this);
|
| -}
|
| -
|
| -void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time,
|
| - base::TimeDelta vsync_period) {
|
| - 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::FromMicroseconds(
|
| - (1.0f * base::Time::kMicrosecondsPerSecond) / (3.0f * 60));
|
| -
|
| - base::TimeTicks deadline = display_time - estimated_browser_composite_time;
|
| -
|
| - host_->Send(new ViewMsg_BeginFrame(
|
| - host_->GetRoutingID(),
|
| - cc::BeginFrameArgs::Create(frame_time, deadline, vsync_period)));
|
| }
|
|
|
| bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) {
|
| @@ -1454,8 +1405,11 @@
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::OnSetNeedsFlushInput() {
|
| + if (flush_input_requested_ || !content_view_core_)
|
| + return;
|
| TRACE_EVENT0("input", "RenderWidgetHostViewAndroid::OnSetNeedsFlushInput");
|
| - RequestVSyncUpdate(FLUSH_INPUT);
|
| + flush_input_requested_ = true;
|
| + content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
|
| }
|
|
|
| BrowserAccessibilityManager*
|
| @@ -1496,8 +1450,9 @@
|
| // 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 (observing_root_window_)
|
| - RequestVSyncUpdate(BEGIN_FRAME);
|
| + if (content_view_core_ && observing_root_window_) {
|
| + content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
|
| + }
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::SendMouseEvent(
|
| @@ -1593,7 +1548,10 @@
|
| void RenderWidgetHostViewAndroid::SetContentViewCore(
|
| ContentViewCoreImpl* content_view_core) {
|
| RemoveLayers();
|
| - StopObservingRootWindow();
|
| + if (observing_root_window_ && content_view_core_) {
|
| + content_view_core_->GetWindowAndroid()->RemoveObserver(this);
|
| + observing_root_window_ = false;
|
| + }
|
|
|
| bool resize = false;
|
| if (content_view_core != content_view_core_) {
|
| @@ -1619,7 +1577,12 @@
|
| if (!content_view_core_)
|
| return;
|
|
|
| - StartObservingRootWindow();
|
| + if (!using_synchronous_compositor_) {
|
| + content_view_core_->GetWindowAndroid()->AddObserver(this);
|
| + observing_root_window_ = true;
|
| + if (needs_begin_frame_)
|
| + content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
|
| + }
|
|
|
| if (resize)
|
| WasResized();
|
| @@ -1664,19 +1627,27 @@
|
| if (!host_)
|
| return;
|
|
|
| - const uint32 current_vsync_requests = outstanding_vsync_requests_;
|
| - outstanding_vsync_requests_ = 0;
|
| -
|
| - if (current_vsync_requests & FLUSH_INPUT)
|
| + if (flush_input_requested_) {
|
| + flush_input_requested_ = false;
|
| host_->FlushInput();
|
| -
|
| - if (current_vsync_requests & BEGIN_FRAME ||
|
| - current_vsync_requests & PERSISTENT_BEGIN_FRAME) {
|
| - SendBeginFrame(frame_time, vsync_period);
|
| - }
|
| -
|
| - if (current_vsync_requests & PERSISTENT_BEGIN_FRAME)
|
| - RequestVSyncUpdate(PERSISTENT_BEGIN_FRAME);
|
| + }
|
| +
|
| + 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::FromMicroseconds(
|
| + (1.0f * base::Time::kMicrosecondsPerSecond) / (3.0f * 60));
|
| +
|
| + base::TimeTicks deadline = display_time - estimated_browser_composite_time;
|
| +
|
| + host_->Send(new ViewMsg_BeginFrame(
|
| + host_->GetRoutingID(),
|
| + cc::BeginFrameArgs::Create(frame_time, deadline, vsync_period)));
|
| +
|
| + if (needs_begin_frame_)
|
| + content_view_core_->GetWindowAndroid()->RequestVSyncUpdate();
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::OnAnimate(base::TimeTicks begin_frame_time) {
|
|
|