Index: cc/surfaces/display_scheduler.cc |
diff --git a/cc/surfaces/display_scheduler.cc b/cc/surfaces/display_scheduler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ce6b91566bae6fb6e73170f6151aa9ef2cbc5bf8 |
--- /dev/null |
+++ b/cc/surfaces/display_scheduler.cc |
@@ -0,0 +1,88 @@ |
+// 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 "cc/surfaces/display_scheduler.h" |
+ |
+#include "base/trace_event/trace_event.h" |
+#include "cc/output/output_surface.h" |
+#include "ui/gfx/frame_time.h" |
+ |
+namespace cc { |
+ |
+DisplayScheduler::DisplayScheduler( |
+ OutputSurface* output_surface, |
+ Display* display, |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
+ : output_surface_(output_surface), |
+ display_(display), |
+ task_runner_(task_runner), |
+ output_surface_lost_(false), |
+ need_draw_(false), |
+ pending_frames_(0), |
+ weak_ptr_factory_(this) { |
+ begin_frame_source_ = SyntheticBeginFrameSource::Create( |
+ task_runner_.get(), gfx::FrameTime::Now(), |
+ BeginFrameArgs::DefaultInterval()); |
+ begin_frame_source_->AddObserver(this); |
+} |
+ |
+DisplayScheduler::~DisplayScheduler() { |
+} |
+ |
+void DisplayScheduler::CommitVSyncParameters(base::TimeTicks timebase, |
+ base::TimeDelta interval) { |
+ if (begin_frame_source_ && interval != base::TimeDelta()) |
+ begin_frame_source_->OnUpdateVSyncParameters(timebase, interval); |
+} |
+ |
+void DisplayScheduler::DisplayDamaged() { |
+ TRACE_EVENT0("cc", "DisplayScheduler::DisplayDamaged"); |
+ begin_frame_source_->SetNeedsBeginFrames(!output_surface_lost_); |
+ need_draw_ = true; |
+} |
+ |
+void DisplayScheduler::OutputSurfaceLost() { |
+ output_surface_lost_ = true; |
+ begin_frame_source_->SetNeedsBeginFrames(false); |
+} |
+ |
+void DisplayScheduler::Draw() { |
+ TRACE_EVENT0("cc", "DisplayScheduler::Draw"); |
+ if (!need_draw_) { |
+ begin_frame_source_->SetNeedsBeginFrames(false); |
+ return; |
+ } |
+ if (pending_frames_ >= display_->GetMaxFramesPending()) |
+ return; |
+ if (output_surface_lost_) |
+ return; |
+ need_draw_ = false; |
+ base::TimeTicks start_time = gfx::FrameTime::Now(); |
+ display_->Draw(); |
+} |
+ |
+void DisplayScheduler::OnBeginFrame(const BeginFrameArgs& args) { |
+ TRACE_EVENT0("cc", "DisplayScheduler::OnBeginFrame"); |
+ current_begin_frame_args_ = args; |
+ // TODO(jbauman): Use deadline to schedule draw. |
+ task_runner_->PostTask(FROM_HERE, base::Bind(&DisplayScheduler::Draw, |
+ weak_ptr_factory_.GetWeakPtr())); |
+} |
+ |
+const BeginFrameArgs DisplayScheduler::LastUsedBeginFrameArgs() const { |
+ return current_begin_frame_args_; |
+} |
+ |
+void DisplayScheduler::AsValueInto(base::trace_event::TracedValue* dict) const { |
+} |
+ |
+void DisplayScheduler::DidSwapBuffers() { |
+ pending_frames_++; |
+} |
+ |
+void DisplayScheduler::DidSwapBuffersComplete() { |
+ pending_frames_--; |
+} |
+ |
+} // namespace cc |