Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Unified Diff: services/gfx/compositor/graph/universe.h

Issue 1873573003: Mozart: Ensure time always runs forward. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-3
Patch Set: fix build error on Android Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « services/gfx/compositor/graph/snapshot.cc ('k') | services/gfx/compositor/graph/universe.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/gfx/compositor/graph/universe.h
diff --git a/services/gfx/compositor/graph/universe.h b/services/gfx/compositor/graph/universe.h
new file mode 100644
index 0000000000000000000000000000000000000000..93b7f98d3258c1f7740e9344a70978d055a2149f
--- /dev/null
+++ b/services/gfx/compositor/graph/universe.h
@@ -0,0 +1,103 @@
+// Copyright 2016 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_GRAPH_UNIVERSE_H_
+#define SERVICES_GFX_COMPOSITOR_GRAPH_UNIVERSE_H_
+
+#include <deque>
+#include <iosfwd>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "services/gfx/compositor/graph/scene_label.h"
+#include "services/gfx/compositor/graph/snapshot.h"
+
+namespace compositor {
+
+class SceneContent;
+class Snapshot;
+
+// Manages all active or pending versions of all scenes in the entire universe.
+//
+// Currently there is only one instance of the universe (this could change
+// someday). Its job is to efficiently build snapshots for rendering
+// subject to the following invariants.
+//
+// 1. Scene state evolution always progresses forwards in time. At no time
+// will an older version of a scene be included in a snapshot once a
+// newer version becomes unblocked. This is true even when the scene is
+// being rendered in multiple places.
+//
+// 2. A scene dependency which does not specify an explicit version (by
+// passing |kSceneVersionNone|) will never be blocked as long as the
+// dependent scene still exists and has published at least one unblocked
+// version. (Clients should watch for |OnResourceUnavailable| to handle
+// the case where a dependent scene spontaneously becomes unavailable.)
+//
+// 3. A scene dependency which specifies an explicit version may become
+// blocked or unblocked as the dependent scene publishes newer unblocked
+// scene versions.
+//
+// 4. Scene dependency cycles are resolved by considering all scenes within
+// the cycle to be blocked. This guarantees consistent behavior regardless
+// of how the cycle is entered.
+//
+// TODO(jeffbrown): In principle this object could keep track of scene
+// invalidations and incremental updates.
+class Universe {
+ public:
+ Universe();
+ ~Universe();
+
+ void AddScene(const SceneLabel& scene_label);
+ void PresentScene(const scoped_refptr<const SceneContent>& content);
+ void RemoveScene(const mojo::gfx::composition::SceneToken& scene_token);
+
+ scoped_refptr<const Snapshot> SnapshotScene(
+ const mojo::gfx::composition::SceneToken& scene_token,
+ uint32_t version,
+ std::ostream* block_log);
+
+ private:
+ struct SceneInfo {
+ SceneInfo(const SceneLabel& label);
+ ~SceneInfo();
+
+ SceneLabel label;
+
+ // Set to the current generation when the queue was last updated.
+ // TODO(jeffbrown): We should perform more fine-grained invalidation of
+ // scenes based on their dependencies.
+ uint64_t update_generation = 0u;
+ Snapshot::Disposition disposition = Snapshot::Disposition::kBlocked;
+ std::deque<scoped_refptr<const SceneContent>> content_queue;
+ };
+
+ class Snapshotter : public SnapshotBuilder {
+ public:
+ Snapshotter(Universe* universe, std::ostream* block_log);
+ ~Snapshotter() override;
+
+ protected:
+ Snapshot::Disposition ResolveAndSnapshotScene(
+ const mojo::gfx::composition::SceneToken& scene_token,
+ uint32_t version,
+ scoped_refptr<const SceneContent>* out_content) override;
+
+ private:
+ Universe* universe_;
+ SceneInfo* cycle_ = nullptr;
+
+ DISALLOW_COPY_AND_ASSIGN(Snapshotter);
+ };
+
+ std::unordered_map<uint32_t, std::unique_ptr<SceneInfo>> scenes_;
+ uint64_t generation_ = 0u;
+
+ DISALLOW_COPY_AND_ASSIGN(Universe);
+};
+
+} // namespace compositor
+
+#endif // SERVICES_GFX_COMPOSITOR_GRAPH_UNIVERSE_H_
« no previous file with comments | « services/gfx/compositor/graph/snapshot.cc ('k') | services/gfx/compositor/graph/universe.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698