Index: mojo/services/surfaces/surfaces_scheduler.cc |
diff --git a/mojo/services/surfaces/surfaces_scheduler.cc b/mojo/services/surfaces/surfaces_scheduler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a86dd905b607ba8f5da50049962fb1791a3a363f |
--- /dev/null |
+++ b/mojo/services/surfaces/surfaces_scheduler.cc |
@@ -0,0 +1,113 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/services/surfaces/surfaces_scheduler.h" |
+ |
+#include "cc/surfaces/display.h" |
+ |
+namespace surfaces { |
+ |
+SurfacesScheduler::SurfacesScheduler() { |
+ cc::SchedulerSettings settings; |
+ scheduler_ = cc::Scheduler::Create( |
+ this, settings, 0, base::MessageLoop::current()->task_runner(), nullptr); |
+ scheduler_->SetCanStart(); |
+ scheduler_->SetVisible(true); |
+ scheduler_->SetCanDraw(true); |
+ scheduler_->SetNeedsCommit(); |
+} |
+ |
+SurfacesScheduler::~SurfacesScheduler() { |
+} |
+ |
+void SurfacesScheduler::SetNeedsDraw() { |
+ // Don't tell the scheduler we need to draw if we have no active displays |
+ // which can happen if we haven't initialized displays yet or if all active |
+ // displays have lost their context. |
+ if (!displays_.empty()) |
+ scheduler_->SetNeedsRedraw(); |
+} |
+ |
+void SurfacesScheduler::OnVSyncParametersUpdated(base::TimeTicks timebase, |
+ base::TimeDelta interval) { |
+ scheduler_->CommitVSyncParameters(timebase, interval); |
+} |
+ |
+void SurfacesScheduler::AddDisplay(cc::Display* display) { |
+ DCHECK(displays_.find(display) == displays_.end()); |
+ displays_.insert(display); |
+} |
+ |
+void SurfacesScheduler::RemoveDisplay(cc::Display* display) { |
+ auto it = displays_.find(display); |
+ DCHECK(it != displays_.end()); |
+ displays_.erase(it); |
+} |
+ |
+void SurfacesScheduler::WillBeginImplFrame(const cc::BeginFrameArgs& args) { |
+} |
+ |
+void SurfacesScheduler::ScheduledActionSendBeginMainFrame() { |
+ scheduler_->NotifyBeginMainFrameStarted(); |
+ scheduler_->NotifyReadyToCommit(); |
+} |
+ |
+cc::DrawResult SurfacesScheduler::ScheduledActionDrawAndSwapIfPossible() { |
+ base::TimeTicks start = base::TimeTicks::Now(); |
+ for (const auto& it : displays_) { |
+ it->Draw(); |
+ } |
+ base::TimeDelta duration = base::TimeTicks::Now() - start; |
+ |
+ draw_estimate_ = (duration + draw_estimate_) / 2; |
+ return cc::DRAW_SUCCESS; |
+} |
+ |
+cc::DrawResult SurfacesScheduler::ScheduledActionDrawAndSwapForced() { |
+ NOTREACHED() << "ScheduledActionDrawAndSwapIfPossible always succeeds."; |
+ return cc::DRAW_SUCCESS; |
+} |
+ |
+void SurfacesScheduler::ScheduledActionAnimate() { |
+} |
+ |
+void SurfacesScheduler::ScheduledActionCommit() { |
+} |
+ |
+void SurfacesScheduler::ScheduledActionActivateSyncTree() { |
+} |
+ |
+void SurfacesScheduler::ScheduledActionBeginOutputSurfaceCreation() { |
+ scheduler_->DidCreateAndInitializeOutputSurface(); |
+} |
+ |
+void SurfacesScheduler::ScheduledActionPrepareTiles() { |
+} |
+ |
+void SurfacesScheduler::DidAnticipatedDrawTimeChange(base::TimeTicks time) { |
+} |
+ |
+base::TimeDelta SurfacesScheduler::DrawDurationEstimate() { |
+ return draw_estimate_; |
+} |
+ |
+base::TimeDelta SurfacesScheduler::BeginMainFrameToCommitDurationEstimate() { |
+ return base::TimeDelta(); |
+} |
+ |
+base::TimeDelta SurfacesScheduler::CommitToActivateDurationEstimate() { |
+ return base::TimeDelta(); |
+} |
+ |
+void SurfacesScheduler::DidBeginImplFrameDeadline() { |
+} |
+ |
+void SurfacesScheduler::SendBeginFramesToChildren( |
+ const cc::BeginFrameArgs& args) { |
+} |
+ |
+void SurfacesScheduler::SendBeginMainFrameNotExpectedSoon() { |
+} |
+ |
+} // namespace mojo |