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

Unified Diff: ui/compositor/compositor.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
« no previous file with comments | « ui/compositor/compositor.h ('k') | ui/compositor/compositor.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/compositor/compositor.cc
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index 4f4037490a2a0135b0170f599f799b76e82be0cb..e61dae66cd64326497db86a0de0f3183fe062481 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -24,7 +24,6 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/compositor/compositor_observer.h"
#include "ui/compositor/compositor_switches.h"
-#include "ui/compositor/compositor_vsync_manager.h"
#include "ui/compositor/dip_util.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animator_collection.h"
@@ -76,7 +75,6 @@ Compositor::Compositor(gfx::AcceleratedWidget widget,
widget_(widget),
compositor_thread_loop_(context_factory->GetCompositorMessageLoop()),
task_runner_(task_runner),
- vsync_manager_(new CompositorVSyncManager()),
device_scale_factor_(0.0f),
last_started_frame_(0),
last_ended_frame_(0),
@@ -87,7 +85,8 @@ Compositor::Compositor(gfx::AcceleratedWidget widget,
draw_on_compositing_end_(false),
swap_state_(SWAP_NONE),
layer_animator_collection_(this),
- schedule_draw_factory_(this) {
+ schedule_draw_factory_(this),
+ output_surface_lost_(true) {
root_web_layer_ = cc::Layer::Create();
CommandLine* command_line = CommandLine::ForCurrentProcess();
@@ -101,6 +100,15 @@ Compositor::Compositor(gfx::AcceleratedWidget widget,
settings.main_frame_before_activation_enabled = false;
settings.throttle_frame_production =
!command_line->HasSwitch(switches::kDisableGpuVsync);
+#if defined(USE_AURA) && !defined(OS_CHROMEOS)
+ settings.begin_frame_publisher = true;
+#elif defined(OS_MACOSX)
+ // MacOSX only uses browser compositor when delegated rendering is used.
+ if (command_line->HasSwitch(switches::kEnableDelegatedRenderer)) {
+ settings.begin_frame_publisher = true;
+ settings.begin_frame_receiver = true;
+ }
+#endif
#if !defined(OS_MACOSX)
settings.partial_swap_enabled =
!command_line->HasSwitch(cc::switches::kUIDisablePartialSwap);
@@ -140,6 +148,8 @@ Compositor::Compositor(gfx::AcceleratedWidget widget,
base::TimeTicks before_create = base::TimeTicks::Now();
if (compositor_thread_loop_.get()) {
+ // Unified BeginFrame scheduling is not used with threaded compositing.
+ DCHECK(!settings.begin_frame_publisher);
host_ = cc::LayerTreeHost::CreateThreaded(
this,
context_factory_->GetSharedBitmapManager(),
@@ -166,6 +176,8 @@ Compositor::~Compositor() {
CancelCompositorLock();
DCHECK(!compositor_lock_);
+ DCHECK(!begin_frame_observer_list_.might_have_observers());
+
if (root_layer_)
root_layer_->SetCompositor(NULL);
@@ -279,8 +291,17 @@ void Compositor::SetVisible(bool visible) {
host_->SetVisible(visible);
}
-scoped_refptr<CompositorVSyncManager> Compositor::vsync_manager() const {
- return vsync_manager_;
+void Compositor::SetAuthoritativeVSyncInterval(base::TimeDelta interval) const {
+ host_->SetAuthoritativeVSyncInterval(interval);
+}
+
+void Compositor::StartBeginFrame(const cc::BeginFrameArgs& args) const {
+ if (output_surface_lost_)
+ return;
+ task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &cc::OutputSurface::BeginFrame, output_surface_weak_ptr_, args));
}
void Compositor::AddObserver(CompositorObserver* observer) {
@@ -324,6 +345,45 @@ bool Compositor::HasAnimationObserver(CompositorAnimationObserver* observer) {
return animation_observer_list_.HasObserver(observer);
}
+void Compositor::AddBeginFrameObserver(
+ CompositorBeginFrameObserver* observer,
+ const cc::BeginFrameArgs& last_begin_frame_args_sent_to_observer) {
+ bool need_begin_frame = false;
+ if (!begin_frame_observer_list_.might_have_observers()) {
+ need_begin_frame = true;
+ }
+
+ begin_frame_observer_list_.AddObserver(observer);
+
+ if (need_begin_frame) {
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&Compositor::SetChildrenNeedBeginFrames,
+ base::Unretained(this),
+ true));
+ }
+
+ // If |last_begin_frame_args_| is still effective, send it to the new
+ // |observer| immediately.
+ if (!last_begin_frame_args_sent_to_observer.deadline.is_null() &&
+ last_begin_frame_args_sent_to_observer != last_begin_frame_args_ &&
+ last_begin_frame_args_.deadline > base::TimeTicks::Now())
+ observer->OnSendBeginFrame(last_begin_frame_args_);
+}
+
+void Compositor::RemoveBeginFrameObserver(
+ CompositorBeginFrameObserver* observer) {
+ DCHECK(begin_frame_observer_list_.might_have_observers());
+
+ begin_frame_observer_list_.RemoveObserver(observer);
+
+ if (!begin_frame_observer_list_.might_have_observers()) {
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&Compositor::SetChildrenNeedBeginFrames,
+ base::Unretained(this),
+ false));
+ }
+}
+
void Compositor::BeginMainFrame(const cc::BeginFrameArgs& args) {
FOR_EACH_OBSERVER(CompositorAnimationObserver,
animation_observer_list_,
@@ -342,7 +402,22 @@ void Compositor::Layout() {
}
scoped_ptr<cc::OutputSurface> Compositor::CreateOutputSurface(bool fallback) {
- return context_factory_->CreateOutputSurface(this, fallback);
+ scoped_ptr<cc::OutputSurface> output_surface =
+ context_factory_->CreateOutputSurface(this, fallback);
+ // Keep this here, but can be used when DidInitializeOutputSurface() is false.
+ DCHECK(!output_surface_weak_ptr_);
+ output_surface_weak_ptr_ = output_surface->GetWeakPtr();
+ return output_surface.Pass();
+}
+
+void Compositor::DidInitializeOutputSurface() {
+ DCHECK(output_surface_weak_ptr_);
+ output_surface_lost_ = false;
+}
+
+void Compositor::DidLoseOutputSurface() {
+ output_surface_lost_ = true;
+ output_surface_weak_ptr_.reset();
}
void Compositor::DidCommit() {
@@ -378,6 +453,13 @@ void Compositor::ScheduleAnimation() {
ScheduleComposite();
}
+void Compositor::SendBeginFrameToChildren(const cc::BeginFrameArgs& args) {
+ FOR_EACH_OBSERVER(CompositorBeginFrameObserver,
+ begin_frame_observer_list_,
+ OnSendBeginFrame(args));
+ last_begin_frame_args_ = args;
+}
+
void Compositor::DidPostSwapBuffers() {
DCHECK(!compositor_thread_loop_.get());
DCHECK_EQ(swap_state_, SWAP_NONE);
@@ -449,4 +531,8 @@ void Compositor::NotifyEnd() {
CompositorObserver, observer_list_, OnCompositingEnded(this));
}
+void Compositor::SetChildrenNeedBeginFrames(bool need_begin_frame) {
+ host_->SetChildrenNeedBeginFrames(need_begin_frame);
+}
+
} // namespace ui
« no previous file with comments | « ui/compositor/compositor.h ('k') | ui/compositor/compositor.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698