|  | // Copyright 2017 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  | library fuchsia.ui.gfx; | 
|  |  | 
|  | using fuchsia.images; | 
|  | using fuchsia.ui.composition; | 
|  | using fuchsia.ui.views; | 
|  | using zx; | 
|  |  | 
|  | /// These are all of the types of resources that can be created within a | 
|  | /// `Session`. Add new fields only to the bottom of the list. | 
|  | type ResourceArgs = strict resource union { | 
|  | // Memory resources. | 
|  | 1: memory MemoryArgs; | 
|  | 2: image ImageArgs; | 
|  | 3: image_pipe ImagePipeArgs; | 
|  | 4: buffer BufferArgs; | 
|  |  | 
|  | // Views. | 
|  | 5: view ViewArgs; | 
|  | 6: view_holder ViewHolderArgs; | 
|  |  | 
|  | // Shapes (see shapes.fidl). | 
|  | 7: rectangle RectangleArgs; | 
|  | 8: rounded_rectangle RoundedRectangleArgs; | 
|  | 9: circle CircleArgs; | 
|  | 10: mesh MeshArgs; | 
|  |  | 
|  | // Nodes (see nodes.fidl). | 
|  | 11: shape_node ShapeNodeArgs; | 
|  | 12: clip_node ClipNodeArgs; | 
|  | 13: entity_node EntityNodeArgs; | 
|  | 14: opacity_node OpacityNodeArgsHACK; | 
|  |  | 
|  | // Materials. | 
|  | 15: material MaterialArgs; | 
|  |  | 
|  | // Layers. | 
|  | 16: compositor CompositorArgs; | 
|  | 17: display_compositor DisplayCompositorArgs; | 
|  | 18: image_pipe_compositor ImagePipeCompositorArgs; | 
|  | 19: layer_stack LayerStackArgs; | 
|  | 20: layer LayerArgs; | 
|  |  | 
|  | // Scene representation and display. | 
|  | 21: scene SceneArgs; | 
|  | 22: camera CameraArgs; | 
|  | 23: stereo_camera StereoCameraArgs; | 
|  | 24: renderer RendererArgs; | 
|  |  | 
|  | // Lighting. | 
|  | 25: ambient_light AmbientLightArgs; | 
|  | 26: directional_light DirectionalLightArgs; | 
|  |  | 
|  | // A value that can be used in place of a constant value. | 
|  | 27: variable VariableArgs; | 
|  |  | 
|  | // TODO(fxbug.dev/24428): Move these where they belong.  They're added to the end | 
|  | // of the struct temporarily until we transition to xunions. | 
|  | 28: point_light PointLightArgs; | 
|  | 29: reserved; | 
|  | 30: reserved; | 
|  | 31: view3 ViewArgs3; | 
|  | 32: image_pipe2 ImagePipe2Args; | 
|  | 33: image2 ImageArgs2; | 
|  | 34: image3 ImageArgs3; | 
|  | }; | 
|  |  | 
|  | type ImagePipeArgs = resource struct { | 
|  | image_pipe_request server_end:fuchsia.images.ImagePipe; | 
|  | }; | 
|  |  | 
|  | /// `ImagePipe2` is a `Resource` that can be used as a `Texture` for a `Material`. | 
|  | type ImagePipe2Args = resource struct { | 
|  | image_pipe_request server_end:fuchsia.images.ImagePipe2; | 
|  | }; | 
|  |  | 
|  | /// `Memory` is a `Resource` that wraps a client-provided Zircon vmo to register | 
|  | /// it with Scenic. | 
|  | // TODO: specify resizing behavior.  Who can resize?  Client/Scenic/both/none? | 
|  | type MemoryArgs = resource struct { | 
|  | /// The VMO which backs this memory. | 
|  | vmo zx.handle:VMO; | 
|  |  | 
|  | /// The amount of memory from `vmo` that should be utilized. | 
|  | allocation_size uint64; | 
|  |  | 
|  | /// The type of memory stored in the VMO, namely whether it's GPU memory or | 
|  | /// host memory. | 
|  | memory_type fuchsia.images.MemoryType; | 
|  | }; | 
|  |  | 
|  | /// An image mapped to a range of a `Memory` resource. | 
|  | // TODO: more precise and extensive docs. | 
|  | @deprecated | 
|  | type ImageArgs = struct { | 
|  | info fuchsia.images.ImageInfo; | 
|  |  | 
|  | memory_id uint32; // id of a `Memory` resource | 
|  | memory_offset uint32; // byte offset of image within `Memory` resource | 
|  | }; | 
|  |  | 
|  | /// An image mapped to a range of a `Memory` resource. | 
|  | @deprecated | 
|  | type ImageArgs2 = struct { | 
|  | width uint32; | 
|  | height uint32; | 
|  |  | 
|  | /// The id of a `BufferCollection`. Before creating this resource, the | 
|  | /// buffer collection should be registered on the same `Session` with | 
|  | /// `RegisterBufferCollection` and it should have its contraints set. | 
|  | /// Once the buffers are allocated successfully (e.g. after calling | 
|  | /// `WaitForBuffersAllocated`), the collection's id can be used to create | 
|  | /// the image resource. | 
|  | buffer_collection_id uint32; | 
|  | /// The index of the VMO from the `BufferCollection` that backs this image. | 
|  | buffer_collection_index uint32; | 
|  | }; | 
|  |  | 
|  | /// An image that is backed by a `BufferCollection` registered with `Allocator`. | 
|  | type ImageArgs3 = resource struct { | 
|  | width uint32; | 
|  | height uint32; | 
|  |  | 
|  | /// Image creation requires an allocated `BufferCollection` registered with Allocator. | 
|  | /// `import_token` should be the other end of a BufferCollectionExportToken that is | 
|  | /// successfully registered. All clients of the specified BufferCollection must have set | 
|  | /// their constraints and buffers should be allocated before calling. | 
|  | import_token fuchsia.ui.composition.BufferCollectionImportToken; | 
|  | /// The index of the VMO from the `BufferCollection` that backs this image. | 
|  | buffer_collection_index uint32; | 
|  | }; | 
|  |  | 
|  | /// A buffer mapped to a range of `Memory`. | 
|  | // TODO: replace BufferArgs with BufferArgs2 that supports sysmem. | 
|  | type BufferArgs = struct { | 
|  | memory_id uint32; // id of a `Memory` resource | 
|  | memory_offset uint32; // byte offset of buffer within `Memory` resource | 
|  | num_bytes uint32; | 
|  | }; | 
|  |  | 
|  | /// Represents the root of a subgraph within a larger scene graph.  Nodes can be | 
|  | /// attached to the `View` as children, and these Nodes will have the `View`s' | 
|  | /// coordinate transform applied to their own, in addition to being clipped to | 
|  | /// the `View`s' bounding box. | 
|  | /// See `ViewProperties`. | 
|  | /// | 
|  | /// Each `View` is linked to a paired `ViewHolder` via a shared token pair. | 
|  | /// | 
|  | /// Usually the `View` and its associated `ViewHolder` exist in separate | 
|  | /// processes.  By combining them, the UI for an entire system can be built | 
|  | /// using content contributed from many different processes. | 
|  | type ViewArgs = resource struct { | 
|  | token fuchsia.ui.views.ViewToken; | 
|  | debug_name string:optional; | 
|  | }; | 
|  |  | 
|  | /// Represents the root of a subgraph within a larger scene graph.  Nodes can be | 
|  | /// attached to the `View` as children, and these Nodes will have the `View`s' | 
|  | /// coordinate transform applied to their own, in addition to being clipped to | 
|  | /// the `View`s' bounding box. | 
|  | /// See `ViewProperties`. | 
|  | /// | 
|  | /// Each `View` is linked to a paired `ViewHolder` via a shared token pair. | 
|  | /// | 
|  | /// Usually the `View` and its associated `ViewHolder` exist in separate | 
|  | /// processes.  By combining them, the UI for an entire system can be built | 
|  | /// using content contributed from many different processes. | 
|  | /// | 
|  | /// Clients self-identify their `View` with a `ViewRef`, which is a stable | 
|  | /// identifier that may be cloned and passed to other components in a | 
|  | /// feed-forward style. It is accompanied by a `ViewRefControl`, which Scenic | 
|  | /// uses to signal `View` destruction across the system; the `ViewRefControl` | 
|  | /// must be unique - do not clone it. | 
|  | type ViewArgs3 = resource struct { | 
|  | token fuchsia.ui.views.ViewToken; | 
|  | /// `control_ref.reference` must have default eventpair rights (i.e., with | 
|  | /// signaling), minus ZX_RIGHT_DUPLICATE. | 
|  | control_ref fuchsia.ui.views.ViewRefControl; | 
|  | /// `view_ref.reference` must have basic rights (i.e., no signaling). | 
|  | view_ref fuchsia.ui.views.ViewRef; | 
|  | debug_name string:optional; | 
|  | }; | 
|  |  | 
|  | /// Represents an attachment point for a subgraph within a larger scene graph. | 
|  | /// The `ViewHolder` can be attached to a Node as a child, and the contents of | 
|  | /// the linked `View` will become a child of the Node as well. | 
|  | /// | 
|  | /// Each `ViewHolder` is linked to a paired `View` via a shared token pair. | 
|  | /// | 
|  | /// Usually the `ViewHolder` and its associated `View` exist in separate | 
|  | /// processes.  By combining them, the UI for an entire system can be built | 
|  | /// using content contributed from many different processes. | 
|  | type ViewHolderArgs = resource struct { | 
|  | token fuchsia.ui.views.ViewHolderToken; | 
|  | debug_name string:optional; | 
|  | }; | 
|  |  | 
|  | /// A Compositor draws its `LayerStack` into a framebuffer provided by its | 
|  | /// attached `Display`, if any.  If no display is attached, nothing is rendered. | 
|  | // TODO(fxbug.dev/23686): there is currently no way to create/attach a display. | 
|  | type CompositorArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// A DisplayCompositor draws its attached `LayerStack` into an image that is | 
|  | /// presented on a display. | 
|  | type DisplayCompositorArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// An ImagePipeCompositor draws its attached `LayerStack` into an image that is | 
|  | /// presented on an image-pipe. | 
|  | type ImagePipeCompositorArgs = resource struct { | 
|  | target client_end:fuchsia.images.ImagePipe; | 
|  | }; | 
|  |  | 
|  | /// A LayerStack is a stack of layers that are attached to a Compositor, which | 
|  | /// draws them in order of increasing Z-order (or rather, presents the illusion | 
|  | /// of drawing them in that order: it may apply any optimizations that don't | 
|  | /// affect the output). | 
|  | /// | 
|  | /// Supported commands: | 
|  | /// - AddLayer | 
|  | type LayerStackArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// A Layer is a 2-dimensional image that is drawn by a Compositor.  The | 
|  | /// contents of each Layer in a Layerstack are independent of each other. | 
|  | /// A layer is not drawn unless it has a camera, texture, or color. | 
|  | /// | 
|  | /// Supported commands: | 
|  | /// - Detach | 
|  | /// - SetCamera | 
|  | /// - SetColor | 
|  | /// - SetTexture | 
|  | /// - SetSize (depth must be zero) | 
|  | /// - SetSize | 
|  | /// - SetTranslation (z component determines the relative Z-ordering of layers) | 
|  | /// - SetRotation (must rotate around Z-axis) | 
|  | /// - SetScale | 
|  | type LayerArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// A Scene is the root of a scene-graph, and defines the rendering environment | 
|  | /// (lighting, etc.) for the tree of nodes beneath it. | 
|  | /// | 
|  | /// Supported commands: | 
|  | /// - Add/RemoveLight | 
|  | /// - AddChild | 
|  | type SceneArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// A Camera is used to render a Scene from a particular viewpoint.  This is | 
|  | /// achieved by setting a Renderer to use the camera. | 
|  | /// | 
|  | /// The following commands may be applied to a Camera: | 
|  | /// - SetCameraTransform | 
|  | /// - SetCameraProjection | 
|  | /// - SetCameraPoseBuffer | 
|  | type CameraArgs = struct { | 
|  | /// The scene that the camera is viewing. | 
|  | scene_id uint32; | 
|  | }; | 
|  |  | 
|  | /// A StereoCamera is a Camera that renders the scene in side-by-side stereo. | 
|  | /// | 
|  | /// Any command which can be applied to a Camera can also be applied to a | 
|  | /// StereoCamera. | 
|  | /// Additional supported commands: | 
|  | /// - SetStereoCameraProjection | 
|  | type StereoCameraArgs = struct { | 
|  | /// The scene that the camera is viewing. | 
|  | scene_id uint32; | 
|  | }; | 
|  |  | 
|  | /// A Renderer renders a Scene via a Camera. | 
|  | /// | 
|  | /// Supported commands: | 
|  | /// - SetCamera | 
|  | /// - SetRendererParam | 
|  | type RendererArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// An AmbientLight is a Light that is is assumed to be everywhere in the scene, | 
|  | /// in all directions. | 
|  | /// | 
|  | /// Supported commands: | 
|  | /// - SetLightColor | 
|  | type AmbientLightArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// A DirectionalLight is a Light that is emitted from a point at infinity. | 
|  | /// | 
|  | /// Although the light is directional, the light has some amount of angular | 
|  | /// dispersion (i.e., the light is not fully columnated). For simplicity, we | 
|  | /// assume the dispersion of the light source is symmetric about the light's | 
|  | /// primary direction. | 
|  | /// | 
|  | /// Supported commands: | 
|  | /// - SetLightColor | 
|  | /// - SetLightDirection | 
|  | type DirectionalLightArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// A PointLight is a Light that emits light in all directions.  By default, the | 
|  | /// intensity of the light falls off according to the physically based | 
|  | /// "inverse-square law" (see Wikipedia), although it can be adjusted to other | 
|  | /// values for artistic effect. | 
|  | /// | 
|  | /// Supported commands: | 
|  | /// - SetLightColor | 
|  | /// - SetPointLightPosition | 
|  | /// - SetPointLightFalloff | 
|  | type PointLightArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// Simple texture-mapped material. | 
|  | /// | 
|  | /// Supported commands: | 
|  | /// - SetTextureCmd: sets the texture, or it can be left as zero (no texture). | 
|  | ///   The texture can be an Image or ImagePipe. | 
|  | /// - SetColorCmd: sets the color. | 
|  | type MaterialArgs = struct { | 
|  | // TODO(fxbug.dev/23916): Clean up dummy args. | 
|  | dummy uint32 = 0; | 
|  | }; | 
|  |  | 
|  | /// Describes a typed, client-modifiable value. | 
|  | type VariableArgs = struct { | 
|  | type ValueType; | 
|  | initial_value Value; // Must match type.  Must not be a variable_id. | 
|  | }; | 
|  |  | 
|  | /// Describes an exported resource that is to be imported by an | 
|  | /// ImportResourceCmd. | 
|  | /// | 
|  | /// NOTE: Currently just an enum of importable resource types, but may later be | 
|  | /// expanded to express concepts like "meshes with a particular vertex format". | 
|  | type ImportSpec = strict enum { | 
|  | NODE = 0; | 
|  | }; |