Index: mojo/services/gfx/composition/interfaces/scenes.mojom |
diff --git a/mojo/services/gfx/composition/interfaces/scenes.mojom b/mojo/services/gfx/composition/interfaces/scenes.mojom |
new file mode 100644 |
index 0000000000000000000000000000000000000000..759ee72d2a0e3dcb0144b20d41864fbae8e38e6a |
--- /dev/null |
+++ b/mojo/services/gfx/composition/interfaces/scenes.mojom |
@@ -0,0 +1,213 @@ |
+// 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. |
+ |
+[DartPackage="mojo_services"] |
+module mojo.gfx.composition; |
+ |
+import "mojo/services/gfx/composition/interfaces/nodes.mojom"; |
+import "mojo/services/gfx/composition/interfaces/resources.mojom"; |
+import "mojo/services/gfx/composition/interfaces/scene_token.mojom"; |
+import "mojo/services/gfx/composition/interfaces/scheduling.mojom"; |
+ |
+// The node id which represents the root of a scene. |
+// |
+// Every scene should have a root node which uses this id unless the scene |
+// has no content at all. |
+const uint32 kSceneRootNodeId = 0; |
+ |
+// The scene version used as a placeholder when the version doesn't matter. |
+// |
+// This version code can be used by a consumer of a scene to express that |
+// it would like to consume the latest version of the scene. |
+// |
+// This version code can also be used by a scene itself if it has not |
+// received any other specific indications as to the version it should |
+// report when publishing its content. |
+const uint32 kSceneVersionNone = 0; |
+ |
+// A scene component maintains a description of some graphical content which |
+// an application would like to render. This description consists of |
+// resources and nodes. |
+// |
+// Use |Compositor.RegisterScene()| to register a scene. The application |
+// uses the |Scene| interface to manage the scene's content and implements |
+// the |SceneListener| interface to handle events. |
+// |
+// CONTENT |
+// |
+// Resources are references to foreign objects which are being imported into |
+// the scene graph, such as images and other scenes. Each resource must be |
+// given a locally unique identifier when it is bound to the scene. |
+// |
+// Nodes express the geometry and content of the scene, such as images and |
+// references to embedded scenes. Nodes are arranged to form a directed |
+// acyclic graph of drawing commands. |
+// |
+// The root node of the scene has the special id of |kSceneRootNodeId|. |
+// |
+// ATOMICITY |
+// |
+// To ensure atomicity of updates, the evolution of a scene occurs in two |
+// phases: update and publish. Incremental changes to the scene made during |
+// the update phase are not observed until published. |
+// |
+// - Update phase: To construct the next state of a scene, the scene owner |
+// issues any number of scene update requests to add, update, or remove |
+// resources and nodes. |
+// |
+// - Publish phase: When the next state of a scene is fully constructed, the |
+// scene owner issues a request to publish its changes to the scene and |
+// assigns it a version identifier. The version identifer may be used |
+// in scene references to coordinate updates across multiple scenes which |
+// must be synchronized. |
+// |
+// Once the scene has been published, the scene owner may begin to construct |
+// the next state without disrupting the state just published. |
+// |
+// SYNCHRONIZATION |
+// |
+// To ensure synchronization of updates across scenes, some additional work |
+// is needed. |
+// |
+// For example, consider the case of a scene X which embeds two other scenes |
+// A and B. If X changes size, it may need to resize A and B as well to |
+// fit properly within its layout. |
+// |
+// To do so, X sends the owners of A and B each a message indicating the |
+// new size it desires along with new scene version identifiers V(A) and |
+// V(B) which the owners of A and B must use when they publish the new scene |
+// state which incorporates the requested size change. |
+// |
+// Meanwhile, X produces a new scene of its own taking into account its |
+// new size. As part of constructing this new scene, it binds to the V(A) |
+// and V(B) versions of A and B to express its dependence on A and B |
+// having been updated to the new size. |
+// |
+// Propagating version information top-down through the scene graph in |
+// this manner allows for state changes to be synchronized in a purely |
+// feed-forward manner. |
+// |
+// CONCURRENCY |
+// |
+// In the above synchronization example, version numbers were used to |
+// couple the state of one scene with others that it depends on. |
+// What should happen if these dependencies are not satisfied promptly? |
+// |
+// Suppose X and A quickly produce new scenes with the new size but |
+// B is taking longer than anticipated to do so. We have a few choices: |
+// |
+// - Stall: The compositor could continue to show the old state of X, A, and B |
+// until such time as all three have published their new versions. |
+// |
+// - Recover: The compositor could realize that X and A are already up to date |
+// but B is lagging and choose to apply a transformation to B's old content |
+// cover for the lag, such as by scaling, clipping, masking, or discarding |
+// B's old content. |
+// |
+// - Speculate: The compositor could allow X to provide alternate descriptions |
+// of the scene in the case where A or B are not keeping up so that it |
+// can more finely control the recovery policy. |
+// |
+// To maximize concurrency, we adopt the latter approach. |
+interface Scene { |
+ // Sets the listener for receiving events from the scene. |
+ // |
+ // If |listener| is null, then the previously set listener is removed. |
+ SetListener(SceneListener? listener); |
+ |
+ // Applies a batch of incremental updates to the contents of the scene. |
+ // |
+ // Incremental changes can be split across any number of updates but it is |
+ // more efficient to process them in batches. Updates have no visible |
+ // effect until the scene owner calls |Publish()| to publish them. |
+ // |
+ // Updates are buffered and applied when |Publish()| is called. This means |
+ // it is safe to issue an update which adds a node that refers to a resource |
+ // which is not added until a subsequent update as long as the scene is |
+ // not published in between those updates. |
+ Update(SceneUpdate update); |
+ |
+ // Publishes the scene and tags it with the specified version. |
+ // |
+ // All pending incremental updates are applied atomically when the scene |
+ // is published and the new state is labeled with the version indicated |
+ // in the associated metadata. |
+ // |
+ // The |metadata| describes how the published scene should be presented. |
+ // If null, this method behaves as if a |SceneMetadata| object initialized |
+ // with default values had been supplied. |
+ // |
+ // Publishing a scene graph applies all pending updates. It is an error |
+ // to publish updates which cause the scene state to become inconsistent, |
+ // such as by having nodes which refer to non-existent resources; the |
+ // connection will be closed. |
+ Publish(SceneMetadata? metadata); |
+ |
+ // Gets a scheduler for scheduling upcoming scene operations. |
+ GetScheduler(SceneScheduler& scheduler); |
+}; |
+ |
+// An interface applications may implement to receive events from a scene. |
+interface SceneListener { |
+ // Called when a resource has become unavailable. |
+ // |
+ // Any nodes which are using the resource will be considered blocked |
+ // until the resource is replaced or the nodes using it are removed. |
+ OnResourceUnavailable(uint32 resource_id) => (); |
+}; |
+ |
+// A batch of incremental changes to be applied to a scene. |
+struct SceneUpdate { |
+ // If true, clears all resources before processing the update. |
+ bool clear_resources = false; |
+ |
+ // If true, clears all nodes before processing the update. |
+ bool clear_nodes = false; |
+ |
+ // Resources to be added, updated, or removed, indexed by resource id. |
+ // The value replaces the definition of the resource with the given id. |
+ // If the value is null, then the resource is removed from the scene. |
+ map<uint32, Resource?>? resources; |
+ |
+ // Nodes to be added, updated, or removed, indexed by node id. |
+ // The value replaces the definition of the node with the given id. |
+ // If the value is null, then the node is removed from the scene. |
+ // |
+ // The root node must have an id of 0. |
+ map<uint32, Node?>? nodes; |
+}; |
+ |
+// Describes how a published scene should be presented. |
+struct SceneMetadata { |
+ // The scene's new version number. |
+ // |
+ // Version numbers are usually associated with requests to change the |
+ // state of the scene. For example, the embedder of this scene may send |
+ // it a request to resize its content or change its color and provide a |
+ // new version number that this scene should apply when it publishes the |
+ // first update which addresses this request. |
+ // |
+ // In general, the version number will be provided to the owner of the |
+ // scene by some other party which is in change of synchronizing updates |
+ // across multiple scenes including this one. The other party will |
+ // frequently be the owner of some other scene which embeds this one. |
+ // |
+ // In certain cases there might not be a version number provided for |
+ // synchronization. When this happens, set |version| to |kSceneVersionNone|. |
+ // |
+ // Note that version numbers are unordered; there is no need to increment |
+ // them monotonically. Values may also be reused at will. |
+ uint32 version = 0; // kSceneVersionNone |
+ |
+ // A timestamp indicating approximately when the published contents of the |
+ // scene are to be shown on the display output assuming everything is |
+ // fully rendered and submitted by the appropriate deadline. |
+ // |
+ // Expressed in microseconds in the |MojoTimeTicks| timebase. |
+ // |
+ // A value of 0 means "as soon as possible". |
+ // |
+ // See also: |FrameInfo.presentation_time|. |
+ int64 presentation_time = 0; |
+}; |