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

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

Issue 1749063002: Mozart: Improve internal scene graph representation. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-0
Patch Set: avoid unnecessary hashtable lookups Created 4 years, 10 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/scene_label.cc ('k') | services/gfx/compositor/graph/snapshot.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/gfx/compositor/graph/snapshot.h
diff --git a/services/gfx/compositor/graph/snapshot.h b/services/gfx/compositor/graph/snapshot.h
index 21c17b75023adca08e966b224dc1028aa3058879..d2d448a726cf5624511f297807cad72a4b04fdd8 100644
--- a/services/gfx/compositor/graph/snapshot.h
+++ b/services/gfx/compositor/graph/snapshot.h
@@ -7,15 +7,20 @@
#include <iosfwd>
#include <memory>
+#include <unordered_map>
#include <unordered_set>
#include "base/macros.h"
+#include "base/memory/ref_counted.h"
#include "mojo/services/geometry/interfaces/geometry.mojom.h"
#include "mojo/services/gfx/composition/interfaces/scheduling.mojom.h"
namespace compositor {
+class NodeDef;
class SceneDef;
+class SceneContent;
+class SceneNodeDef;
class RenderFrame;
// Describes a single frame snapshot of the scene graph, sufficient for
@@ -33,9 +38,16 @@ class RenderFrame;
//
// Snapshot objects are not thread-safe since they have direct references to
// the scene graph definition. However, the snapshot's frame is thread-safe
-// and is intended to be shared by other components.
+// and is intended to be sent to the backend rasterizer.
class Snapshot {
public:
+ // Describes the result of a snapshot operation.
+ enum class Disposition {
+ kSuccess, // The snapshot was successful.
+ kBlocked, // The node was blocked from rendering.
+ kCycle, // The node was blocked due to a cycle, must unwind fully.
+ };
+
~Snapshot();
// Returns true if the snapshot is valid.
@@ -61,28 +73,53 @@ class Snapshot {
//
// Returns true if the snapshot became invalid as a result of this operation,
// or false if it was already invalid.
- bool InvalidateScene(SceneDef* scene_def);
+ bool InvalidateScene(const SceneDef* scene_def);
+
+ // Returns true if the specified node was blocked from rendering.
+ // Only meaningful while the snapshot is valid.
+ bool IsBlocked(const NodeDef* node) const;
+
+ // Gets the scene content which was resolved by following a scene node link.
+ // Only meaningful while the snapshot is valid.
+ const SceneContent* GetResolvedSceneContent(
+ const SceneNodeDef* scene_node) const;
private:
friend class SnapshotBuilder;
Snapshot();
- std::unordered_set<SceneDef*> dependencies_;
+ void ClearContent();
+
+ // Just the set of dependent scene tokens. Used for invalidation.
+ std::unordered_set<uint32_t> dependencies_;
+
+ // The root scene in the graph.
+ // This reference together with |resolved_scenes| retains all of the
+ // nodes used by the snapshot so that we can use bare pointers for nodes
+ // and avoid excess reference counting overhead in other data structures.
+ scoped_refptr<const SceneContent> root_scene_content_;
+
+ // Map of scenes which were resolved from scene nodes.
+ std::unordered_map<const SceneNodeDef*, scoped_refptr<const SceneContent>>
+ resolved_scene_contents_;
+
+ // Node states, true if snapshotted successfully, false if blocked.
+ std::unordered_map<const NodeDef*, Disposition> node_dispositions_;
+
+ // A frame ready to be rendered.
std::shared_ptr<RenderFrame> frame_;
+
+ // True if the snapshot is still valid.
bool valid_ = true;
DISALLOW_COPY_AND_ASSIGN(Snapshot);
};
-// Builder for snapshots.
+// Builds a table of all of the state which will be required for rendering
+// a scene graph.
class SnapshotBuilder {
public:
- // Creates a snapshot builder.
- //
- // |block_log|, if not null, the snapshotter will append information to
- // this stream describing the parts of the scene graph for which
- // composition was blocked.
explicit SnapshotBuilder(std::ostream* block_log);
~SnapshotBuilder();
@@ -90,18 +127,38 @@ class SnapshotBuilder {
// describing the parts of the scene graph for which composition was blocked.
std::ostream* block_log() { return block_log_; }
- // Adds a scene dependency to the snapshot.
- void AddSceneDependency(SceneDef* scene);
+ // Snapshots the requested node.
+ Snapshot::Disposition SnapshotNode(const NodeDef* node,
+ const SceneContent* content);
+
+ // Snapshots the requested scene.
+ Snapshot::Disposition SnapshotScene(const SceneDef* scene,
+ uint32_t version,
+ const SceneNodeDef* referrer_node,
+ const SceneContent* referrer_content);
// Builds a snapshot rooted at the specified scene.
std::unique_ptr<Snapshot> Build(
- SceneDef* root_scene,
+ const SceneDef* root_scene,
const mojo::Rect& viewport,
const mojo::gfx::composition::FrameInfo& frame_info);
private:
+ // Snapshots the root scene of a renderer.
+ // This is just like |SnapshotScene| but the errors are reported a little
+ // differently since there is no referrer node.
+ Snapshot::Disposition SnapshotRenderer(const SceneDef* scene);
+
+ // Snapshots the root node of a scene and detects cycles.
+ // This is just like |SnapshotNode| but performs cycle detection which
+ // isn't otherwise needed.
+ Snapshot::Disposition SnapshotRootAndDetectCycles(
+ const NodeDef* node,
+ const SceneContent* content);
+
std::ostream* const block_log_;
std::unique_ptr<Snapshot> snapshot_;
+ const SceneContent* cycle_ = nullptr; // point where a cycle was detected
DISALLOW_COPY_AND_ASSIGN(SnapshotBuilder);
};
« no previous file with comments | « services/gfx/compositor/graph/scene_label.cc ('k') | services/gfx/compositor/graph/snapshot.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698