Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2091)

Unified Diff: content/browser/renderer_host/render_widget_host_view_aura.cc

Issue 548153004: Unified BeginFrame scheduling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git cl format Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 a54d860bc9e646cb9c5d0c9b52559e8042e2f17f..2b90989c81af6f82fb567b23afd60421fcf2c66e 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -17,7 +17,6 @@
#include "cc/output/copy_output_request.h"
#include "cc/output/copy_output_result.h"
#include "cc/resources/texture_mailbox.h"
-#include "cc/trees/layer_tree_settings.h"
#include "content/browser/accessibility/browser_accessibility_manager.h"
#include "content/browser/accessibility/browser_accessibility_state_impl.h"
#include "content/browser/frame_host/frame_tree.h"
@@ -61,7 +60,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 +450,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 +465,24 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host)
bool overscroll_enabled = base::CommandLine::ForCurrentProcess()->
GetSwitchValueASCII(switches::kOverscrollHistoryNavigation) != "0";
SetOverscrollControllerEnabled(overscroll_enabled);
+
+#if !defined(OS_CHROMEOS)
+ begin_frame_scheduling_is_enabled_ = true;
+#endif
}
////////////////////////////////////////////////////////////////////////////////
// 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);
@@ -874,6 +887,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 Compositor in here because we can't access
+ // to compositor in destructor.
+ if (needs_begin_frame_ && GetCompositor()) {
+ GetCompositor()->RemoveBeginFrameObserver(this);
+ needs_begin_frame_ = false;
+ }
+
in_shutdown_ = true;
delete window_;
}
@@ -2125,9 +2146,30 @@ void RenderWidgetHostViewAura::OnHostMoved(const aura::WindowTreeHost* host,
}
////////////////////////////////////////////////////////////////////////////////
+// ui::CompositorBeginFrameObserver implementation:
+void RenderWidgetHostViewAura::OnSendBeginFrame(
+ const cc::BeginFrameArgs& args) {
+ DCHECK(begin_frame_scheduling_is_enabled_);
+ DCHECK(host_);
+ TRACE_EVENT0("cc", "RenderWidgetHostViewAura::OnSendBeginFrame");
+
+ delegated_frame_host_->UpdateVSyncParameters(args);
+
+ host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), 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 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();
@@ -2385,6 +2427,13 @@ void RenderWidgetHostViewAura::AddedToRootWindow() {
#endif
delegated_frame_host_->AddedToWindow();
+
+ // When this RWHV is added to new root window, this RWHV should be added to
+ // the new compositor.
+ if (needs_begin_frame_) {
+ DCHECK(begin_frame_scheduling_is_enabled_);
+ GetCompositor()->AddBeginFrameObserver(this, last_begin_frame_args_);
+ }
}
void RenderWidgetHostViewAura::RemovingFromRootWindow() {
@@ -2404,6 +2453,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 the current compositor which will be removed.
+ if (needs_begin_frame_) {
+ DCHECK(begin_frame_scheduling_is_enabled_);
+ GetCompositor()->RemoveBeginFrameObserver(this);
+ }
}
void RenderWidgetHostViewAura::DetachFromInputMethod() {
@@ -2445,6 +2501,25 @@ SkColorType RenderWidgetHostViewAura::PreferredReadbackFormat() {
return kN32_SkColorType;
}
+void RenderWidgetHostViewAura::OnSetNeedsBeginFrame(bool enabled) {
+ DCHECK(begin_frame_scheduling_is_enabled_);
+ DCHECK(GetCompositor());
+
+ if (needs_begin_frame_ == enabled)
+ return;
+
+ TRACE_EVENT1("cc",
+ "RenderWidgetHostViewAura::OnSetNeedsBeginFrame",
+ "enabled",
+ enabled);
+ if (enabled)
+ GetCompositor()->AddBeginFrameObserver(this, last_begin_frame_args_);
+ else
+ GetCompositor()->RemoveBeginFrameObserver(this);
+
+ needs_begin_frame_ = enabled;
+}
+
////////////////////////////////////////////////////////////////////////////////
// DelegatedFrameHost, public:

Powered by Google App Engine
This is Rietveld 408576698