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: |