Index: services/gfx/compositor/backend/scheduler.h |
diff --git a/services/gfx/compositor/backend/scheduler.h b/services/gfx/compositor/backend/scheduler.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ce8d3d997e89ed79928374fad036e9fb0588e05e |
--- /dev/null |
+++ b/services/gfx/compositor/backend/scheduler.h |
@@ -0,0 +1,89 @@ |
+// Copyright 2015 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. |
+ |
+#ifndef SERVICES_GFX_COMPOSITOR_BACKEND_SCHEDULER_H_ |
+#define SERVICES_GFX_COMPOSITOR_BACKEND_SCHEDULER_H_ |
+ |
+#include <limits> |
+#include <mutex> |
+ |
+#include "base/callback.h" |
+#include "base/macros.h" |
+#include "mojo/services/gfx/composition/interfaces/scheduling.mojom.h" |
+ |
+namespace compositor { |
+ |
+// A frame scheduler is responsible for deciding when to perform each |
+// phase of composition. |
+// |
+// During the "update" phase, the compositor signals each application that |
+// that it should start producing the next frame of content. |
+// |
+// During the "snapshot" phase, the compositor gathers all pending scene |
+// graph updates and produces a new frame for rendering. Rendering begins |
+// immediately after the snapshot is taken. |
+// |
+// An instance of the |Scheduler| interface is exposed by each |Output| |
+// so as to express the timing requirements of the output. |
+class Scheduler { |
+ public: |
+ // Determines the behavior of |ScheduleFrame()|. |
+ enum class SchedulingMode { |
+ // Schedules a snapshot, at minimum. |
+ kSnapshot, |
+ |
+ // Schedules an update followed by a snapshot, at minimum. |
+ kUpdateAndSnapshot, |
+ }; |
+ |
+ Scheduler() = default; |
+ virtual ~Scheduler() = default; |
+ |
+ // Schedules work for a frame. |
+ // |
+ // This function ensures that every update is followed by a snapshot |
+ // unless scheduling is suspended in the meantime. |
+ // |
+ // When |scheduling_mode| is |kSnapshot|, if there is time between now |
+ // and the snapshot during which an update can be performed, then an |
+ // update will also be scheduled before the requested snapshot. |
+ // |
+ // When |scheduling_mode| is |kUpdateAndSnapshot|, if there is time |
+ // between now and the update during which a snapshot can be performed, |
+ // then a snapshot will also be scheduled before the requested update |
+ // and the next snapshot. |
+ // |
+ // This design is intended to minimize latency by anticipating that |
+ // snapshots will be needed after updates and by scheduling updates in |
+ // advance if it is known that a snapshot will be needed on the next frame. |
+ virtual void ScheduleFrame(SchedulingMode scheduling_mode) = 0; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(Scheduler); |
+}; |
+ |
+// Scheduling callbacks. |
+// |
+// These callbacks are provided to the |Output| in order to receive the |
+// events produced by the output's associated |Scheduler|. |
+struct SchedulerCallbacks { |
+ using FrameCallback = |
+ base::Callback<void(const mojo::gfx::composition::FrameInfo&)>; |
+ |
+ SchedulerCallbacks(const FrameCallback& update_callback, |
+ const FrameCallback& snapshot_callback); |
+ ~SchedulerCallbacks(); |
+ |
+ // Called when it's time for applications to/ update the contents of |
+ // their scenes. |
+ const FrameCallback update_callback; |
+ |
+ // Called when it's time for the compositor to snapshot and submit |
+ // the next frame. |
+ const FrameCallback snapshot_callback; |
+}; |
+ |
+} // namespace compositor |
+ |
+#endif // SERVICES_GFX_COMPOSITOR_BACKEND_SCHEDULER_H_ |