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

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

Issue 1749063002: Mozart: Improve internal scene graph representation. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-0
Patch Set: 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
Index: services/gfx/compositor/graph/node_def.h
diff --git a/services/gfx/compositor/graph/node_def.h b/services/gfx/compositor/graph/node_def.h
index beff45bf189c680f253f8c6260a3ac3827b451ef..5e84d1a6634f9b27f890d40dc2da9f47c2d2103c 100644
--- a/services/gfx/compositor/graph/node_def.h
+++ b/services/gfx/compositor/graph/node_def.h
@@ -6,159 +6,153 @@
#define SERVICES_GFX_COMPOSITOR_GRAPH_NODE_DEF_H_
#include <iosfwd>
-#include <memory>
-#include <string>
#include <vector>
-#include "base/callback.h"
#include "base/macros.h"
+#include "base/memory/ref_counted.h"
#include "mojo/services/gfx/composition/interfaces/nodes.mojom.h"
-#include "services/gfx/compositor/graph/resource_def.h"
+#include "services/gfx/compositor/graph/snapshot.h"
+
+class SkCanvas;
namespace compositor {
-class RenderImage;
-class RenderLayerBuilder;
+class SceneContent;
+class SceneContentBuilder;
class SceneDef;
-class SnapshotBuilder;
-class NodeOp;
-// Scene graph node definition.
-class NodeDef {
+// Represents a scene graph node.
+//
+// The base class mainly acts as a container for other nodes and does not
+// draw any content of its own.
+//
+// Instances of this class are immutable and reference counted so they may
+// be shared by multiple versions of the same scene.
+class NodeDef : public base::RefCounted<NodeDef> {
public:
using Combinator = mojo::gfx::composition::Node::Combinator;
NodeDef(uint32_t node_id,
mojo::TransformPtr content_transform,
mojo::RectPtr content_clip,
- uint32_t hit_id,
Combinator combinator,
- const std::vector<uint32_t>& child_node_ids,
- NodeOp* op);
- ~NodeDef();
+ const std::vector<uint32_t>& child_node_ids);
- uint32_t node_id() { return node_id_; }
- const mojo::Transform* content_transform() {
+ uint32_t node_id() const { return node_id_; }
+ const mojo::Transform* content_transform() const {
return content_transform_.get();
}
- const mojo::Rect* content_clip() { return content_clip_.get(); }
- uint32_t hit_id() { return hit_id_; }
- Combinator combinator() { return combinator_; }
- const std::vector<uint32_t>& child_node_ids() { return child_node_ids_; }
- NodeOp* op() { return op_.get(); }
-
- std::string FormattedLabel(SceneDef* scene);
-
- // Updated by |Validate()|.
- const std::vector<NodeDef*>& child_nodes() { return child_nodes_; }
-
- // Validates and prepares the object for rendering.
- // Returns true if successful, false if errors were reported.
- bool Validate(SceneDef* scene, std::ostream& err);
-
- // Generates a snapshot of the node into the specified builder.
- // Returns true if successful, false if the node is blocked from rendering.
- bool Snapshot(SnapshotBuilder* snapshot_builder,
- RenderLayerBuilder* layer_builder,
- SceneDef* scene);
-
- // Generates a snapshot of the node's children into the specified builder.
- // Returns true if successful, false if the children are blocked from
- // rendering.
- bool SnapshotChildren(SnapshotBuilder* snapshot_builder,
- RenderLayerBuilder* layer_builder,
- SceneDef* scene);
+ const mojo::Rect* content_clip() const { return content_clip_.get(); }
+ Combinator combinator() const { return combinator_; }
+ const std::vector<uint32_t>& child_node_ids() const {
+ return child_node_ids_;
+ }
- private:
- bool SnapshotInner(SnapshotBuilder* snapshot_builder,
- RenderLayerBuilder* layer_builder,
- SceneDef* scene);
+ // Gets a descriptive label.
+ std::string FormattedLabel(const SceneContent* content) const;
+
+ // Called by the scene content builder to traverse the node's dependencies
+ // recursively and ensure they are included in the scene's local content.
+ // Returns true if successful, false if the node contains linkage errors.
+ virtual bool RecordContent(SceneContentBuilder* builder) const;
+
+ // Called by the snapshot builder to traverse the node's dependencies
+ // recursively follow links into other scenes, evaluate whether the
+ // node can be rendered, and record which path was taken for the purposes
+ // of satisfying combinators.
+ virtual Snapshot::Disposition RecordSnapshot(const SceneContent* content,
+ SnapshotBuilder* builder) const;
+
+ // Called to record drawing commands from a snapshot.
+ void RecordPicture(const SceneContent* content,
+ const Snapshot* snapshot,
+ SkCanvas* canvas) const;
+
+ protected:
+ friend class base::RefCounted<NodeDef>;
+ virtual ~NodeDef();
+
+ // Applies a unary function to the children selected by the node's
+ // combinator rule during a snapshot.
+ // Stops when |Func| returns false.
+ // |Func| should have the signature |bool func(const NodeDef*)|.
+ template <typename Func>
+ void TraverseSnapshottedChildren(const SceneContent* content,
+ const Snapshot* snapshot,
+ const Func& func) const;
+
+ virtual void RecordPictureInner(const SceneContent* content,
+ const Snapshot* snapshot,
+ SkCanvas* canvas) const;
- uint32_t node_id_;
+ private:
+ uint32_t const node_id_;
mojo::TransformPtr const content_transform_;
mojo::RectPtr const content_clip_;
- uint32_t const hit_id_;
Combinator const combinator_;
std::vector<uint32_t> const child_node_ids_;
- std::unique_ptr<NodeOp> const op_;
-
- std::vector<NodeDef*> child_nodes_;
-
- // Used to detect cycles during a snapshot operation.
- // This is safe because the object will only be used by a single thread.
- bool visited_ = false;
DISALLOW_COPY_AND_ASSIGN(NodeDef);
};
-// Abstract scene graph node operation.
-class NodeOp {
+// Represents a rectangle node.
+//
+// Draws a solid color filled rectangle node underneath its children.
+class RectNodeDef : public NodeDef {
public:
- NodeOp() = default;
- virtual ~NodeOp() = default;
-
- // Validates and prepares the object for rendering.
- // Returns true if successful, false if errors were reported.
- virtual bool Validate(SceneDef* scene, NodeDef* node, std::ostream& err);
-
- // Generates a snapshot of the node operation into the specified builder.
- // This method is responsible for calling |SnapshotChildren| to process
- // the children of the node. Returns true if successful, false if the node
- // is blocked from rendering.
- virtual bool Snapshot(SnapshotBuilder* snapshot_builder,
- RenderLayerBuilder* layer_builder,
- SceneDef* scene,
- NodeDef* node) = 0;
+ RectNodeDef(uint32_t node_id,
+ mojo::TransformPtr content_transform,
+ mojo::RectPtr content_clip,
+ Combinator combinator,
+ const std::vector<uint32_t>& child_node_ids,
+ const mojo::Rect& content_rect,
+ const mojo::gfx::composition::Color& color);
- private:
- DISALLOW_COPY_AND_ASSIGN(NodeOp);
-};
-
-// A solid color filled rectangle node definition.
-class RectNodeOp : public NodeOp {
- public:
- RectNodeOp(const mojo::Rect& content_rect,
- const mojo::gfx::composition::Color& color);
- ~RectNodeOp() override;
+ const mojo::Rect& content_rect() const { return content_rect_; }
+ const mojo::gfx::composition::Color& color() const { return color_; }
- const mojo::Rect& content_rect() { return content_rect_; }
- const mojo::gfx::composition::Color& color() { return color_; }
+ protected:
+ ~RectNodeDef() override;
- bool Snapshot(SnapshotBuilder* snapshot_builder,
- RenderLayerBuilder* layer_builder,
- SceneDef* scene,
- NodeDef* node) override;
+ void RecordPictureInner(const SceneContent* content,
+ const Snapshot* snapshot,
+ SkCanvas* canvas) const override;
private:
- mojo::Rect content_rect_;
- mojo::gfx::composition::Color color_;
+ mojo::Rect const content_rect_;
+ mojo::gfx::composition::Color const color_;
- DISALLOW_COPY_AND_ASSIGN(RectNodeOp);
+ DISALLOW_COPY_AND_ASSIGN(RectNodeDef);
};
-// An image filled rectangle node definition.
-class ImageNodeOp : public NodeOp {
+// Represents an image node.
+//
+// Draws an image filled rectangle underneath its children.
+class ImageNodeDef : public NodeDef {
public:
- ImageNodeOp(const mojo::Rect& content_rect,
- mojo::RectPtr image_rect,
- uint32 image_resource_id,
- mojo::gfx::composition::BlendPtr blend);
- ~ImageNodeOp() override;
-
- const mojo::Rect& content_rect() { return content_rect_; }
- mojo::Rect* image_rect() { return image_rect_.get(); }
- uint32_t image_resource_id() { return image_resource_id_; }
- mojo::gfx::composition::Blend* blend() { return blend_.get(); }
-
- // Updated by |Validate()|.
- ImageResourceDef* image_resource() { return image_resource_; }
-
- bool Validate(SceneDef* scene, NodeDef* node, std::ostream& err) override;
-
- bool Snapshot(SnapshotBuilder* snapshot_builder,
- RenderLayerBuilder* layer_builder,
- SceneDef* scene,
- NodeDef* node) override;
+ ImageNodeDef(uint32_t node_id,
+ mojo::TransformPtr content_transform,
+ mojo::RectPtr content_clip,
+ Combinator combinator,
+ const std::vector<uint32_t>& child_node_ids,
+ const mojo::Rect& content_rect,
+ mojo::RectPtr image_rect,
+ uint32 image_resource_id,
+ mojo::gfx::composition::BlendPtr blend);
+
+ const mojo::Rect& content_rect() const { return content_rect_; }
+ const mojo::Rect* image_rect() const { return image_rect_.get(); }
+ uint32_t image_resource_id() const { return image_resource_id_; }
+ const mojo::gfx::composition::Blend* blend() const { return blend_.get(); }
+
+ bool RecordContent(SceneContentBuilder* builder) const override;
+
+ protected:
+ ~ImageNodeDef() override;
+
+ void RecordPictureInner(const SceneContent* content,
+ const Snapshot* snapshot,
+ SkCanvas* canvas) const override;
private:
mojo::Rect const content_rect_;
@@ -166,58 +160,72 @@ class ImageNodeOp : public NodeOp {
uint32_t const image_resource_id_;
mojo::gfx::composition::BlendPtr const blend_;
- ImageResourceDef* image_resource_ = nullptr;
-
- DISALLOW_COPY_AND_ASSIGN(ImageNodeOp);
+ DISALLOW_COPY_AND_ASSIGN(ImageNodeDef);
};
-// An embedded scene node definition.
-class SceneNodeOp : public NodeOp {
+// Represents a scene node.
+//
+// Draws an embedded scene underneath its children.
+class SceneNodeDef : public NodeDef {
public:
- SceneNodeOp(uint32_t scene_resource_id, uint32_t scene_version);
- ~SceneNodeOp() override;
+ SceneNodeDef(uint32_t node_id,
+ mojo::TransformPtr content_transform,
+ mojo::RectPtr content_clip,
+ Combinator combinator,
+ const std::vector<uint32_t>& child_node_ids,
+ uint32_t scene_resource_id,
+ uint32_t scene_version);
+
+ uint32_t scene_resource_id() const { return scene_resource_id_; }
+ uint32_t scene_version() const { return scene_version_; }
- uint32_t scene_resource_id() { return scene_resource_id_; }
- uint32_t scene_version() { return scene_version_; }
+ bool RecordContent(SceneContentBuilder* builder) const override;
- // Updated by |Validate()|.
- SceneResourceDef* scene_resource() { return scene_resource_; }
+ Snapshot::Disposition RecordSnapshot(const SceneContent* content,
+ SnapshotBuilder* builder) const override;
- bool Validate(SceneDef* scene, NodeDef* node, std::ostream& err) override;
+ protected:
+ ~SceneNodeDef() override;
- bool Snapshot(SnapshotBuilder* snapshot_builder,
- RenderLayerBuilder* layer_builder,
- SceneDef* scene,
- NodeDef* node) override;
+ void RecordPictureInner(const SceneContent* content,
+ const Snapshot* snapshot,
+ SkCanvas* canvas) const override;
private:
uint32_t const scene_resource_id_;
uint32_t const scene_version_;
- SceneResourceDef* scene_resource_ = nullptr;
-
- DISALLOW_COPY_AND_ASSIGN(SceneNodeOp);
+ DISALLOW_COPY_AND_ASSIGN(SceneNodeDef);
};
-// A composited layer node definition.
-class LayerNodeOp : public NodeOp {
+// Represents a layer node.
+//
+// Composites its children to a layer and applies a blending operation.
+class LayerNodeDef : public NodeDef {
public:
- LayerNodeOp(const mojo::Size& size, mojo::gfx::composition::BlendPtr blend);
- ~LayerNodeOp() override;
+ LayerNodeDef(uint32_t node_id,
+ mojo::TransformPtr content_transform,
+ mojo::RectPtr content_clip,
+ Combinator combinator,
+ const std::vector<uint32_t>& child_node_ids,
+ const mojo::Size& size,
+ mojo::gfx::composition::BlendPtr blend);
+
+ const mojo::Size& size() const { return size_; }
+ const mojo::gfx::composition::Blend* blend() const { return blend_.get(); }
- const mojo::Size& size() { return size_; }
- mojo::gfx::composition::Blend* blend() { return blend_.get(); }
+ protected:
+ ~LayerNodeDef() override;
- bool Snapshot(SnapshotBuilder* snapshot_builder,
- RenderLayerBuilder* layer_builder,
- SceneDef* scene,
- NodeDef* node) override;
+ void RecordPictureInner(const SceneContent* content,
+ const Snapshot* snapshot,
+ SkCanvas* canvas) const override;
private:
mojo::Size const size_;
mojo::gfx::composition::BlendPtr const blend_;
- DISALLOW_COPY_AND_ASSIGN(LayerNodeOp);
+ DISALLOW_COPY_AND_ASSIGN(LayerNodeDef);
};
} // namespace compositor

Powered by Google App Engine
This is Rietveld 408576698