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 |