| // Copyright 2019 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. |
| |
| #ifndef SRC_UI_SCENIC_LIB_GFX_ENGINE_GFX_COMMAND_APPLIER_H_ |
| #define SRC_UI_SCENIC_LIB_GFX_ENGINE_GFX_COMMAND_APPLIER_H_ |
| |
| #include <fuchsia/ui/views/cpp/fidl.h> |
| |
| #include "src/lib/fxl/memory/weak_ptr.h" |
| #include "src/ui/lib/escher/flib/fence_set_listener.h" |
| #include "src/ui/lib/escher/renderer/batch_gpu_uploader.h" |
| #include "src/ui/scenic/lib/gfx/engine/resource_map.h" |
| #include "src/ui/scenic/lib/gfx/engine/scene_graph.h" |
| #include "src/ui/scenic/lib/gfx/engine/session_context.h" |
| #include "src/ui/scenic/lib/gfx/resources/memory.h" |
| #include "src/ui/scenic/lib/gfx/resources/resource.h" |
| #include "src/ui/scenic/lib/gfx/resources/resource_context.h" |
| #include "src/ui/scenic/lib/scheduling/id.h" |
| |
| namespace scenic_impl { |
| |
| namespace display { |
| class DisplayManager; |
| } |
| |
| namespace gfx { |
| |
| class Image; |
| using ImagePtr = fxl::RefPtr<Image>; |
| |
| class ImageBase; |
| using ImageBasePtr = fxl::RefPtr<ImageBase>; |
| |
| class ImagePipe; |
| using ImagePipePtr = fxl::RefPtr<ImagePipe>; |
| |
| class Session; |
| class Sysmem; |
| |
| // Graphical context for a set of session updates. |
| // The CommandContext is only valid during a single processing batch, and should |
| // not be accessed/stored outside of that. |
| class CommandContext { |
| public: |
| // Creates an empty command context. |
| CommandContext() = default; |
| |
| CommandContext(std::unique_ptr<escher::BatchGpuUploader> uploader, Sysmem* sysmem, |
| display::DisplayManager* display_manager, fxl::WeakPtr<SceneGraph> scene_graph); |
| |
| escher::BatchGpuUploader* batch_gpu_uploader() const { return batch_gpu_uploader_.get(); } |
| |
| Sysmem* sysmem() const { return sysmem_; }; |
| display::DisplayManager* display_manager() const { return display_manager_; }; |
| SceneGraph* scene_graph() const { return scene_graph_.get(); } |
| |
| // Flush any work accumulated during command processing. |
| void Flush(); |
| |
| private: |
| std::unique_ptr<escher::BatchGpuUploader> batch_gpu_uploader_; |
| Sysmem* sysmem_ = nullptr; |
| display::DisplayManager* display_manager_ = nullptr; |
| fxl::WeakPtr<SceneGraph> scene_graph_; |
| }; |
| |
| // Responsible for applying gfx commands to sessions. |
| // Does not own any state. The session to be modified is instead |
| // passed in as an argument to ApplyCommand. |
| class GfxCommandApplier { |
| public: |
| // Apply the operation to the current session state. Return true if |
| // successful, and false if the op is somehow invalid. In the latter case, |
| // the Session is left unchanged. |
| static bool ApplyCommand(Session* session, CommandContext* command_context, |
| fuchsia::ui::gfx::Command command); |
| |
| private: |
| // Return false and logs an error to the session's ErrorReporter if the value |
| // is not of the expected type. |
| // NOTE: although failure does not halt execution of the program, |
| // it does indicate client error, and will be used by the caller |
| // to tear down the Session. |
| static bool AssertValueIsOfType(const fuchsia::ui::gfx::Value& value, |
| const fuchsia::ui::gfx::Value::Tag* tags, size_t tag_count, |
| Session* session); |
| template <size_t N> |
| static bool AssertValueIsOfType(const fuchsia::ui::gfx::Value& value, |
| const std::array<fuchsia::ui::gfx::Value::Tag, N>& tags, |
| Session* session) { |
| return AssertValueIsOfType(value, tags.data(), N, session); |
| } |
| |
| // Functions for applying specific Commands. Called by ApplyCommand(). |
| static bool ApplyCreateResourceCmd(Session* session, CommandContext* command_context, |
| fuchsia::ui::gfx::CreateResourceCmd command); |
| static bool ApplyReleaseResourceCmd(Session* session, |
| fuchsia::ui::gfx::ReleaseResourceCmd command); |
| static bool ApplyExportResourceCmd(Session* session, |
| fuchsia::ui::gfx::ExportResourceCmdDeprecated command); |
| static bool ApplyImportResourceCmd(Session* session, |
| fuchsia::ui::gfx::ImportResourceCmdDeprecated command); |
| static bool ApplyAddChildCmd(Session* session, fuchsia::ui::gfx::AddChildCmd command); |
| static bool ApplyAddPartCmd(Session* session, fuchsia::ui::gfx::AddPartCmd command); |
| static bool ApplyDetachCmd(Session* session, fuchsia::ui::gfx::DetachCmd command); |
| static bool ApplyDetachChildrenCmd(Session* session, fuchsia::ui::gfx::DetachChildrenCmd command); |
| static bool ApplySetTagCmd(Session* session, fuchsia::ui::gfx::SetTagCmd command); |
| static bool ApplySetTranslationCmd(Session* session, fuchsia::ui::gfx::SetTranslationCmd command); |
| static bool ApplySetScaleCmd(Session* session, fuchsia::ui::gfx::SetScaleCmd command); |
| static bool ApplySetRotationCmd(Session* session, fuchsia::ui::gfx::SetRotationCmd command); |
| static bool ApplySetAnchorCmd(Session* session, fuchsia::ui::gfx::SetAnchorCmd command); |
| static bool ApplySetSizeCmd(Session* session, fuchsia::ui::gfx::SetSizeCmd command); |
| static bool ApplySetOpacityCmd(Session* session, fuchsia::ui::gfx::SetOpacityCmd command); |
| static bool ApplySendSizeChangeHintCmd(Session* session, |
| fuchsia::ui::gfx::SendSizeChangeHintCmdHACK command); |
| static bool ApplySetShapeCmd(Session* session, fuchsia::ui::gfx::SetShapeCmd command); |
| static bool ApplySetMaterialCmd(Session* session, fuchsia::ui::gfx::SetMaterialCmd command); |
| static bool ApplySetClipCmd(Session* session, fuchsia::ui::gfx::SetClipCmd command); |
| static bool ApplySetClipPlanesCmd(Session* session, fuchsia::ui::gfx::SetClipPlanesCmd command); |
| static bool ApplySetViewPropertiesCmd(Session* session, |
| fuchsia::ui::gfx::SetViewPropertiesCmd command); |
| static bool ApplySetHitTestBehaviorCmd(Session* session, |
| fuchsia::ui::gfx::SetHitTestBehaviorCmd command); |
| static bool ApplySetCameraCmd(Session* session, fuchsia::ui::gfx::SetCameraCmd command); |
| static bool ApplySetCameraTransformCmd(Session* session, |
| fuchsia::ui::gfx::SetCameraTransformCmd command); |
| static bool ApplySetCameraProjectionCmd(Session* session, |
| fuchsia::ui::gfx::SetCameraProjectionCmd command); |
| static bool ApplySetStereoCameraProjectionCmd( |
| Session* session, fuchsia::ui::gfx::SetStereoCameraProjectionCmd command); |
| static bool ApplySetCameraClipSpaceTransformCmd( |
| Session* session, fuchsia::ui::gfx::SetCameraClipSpaceTransformCmd command); |
| static bool ApplySetCameraPoseBufferCmd(Session* session, |
| fuchsia::ui::gfx::SetCameraPoseBufferCmd command); |
| static bool ApplySetLightColorCmd(Session* session, fuchsia::ui::gfx::SetLightColorCmd command); |
| static bool ApplySetLightDirectionCmd(Session* session, |
| fuchsia::ui::gfx::SetLightDirectionCmd command); |
| static bool ApplySetPointLightPositionCmd(Session* session, |
| fuchsia::ui::gfx::SetPointLightPositionCmd command); |
| static bool ApplySetPointLightFalloffCmd(Session* session, |
| fuchsia::ui::gfx::SetPointLightFalloffCmd command); |
| static bool ApplyAddLightCmd(Session* session, fuchsia::ui::gfx::AddLightCmd command); |
| static bool ApplySceneAddAmbientLightCmd(Session* session, |
| fuchsia::ui::gfx::SceneAddAmbientLightCmd command); |
| static bool ApplySceneAddDirectionalLightCmd( |
| Session* session, fuchsia::ui::gfx::SceneAddDirectionalLightCmd command); |
| static bool ApplySceneAddPointLightCmd(Session* session, |
| fuchsia::ui::gfx::SceneAddPointLightCmd command); |
| static bool ApplyDetachLightCmd(Session* session, fuchsia::ui::gfx::DetachLightCmd command); |
| static bool ApplyDetachLightsCmd(Session* session, fuchsia::ui::gfx::DetachLightsCmd command); |
| static bool ApplySetTextureCmd(Session* session, fuchsia::ui::gfx::SetTextureCmd command); |
| static bool ApplySetColorCmd(Session* session, fuchsia::ui::gfx::SetColorCmd command); |
| static bool ApplyBindMeshBuffersCmd(Session* session, |
| fuchsia::ui::gfx::BindMeshBuffersCmd command); |
| static bool ApplyAddLayerCmd(Session* session, fuchsia::ui::gfx::AddLayerCmd command); |
| static bool ApplyRemoveLayerCmd(Session* session, fuchsia::ui::gfx::RemoveLayerCmd command); |
| static bool ApplyRemoveAllLayersCmd(Session* session, |
| fuchsia::ui::gfx::RemoveAllLayersCmd command); |
| static bool ApplySetLayerStackCmd(Session* session, fuchsia::ui::gfx::SetLayerStackCmd command); |
| static bool ApplySetRendererCmd(Session* session, fuchsia::ui::gfx::SetRendererCmd command); |
| static bool ApplySetRendererParamCmd(Session* session, |
| fuchsia::ui::gfx::SetRendererParamCmd command); |
| static bool ApplySetEventMaskCmd(Session* session, fuchsia::ui::gfx::SetEventMaskCmd command); |
| static bool ApplySetLabelCmd(Session* session, fuchsia::ui::gfx::SetLabelCmd command); |
| static bool ApplySetDisableClippingCmd(Session* session, |
| fuchsia::ui::gfx::SetDisableClippingCmd command); |
| |
| // Resource creation functions, called by ApplyCreateResourceCmd(Session* |
| // session, ). |
| static bool ApplyCreateMemory(Session* session, ResourceId id, fuchsia::ui::gfx::MemoryArgs args); |
| static bool ApplyCreateImage(Session* session, ResourceId id, fuchsia::ui::gfx::ImageArgs args); |
| static bool ApplyCreateImagePipe(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ImagePipeArgs args); |
| static bool ApplyCreateImagePipe2(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ImagePipe2Args args); |
| static bool ApplyCreateBuffer(Session* session, ResourceId id, fuchsia::ui::gfx::BufferArgs args); |
| static bool ApplyCreateScene(Session* session, ResourceId id, fuchsia::ui::gfx::SceneArgs args); |
| static bool ApplyCreateCamera(Session* session, ResourceId id, fuchsia::ui::gfx::CameraArgs args); |
| static bool ApplyCreateStereoCamera(Session* session, ResourceId id, |
| fuchsia::ui::gfx::StereoCameraArgs args); |
| static bool ApplyCreateRenderer(Session* session, ResourceId id, |
| fuchsia::ui::gfx::RendererArgs args); |
| static bool ApplyCreateAmbientLight(Session* session, ResourceId id, |
| fuchsia::ui::gfx::AmbientLightArgs args); |
| static bool ApplyCreateDirectionalLight(Session* session, ResourceId id, |
| fuchsia::ui::gfx::DirectionalLightArgs args); |
| static bool ApplyCreatePointLight(Session* session, ResourceId id, |
| fuchsia::ui::gfx::PointLightArgs args); |
| static bool ApplyCreateRectangle(Session* session, ResourceId id, |
| fuchsia::ui::gfx::RectangleArgs args); |
| static bool ApplyCreateRoundedRectangle(Session* session, CommandContext* command_context, |
| ResourceId id, |
| fuchsia::ui::gfx::RoundedRectangleArgs args); |
| static bool ApplyCreateCircle(Session* session, ResourceId id, fuchsia::ui::gfx::CircleArgs args); |
| static bool ApplyCreateMesh(Session* session, ResourceId id, fuchsia::ui::gfx::MeshArgs args); |
| static bool ApplyCreateMaterial(Session* session, ResourceId id, |
| fuchsia::ui::gfx::MaterialArgs args); |
| static bool ApplyCreateView(Session* session, ResourceId id, fuchsia::ui::gfx::ViewArgs args); |
| static bool ApplyCreateViewHolder(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ViewHolderArgs args); |
| static bool ApplyCreateView(Session* session, ResourceId id, fuchsia::ui::gfx::ViewArgs3 args); |
| static bool ApplyCreateClipNode(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ClipNodeArgs args); |
| static bool ApplyCreateEntityNode(Session* session, ResourceId id, |
| fuchsia::ui::gfx::EntityNodeArgs args); |
| static bool ApplyCreateOpacityNode(Session* session, ResourceId id, |
| fuchsia::ui::gfx::OpacityNodeArgsHACK args); |
| static bool ApplyCreateShapeNode(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ShapeNodeArgs args); |
| static bool ApplyCreateCompositor(Session* session, ResourceId id, |
| fuchsia::ui::gfx::CompositorArgs args); |
| static bool ApplyCreateDisplayCompositor(Session* session, CommandContext* context, ResourceId id, |
| fuchsia::ui::gfx::DisplayCompositorArgs args); |
| static bool ApplyCreateImagePipeCompositor(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ImagePipeCompositorArgs args); |
| static bool ApplyCreateLayerStack(Session* session, ResourceId id, |
| fuchsia::ui::gfx::LayerStackArgs args); |
| static bool ApplyCreateLayer(Session* session, ResourceId id, fuchsia::ui::gfx::LayerArgs args); |
| static bool ApplyCreateVariable(Session* session, ResourceId id, |
| fuchsia::ui::gfx::VariableArgs args); |
| static bool ApplyTakeSnapshotCmdDEPRECATED(Session* session, |
| fuchsia::ui::gfx::TakeSnapshotCmdDEPRECATED command); |
| |
| static bool ApplySetDisplayColorConversionCmd( |
| Session* session, fuchsia::ui::gfx::SetDisplayColorConversionCmdHACK command); |
| |
| static bool ApplySetDisplayRotationCmd(Session* session, |
| fuchsia::ui::gfx::SetDisplayRotationCmdHACK command); |
| |
| static bool ApplySetEnableViewDebugBounds(Session* session, |
| fuchsia::ui::gfx::SetEnableDebugViewBoundsCmd command); |
| |
| static bool ApplySetViewHolderBoundsColor(Session* sesion, |
| fuchsia::ui::gfx::SetViewHolderBoundsColorCmd command); |
| |
| // Actually create resources. |
| static ResourcePtr CreateMemory(Session* session, ResourceId id, |
| fuchsia::ui::gfx::MemoryArgs args); |
| static ResourcePtr CreateImage(Session* session, ResourceId id, MemoryPtr memory, |
| fuchsia::ui::gfx::ImageArgs args); |
| static ResourcePtr CreateBuffer(Session* session, ResourceId id, MemoryPtr memory, |
| uint32_t memory_offset, uint32_t num_bytes); |
| |
| static ResourcePtr CreateScene(Session* session, ResourceId id, fuchsia::ui::gfx::SceneArgs args); |
| static ResourcePtr CreateCamera(Session* session, ResourceId id, |
| fuchsia::ui::gfx::CameraArgs args); |
| static ResourcePtr CreateStereoCamera(Session* session, ResourceId id, |
| fuchsia::ui::gfx::StereoCameraArgs args); |
| static ResourcePtr CreateRenderer(Session* session, ResourceId id, |
| fuchsia::ui::gfx::RendererArgs args); |
| |
| static ResourcePtr CreateAmbientLight(Session* session, ResourceId id); |
| static ResourcePtr CreateDirectionalLight(Session* session, ResourceId id); |
| static ResourcePtr CreatePointLight(Session* session, ResourceId id); |
| |
| static ResourcePtr CreateView(Session* session, ResourceId id, fuchsia::ui::gfx::ViewArgs args); |
| static ResourcePtr CreateView(Session* session, ResourceId id, fuchsia::ui::gfx::ViewArgs3 args); |
| static ResourcePtr CreateViewHolder(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ViewHolderArgs args); |
| static ResourcePtr CreateClipNode(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ClipNodeArgs args); |
| static ResourcePtr CreateEntityNode(Session* session, ResourceId id, |
| fuchsia::ui::gfx::EntityNodeArgs args); |
| static ResourcePtr CreateOpacityNode(Session* session, ResourceId id, |
| fuchsia::ui::gfx::OpacityNodeArgsHACK args); |
| static ResourcePtr CreateShapeNode(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ShapeNodeArgs args); |
| |
| static ResourcePtr CreateCompositor(Session* session, ResourceId id, |
| fuchsia::ui::gfx::CompositorArgs args); |
| static ResourcePtr CreateDisplayCompositor(Session* session, CommandContext* context, |
| ResourceId id, |
| fuchsia::ui::gfx::DisplayCompositorArgs args); |
| static ResourcePtr CreateImagePipeCompositor(Session* session, ResourceId id, |
| fuchsia::ui::gfx::ImagePipeCompositorArgs args); |
| static ResourcePtr CreateLayerStack(Session* session, ResourceId id, |
| fuchsia::ui::gfx::LayerStackArgs args); |
| static ResourcePtr CreateLayer(Session* session, ResourceId id, fuchsia::ui::gfx::LayerArgs args); |
| static ResourcePtr CreateCircle(Session* session, ResourceId id, float initial_radius); |
| static ResourcePtr CreateRectangle(Session* session, ResourceId id, float width, float height); |
| static ResourcePtr CreateRoundedRectangle(Session* session, CommandContext* command_context, |
| ResourceId id, float width, float height, |
| float top_left_radius, float top_right_radius, |
| float bottom_right_radius, float bottom_left_radius); |
| static ResourcePtr CreateMesh(Session* session, ResourceId id); |
| static ResourcePtr CreateMaterial(Session* session, ResourceId id); |
| static ResourcePtr CreateVariable(Session* session, ResourceId id, |
| fuchsia::ui::gfx::VariableArgs args); |
| }; |
| |
| } // namespace gfx |
| } // namespace scenic_impl |
| |
| #endif // SRC_UI_SCENIC_LIB_GFX_ENGINE_GFX_COMMAND_APPLIER_H_ |