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

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

Issue 1552963002: Initial checkin of the new Mozart compositor. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-11
Patch Set: Created 4 years, 12 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/scene_def.h
diff --git a/services/gfx/compositor/graph/scene_def.h b/services/gfx/compositor/graph/scene_def.h
new file mode 100644
index 0000000000000000000000000000000000000000..973e22a8ef4c2f34aa1226867ea3bb623904f1e6
--- /dev/null
+++ b/services/gfx/compositor/graph/scene_def.h
@@ -0,0 +1,171 @@
+// 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_GRAPH_SCENE_DEF_H_
+#define SERVICES_GFX_COMPOSITOR_GRAPH_SCENE_DEF_H_
+
+#include <iosfwd>
+#include <memory>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "mojo/services/gfx/composition/interfaces/scenes.mojom.h"
+#include "services/gfx/compositor/graph/node_def.h"
+
+namespace compositor {
+
+class RenderLayer;
+class RenderLayerBuilder;
+class SceneDef;
+class SnapshotBuilder;
+
+// Resolves a scene token to a scene definition.
+using SceneResolver =
+ base::Callback<SceneDef*(mojo::gfx::composition::SceneToken*)>;
+
+// Sends a scene unavailable message with the specified resource id.
+using SceneUnavailableSender = base::Callback<void(uint32_t)>;
+
+// Scene definition.
+// Contains all of the resources and nodes of a published scene.
+class SceneDef {
+ public:
+ // Outcome of a call to |Present|.
+ enum class Disposition {
+ kUnchanged,
+ kSucceeded,
+ kFailed,
+ };
+
+ SceneDef(mojo::gfx::composition::SceneTokenPtr scene_token,
+ const std::string& label);
+ ~SceneDef();
+
+ // Gets the token used to refer to this scene globally.
+ // Caller does not obtain ownership of the token.
+ mojo::gfx::composition::SceneToken* scene_token() {
+ return scene_token_.get();
+ }
+
+ // Gets the currently published scene graph version.
+ uint32_t version() { return version_; }
+
+ // Gets the root node, or nullptr if none.
+ NodeDef* root_node() { return root_node_; }
+
+ // Enqueues a pending update event to the scene graph.
+ void EnqueueUpdate(mojo::gfx::composition::SceneUpdatePtr update);
+
+ // Enqueues a pending publish event to the scene graph.
+ // The changes are not applied until |ApplyChanges| is called.
+ void EnqueuePublish(mojo::gfx::composition::SceneMetadataPtr metadata);
+
+ // Applies published updates to the scene up to the point indicated by
+ // |presentation_time|.
+ //
+ // Returns a value which indicates whether the updates succeded.
+ // If the result is |kFailed|, the scene graph was left in an unusable
+ // and inconsistent state and must be destroyed.
+ Disposition Present(int64_t presentation_time,
+ const SceneResolver& resolver,
+ const SceneUnavailableSender& unavailable_sender,
+ std::ostream& err);
+
+ // Unlinks references to another scene which has been unregistered.
+ // Causes |OnResourceUnavailable()| to be delivered to the scene for all
+ // invalidated scene resources. Returns true if any changes were made.
+ bool UnlinkReferencedScene(SceneDef* scene,
+ const SceneUnavailableSender& unavailable_sender);
+
+ // Generates a snapshot of the scene.
+ // Returns true if successful, false if the scene is blocked from rendering.
+ bool Snapshot(SnapshotBuilder* snapshot_builder,
+ RenderLayerBuilder* layer_builder);
+
+ // Finds the resource with the specified id.
+ // Returns nullptr if not found.
+ ResourceDef* FindResource(uint32_t resource_id,
+ ResourceDef::Type resource_type);
+ SceneResourceDef* FindSceneResource(uint32_t scene_resource_id) {
+ return static_cast<SceneResourceDef*>(
+ FindResource(scene_resource_id, ResourceDef::Type::kScene));
+ }
+ ImageResourceDef* FindImageResource(uint32_t image_resource_id) {
+ return static_cast<ImageResourceDef*>(
+ FindResource(image_resource_id, ResourceDef::Type::kImage));
+ }
+
+ // Finds the node with the specified id.
+ // Returns nullptr if not found.
+ NodeDef* FindNode(uint32_t node_id);
+
+ const std::string& label() { return label_; }
+ std::string FormattedLabel();
+
+ private:
+ struct Publication {
+ Publication(mojo::gfx::composition::SceneMetadataPtr metadata);
+ ~Publication();
+
+ bool is_due(int64_t presentation_time) const {
+ return metadata->presentation_time <= presentation_time;
+ }
+
+ mojo::gfx::composition::SceneMetadataPtr metadata;
+ std::vector<mojo::gfx::composition::SceneUpdatePtr> updates;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Publication);
+ };
+
+ bool ApplyUpdate(mojo::gfx::composition::SceneUpdatePtr update,
+ const SceneResolver& resolver,
+ const SceneUnavailableSender& unavailable_sender,
+ std::ostream& err);
+ bool Validate(std::ostream& err);
+
+ bool SnapshotInner(SnapshotBuilder* snapshot_builder,
+ RenderLayerBuilder* layer_builder);
+ std::shared_ptr<RenderLayer> SnapshotLayer(SnapshotBuilder* snapshot_builder);
+ void Invalidate();
+ bool HasSceneResources();
+
+ ResourceDef* CreateResource(uint32_t resource_id,
+ mojo::gfx::composition::ResourcePtr resource_decl,
+ const SceneResolver& resolver,
+ const SceneUnavailableSender& unavailable_sender,
+ std::ostream& err);
+ NodeDef* CreateNode(uint32_t node_id,
+ mojo::gfx::composition::NodePtr node_decl,
+ std::ostream& err);
+ NodeOp* CreateNodeOp(uint32_t node_id,
+ mojo::gfx::composition::NodeOpPtr node_op_decl,
+ std::ostream& err);
+
+ mojo::gfx::composition::SceneTokenPtr scene_token_;
+ const std::string label_;
+ std::string formatted_label_cache_;
+
+ uint32_t version_ = mojo::gfx::composition::kSceneVersionNone;
+ std::vector<mojo::gfx::composition::SceneUpdatePtr> pending_updates_;
+ std::vector<std::unique_ptr<Publication>> pending_publications_;
+ std::unordered_map<uint32_t, std::unique_ptr<ResourceDef>> resources_;
+ std::unordered_map<uint32_t, std::unique_ptr<NodeDef>> nodes_;
+ NodeDef* root_node_ = nullptr;
+
+ std::shared_ptr<RenderLayer> cached_layer_;
+
+ // 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(SceneDef);
+};
+
+} // namespace compositor
+
+#endif // SERVICES_GFX_COMPOSITOR_GRAPH_SCENE_DEF_H_

Powered by Google App Engine
This is Rietveld 408576698