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