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_ |