Chromium Code Reviews| Index: content/browser/renderer_host/render_widget_host_view_aura.cc |
| diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc |
| index eee2df69b76756f82a597511cb8b934f22227e9e..74f76108b886ec8f589987f22a651a49c39117f9 100644 |
| --- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
| +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
| @@ -13,6 +13,7 @@ |
| #include "base/logging.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/strings/string_number_conversions.h" |
| +#include "cc/base/switches.h" |
| #include "cc/layers/layer.h" |
| #include "cc/output/copy_output_request.h" |
| #include "cc/output/copy_output_result.h" |
| @@ -61,7 +62,6 @@ |
| #include "ui/base/hit_test.h" |
| #include "ui/base/ime/input_method.h" |
| #include "ui/base/ui_base_types.h" |
| -#include "ui/compositor/compositor_vsync_manager.h" |
| #include "ui/compositor/dip_util.h" |
| #include "ui/events/event.h" |
| #include "ui/events/event_utils.h" |
| @@ -452,6 +452,8 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host) |
| #endif |
| has_snapped_to_boundary_(false), |
| touch_editing_client_(NULL), |
| + needs_begin_frame_(false), |
| + begin_frame_scheduling_is_enabled_(false), |
| weak_ptr_factory_(this) { |
| host_->SetView(this); |
| window_observer_.reset(new WindowObserver(this)); |
| @@ -465,11 +467,24 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host) |
| bool overscroll_enabled = CommandLine::ForCurrentProcess()-> |
| GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0"; |
| SetOverscrollControllerEnabled(overscroll_enabled); |
| + |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
| + cc::switches::kEnableBeginFrameScheduling)) |
| + begin_frame_scheduling_is_enabled_ = true; |
| } |
| //////////////////////////////////////////////////////////////////////////////// |
| // RenderWidgetHostViewAura, RenderWidgetHostView implementation: |
| +bool RenderWidgetHostViewAura::OnMessageReceived(const IPC::Message& msg) { |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP(RenderWidgetHostViewAura, msg) |
| + IPC_MESSAGE_HANDLER(ViewHostMsg_SetNeedsBeginFrame, OnSetNeedsBeginFrame) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| +} |
| + |
| void RenderWidgetHostViewAura::InitAsChild( |
| gfx::NativeView parent_view) { |
| window_->SetType(ui::wm::WINDOW_TYPE_CONTROL); |
| @@ -860,6 +875,14 @@ void RenderWidgetHostViewAura::Destroy() { |
| // Beware, this function is not called on all destruction paths. It will |
| // implicitly end up calling ~RenderWidgetHostViewAura though, so all |
| // destruction/cleanup code should happen there, not here. |
| + |
| + // Remove observation from BeginFrameManager in here because we can't access |
| + // to compositor in destructor. |
| + if (needs_begin_frame_ && GetCompositor()) { |
| + GetCompositor()->begin_frame_manager()->RemoveObserver(this); |
| + needs_begin_frame_ = false; |
| + } |
| + |
| in_shutdown_ = true; |
| delete window_; |
| } |
| @@ -2119,9 +2142,39 @@ void RenderWidgetHostViewAura::OnHostMoved(const aura::WindowTreeHost* host, |
| } |
| //////////////////////////////////////////////////////////////////////////////// |
| +// ui::BeginFrameManager::Observer implementation: |
| +void RenderWidgetHostViewAura::OnSendBeginFrame( |
| + const cc::BeginFrameArgs& args) { |
| + DCHECK(begin_frame_scheduling_is_enabled_); |
| + DCHECK(host_); |
| + TRACE_EVENT0("cc", "RenderWidgetHostViewAura::OnSendBeginFrame"); |
| + |
| + cc::BeginFrameArgs adjusted_args(args); |
| + |
| + delegated_frame_host_->UpdateVSyncParameters(adjusted_args); |
| + |
| + // TODO(brianderson): Use adaptive draw-time estimation. |
| + base::TimeDelta estimated_browser_composite_time = |
|
brianderson
2014/08/28 02:48:07
We should be able to remove this adjustment here a
simonhong
2014/09/03 21:02:23
Yep, did it in the scheduler.
|
| + base::TimeDelta::FromMicroseconds( |
| + (1.0f * base::Time::kMicrosecondsPerSecond) / (3.0f * 60)); |
| + |
| + adjusted_args.deadline -= estimated_browser_composite_time; |
| + |
| + host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), adjusted_args)); |
| + |
| + last_begin_frame_args_ = args; |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| // RenderWidgetHostViewAura, private: |
| RenderWidgetHostViewAura::~RenderWidgetHostViewAura() { |
| + // When we are using unified BeginFrame(--enable-begin-frame-scheduling), |
| + // |needs_begin_frame_| always be false in here. We can't remove |
| + // observation from BeginFrameManager via compositor in this function |
| + // because |window_| is already removed from window tree host. |
| + DCHECK(!needs_begin_frame_); |
| + |
| if (touch_editing_client_) |
| touch_editing_client_->OnViewDestroyed(); |
| @@ -2379,6 +2432,14 @@ void RenderWidgetHostViewAura::AddedToRootWindow() { |
| #endif |
| delegated_frame_host_->AddedToWindow(); |
| + |
| + // When this RWHV is added to new root window, this RWHV should be added to |
| + // the BeginFrameManager of new compositor. |
| + if (needs_begin_frame_) { |
| + DCHECK(begin_frame_scheduling_is_enabled_); |
| + GetCompositor()->begin_frame_manager()->AddObserver(this, |
| + last_begin_frame_args_); |
| + } |
| } |
| void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
| @@ -2398,6 +2459,13 @@ void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
| if (legacy_render_widget_host_HWND_) |
| legacy_render_widget_host_HWND_->UpdateParent(::GetDesktopWindow()); |
| #endif |
| + |
| + // When this RWHV is removed from current root window, this RWHV should be |
| + // removed from BeginFrameManager of current compositor which will be removed. |
| + if (needs_begin_frame_) { |
| + DCHECK(begin_frame_scheduling_is_enabled_); |
| + GetCompositor()->begin_frame_manager()->RemoveObserver(this); |
| + } |
| } |
| void RenderWidgetHostViewAura::DetachFromInputMethod() { |
| @@ -2439,6 +2507,24 @@ SkColorType RenderWidgetHostViewAura::PreferredReadbackFormat() { |
| return kN32_SkColorType; |
| } |
| +void RenderWidgetHostViewAura::OnSetNeedsBeginFrame(bool enabled) { |
| + DCHECK(begin_frame_scheduling_is_enabled_); |
| + |
| + if (needs_begin_frame_ == enabled) |
| + return; |
| + |
| + TRACE_EVENT1("cc", "RenderWidgetHostViewAura::OnSetNeedsBeginFrame", |
| + "enabled", enabled); |
| + if(enabled) { |
| + GetCompositor()->begin_frame_manager()->AddObserver(this, |
| + last_begin_frame_args_); |
| + } else { |
| + GetCompositor()->begin_frame_manager()->RemoveObserver(this); |
| + } |
| + |
| + needs_begin_frame_ = enabled; |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // DelegatedFrameHost, public: |