Chromium Code Reviews| Index: ui/compositor/compositor.cc | 
| diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc | 
| index 41fa0eb6f9a23762e5a0d220292b1ce7e82902eb..16eb0019bb292c9882dafb50b818ec11709b3953 100644 | 
| --- a/ui/compositor/compositor.cc | 
| +++ b/ui/compositor/compositor.cc | 
| @@ -63,12 +63,6 @@ void CompositorLock::CancelLock() { | 
| compositor_ = NULL; | 
| } | 
| -} // namespace ui | 
| - | 
| -namespace {} // namespace | 
| - | 
| -namespace ui { | 
| - | 
| class SatisfySwapPromise : public cc::SwapPromise { | 
| public: | 
| explicit SatisfySwapPromise(uint32_t id) : id_(id) {} | 
| @@ -98,16 +92,9 @@ Compositor::Compositor(gfx::AcceleratedWidget widget, | 
| task_runner_(task_runner), | 
| vsync_manager_(new CompositorVSyncManager()), | 
| device_scale_factor_(0.0f), | 
| - last_started_frame_(0), | 
| - last_ended_frame_(0), | 
| disable_schedule_composite_(false), | 
| compositor_lock_(NULL), | 
| - defer_draw_scheduling_(false), | 
| - waiting_on_compositing_end_(false), | 
| - draw_on_compositing_end_(false), | 
| - swap_state_(SWAP_NONE), | 
| - layer_animator_collection_(this), | 
| - schedule_draw_factory_(this) { | 
| + layer_animator_collection_(this) { | 
| root_web_layer_ = cc::Layer::Create(); | 
| CommandLine* command_line = CommandLine::ForCurrentProcess(); | 
| @@ -155,7 +142,6 @@ Compositor::Compositor(gfx::AcceleratedWidget widget, | 
| settings.impl_side_painting = IsUIImplSidePaintingEnabled(); | 
| settings.use_zero_copy = IsUIZeroCopyEnabled(); | 
| - settings.single_thread_proxy_scheduler = false; | 
| base::TimeTicks before_create = base::TimeTicks::Now(); | 
| if (compositor_thread_loop_.get()) { | 
| @@ -198,14 +184,7 @@ Compositor::~Compositor() { | 
| } | 
| void Compositor::ScheduleDraw() { | 
| - if (compositor_thread_loop_.get()) { | 
| - host_->SetNeedsCommit(); | 
| - } else if (!defer_draw_scheduling_) { | 
| - defer_draw_scheduling_ = true; | 
| - task_runner_->PostTask( | 
| - FROM_HERE, | 
| - base::Bind(&Compositor::Draw, schedule_draw_factory_.GetWeakPtr())); | 
| - } | 
| + host_->SetNeedsCommit(); | 
| } | 
| void Compositor::SetRootLayer(Layer* root_layer) { | 
| @@ -226,44 +205,19 @@ void Compositor::SetHostHasTransparentBackground( | 
| host_->set_has_transparent_background(host_has_transparent_background); | 
| } | 
| -void Compositor::Draw() { | 
| - DCHECK(!compositor_thread_loop_.get()); | 
| - | 
| - defer_draw_scheduling_ = false; | 
| - if (waiting_on_compositing_end_) { | 
| - draw_on_compositing_end_ = true; | 
| - return; | 
| - } | 
| - if (!root_layer_) | 
| - return; | 
| - | 
| - TRACE_EVENT_ASYNC_BEGIN0("ui", "Compositor::Draw", last_started_frame_ + 1); | 
| - | 
| - DCHECK_NE(swap_state_, SWAP_POSTED); | 
| - swap_state_ = SWAP_NONE; | 
| - | 
| - waiting_on_compositing_end_ = true; | 
| - last_started_frame_++; | 
| - if (!IsLocked()) { | 
| - // TODO(nduca): Temporary while compositor calls | 
| - // compositeImmediately() directly. | 
| - cc::BeginFrameArgs args = | 
| - cc::BeginFrameArgs::Create(gfx::FrameTime::Now(), | 
| - base::TimeTicks(), | 
| - cc::BeginFrameArgs::DefaultInterval()); | 
| - BeginMainFrame(args); | 
| - host_->Composite(args.frame_time); | 
| - } | 
| - if (swap_state_ == SWAP_NONE) | 
| - NotifyEnd(); | 
| -} | 
| - | 
| void Compositor::ScheduleFullRedraw() { | 
| + // TODO(enne): Some callers (mac) call this function expecting that it | 
| + // will also commit. This should probably just redraw the screen | 
| + // from damage and not commit. ScheduleDraw/ScheduleRedraw need | 
| + // better names. | 
| host_->SetNeedsRedraw(); | 
| + host_->SetNeedsCommit(); | 
| } | 
| void Compositor::ScheduleRedrawRect(const gfx::Rect& damage_rect) { | 
| + // TODO(enne): Make this not commit. See ScheduleFullRedraw. | 
| host_->SetNeedsRedrawRect(damage_rect); | 
| + host_->SetNeedsCommit(); | 
| } | 
| void Compositor::FinishAllRendering() { | 
| @@ -346,6 +300,11 @@ bool Compositor::HasAnimationObserver(CompositorAnimationObserver* observer) { | 
| } | 
| void Compositor::BeginMainFrame(const cc::BeginFrameArgs& args) { | 
| + // If a compositor lock is grabbed before BeginMainFrame, commit would be | 
| + // deferred. It is possible for compositor lock to be grabbed after | 
| + // BeginMainFrame, but then it is too late to stop commit and we will go | 
| + // through it anyway. | 
| 
 
piman
2014/10/14 20:50:11
I think that's a problem... It means we'll flash d
 
danakj
2014/10/14 20:52:49
Once beginframe has happened the main thread has a
 
 | 
| + DCHECK(!IsLocked()); | 
| FOR_EACH_OBSERVER(CompositorAnimationObserver, | 
| animation_observer_list_, | 
| OnAnimationStep(args.frame_time)); | 
| @@ -368,52 +327,36 @@ void Compositor::RequestNewOutputSurface(bool fallback) { | 
| } | 
| void Compositor::DidCommit() { | 
| - DCHECK(!IsLocked()); | 
| FOR_EACH_OBSERVER(CompositorObserver, | 
| observer_list_, | 
| OnCompositingDidCommit(this)); | 
| } | 
| void Compositor::DidCommitAndDrawFrame() { | 
| - base::TimeTicks start_time = gfx::FrameTime::Now(); | 
| - FOR_EACH_OBSERVER(CompositorObserver, | 
| - observer_list_, | 
| - OnCompositingStarted(this, start_time)); | 
| } | 
| void Compositor::DidCompleteSwapBuffers() { | 
| + // DidPostSwapBuffers is a SingleThreadProxy-only feature. Synthetically | 
| + // generate OnCompositingStarted messages for the threaded case so that | 
| + // OnCompositingStarted/OnCompositingEnded messages match. | 
| if (compositor_thread_loop_.get()) { | 
| - NotifyEnd(); | 
| - } else { | 
| - DCHECK_EQ(swap_state_, SWAP_POSTED); | 
| - NotifyEnd(); | 
| - swap_state_ = SWAP_COMPLETED; | 
| + base::TimeTicks start_time = gfx::FrameTime::Now(); | 
| + FOR_EACH_OBSERVER(CompositorObserver, | 
| + observer_list_, | 
| + OnCompositingStarted(this, start_time)); | 
| } | 
| -} | 
| - | 
| -void Compositor::ScheduleComposite() { | 
| - if (!disable_schedule_composite_) | 
| - ScheduleDraw(); | 
| -} | 
| - | 
| -void Compositor::ScheduleAnimation() { | 
| - ScheduleComposite(); | 
| + FOR_EACH_OBSERVER( | 
| + CompositorObserver, observer_list_, OnCompositingEnded(this)); | 
| } | 
| void Compositor::DidPostSwapBuffers() { | 
| - DCHECK(!compositor_thread_loop_.get()); | 
| - DCHECK_EQ(swap_state_, SWAP_NONE); | 
| - swap_state_ = SWAP_POSTED; | 
| + base::TimeTicks start_time = gfx::FrameTime::Now(); | 
| + FOR_EACH_OBSERVER(CompositorObserver, | 
| + observer_list_, | 
| + OnCompositingStarted(this, start_time)); | 
| } | 
| void Compositor::DidAbortSwapBuffers() { | 
| - if (!compositor_thread_loop_.get()) { | 
| - if (swap_state_ == SWAP_POSTED) { | 
| - NotifyEnd(); | 
| - swap_state_ = SWAP_COMPLETED; | 
| - } | 
| - } | 
| - | 
| FOR_EACH_OBSERVER(CompositorObserver, | 
| observer_list_, | 
| OnCompositingAborted(this)); | 
| @@ -441,8 +384,7 @@ cc::SurfaceSequence Compositor::InsertSurfaceSequenceForNextFrame() { | 
| scoped_refptr<CompositorLock> Compositor::GetCompositorLock() { | 
| if (!compositor_lock_) { | 
| compositor_lock_ = new CompositorLock(this); | 
| - if (compositor_thread_loop_.get()) | 
| - host_->SetDeferCommits(true); | 
| + host_->SetDeferCommits(true); | 
| FOR_EACH_OBSERVER(CompositorObserver, | 
| observer_list_, | 
| OnCompositingLockStateChanged(this)); | 
| @@ -453,8 +395,7 @@ scoped_refptr<CompositorLock> Compositor::GetCompositorLock() { | 
| void Compositor::UnlockCompositor() { | 
| DCHECK(compositor_lock_); | 
| compositor_lock_ = NULL; | 
| - if (compositor_thread_loop_.get()) | 
| - host_->SetDeferCommits(false); | 
| + host_->SetDeferCommits(false); | 
| FOR_EACH_OBSERVER(CompositorObserver, | 
| observer_list_, | 
| OnCompositingLockStateChanged(this)); | 
| @@ -465,20 +406,4 @@ void Compositor::CancelCompositorLock() { | 
| compositor_lock_->CancelLock(); | 
| } | 
| -void Compositor::NotifyEnd() { | 
| - last_ended_frame_++; | 
| - TRACE_EVENT_ASYNC_END0("ui", "Compositor::Draw", last_ended_frame_); | 
| - waiting_on_compositing_end_ = false; | 
| - if (draw_on_compositing_end_) { | 
| - draw_on_compositing_end_ = false; | 
| - | 
| - // Call ScheduleDraw() instead of Draw() in order to allow other | 
| - // CompositorObservers to be notified before starting another | 
| - // draw cycle. | 
| - ScheduleDraw(); | 
| - } | 
| - FOR_EACH_OBSERVER( | 
| - CompositorObserver, observer_list_, OnCompositingEnded(this)); | 
| -} | 
| - | 
| } // namespace ui |