| // Copyright 2020 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_FLATLAND_FLATLAND_MANAGER_H_ |
| #define SRC_UI_SCENIC_LIB_FLATLAND_FLATLAND_MANAGER_H_ |
| |
| #include <fuchsia/ui/scenic/internal/cpp/fidl.h> |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/async-loop/default.h> |
| #include <lib/fidl/cpp/binding.h> |
| |
| #include <map> |
| #include <mutex> |
| #include <thread> |
| #include <unordered_map> |
| |
| #include "src/ui/scenic/lib/flatland/flatland.h" |
| #include "src/ui/scenic/lib/flatland/flatland_presenter.h" |
| #include "src/ui/scenic/lib/flatland/link_system.h" |
| #include "src/ui/scenic/lib/flatland/renderer/renderer.h" |
| #include "src/ui/scenic/lib/flatland/uber_struct_system.h" |
| #include "src/ui/scenic/lib/scheduling/id.h" |
| |
| namespace flatland { |
| |
| class FlatlandManager { |
| public: |
| FlatlandManager( |
| const std::shared_ptr<FlatlandPresenter>& flatland_presenter, |
| const std::shared_ptr<Renderer>& renderer, |
| const std::shared_ptr<UberStructSystem>& uber_struct_system, |
| const std::shared_ptr<LinkSystem>& link_system, |
| const std::vector<std::shared_ptr<BufferCollectionImporter>>& buffer_collection_importers); |
| |
| void CreateFlatland(fidl::InterfaceRequest<fuchsia::ui::scenic::internal::Flatland> flatland); |
| |
| // For validating test logic. |
| size_t GetSessionCount() const; |
| |
| private: |
| // Removes the Flatland instance associated with |session_id|. |
| void RemoveFlatlandInstance(scheduling::SessionId session_id); |
| |
| std::shared_ptr<FlatlandPresenter> flatland_presenter_; |
| std::shared_ptr<Renderer> renderer_; |
| std::shared_ptr<UberStructSystem> uber_struct_system_; |
| std::shared_ptr<LinkSystem> link_system_; |
| std::vector<std::shared_ptr<BufferCollectionImporter>> buffer_collection_importers_; |
| |
| // Represents an individual Flatland session for a client. |
| struct FlatlandInstance { |
| // The looper for this Flatland instance, which will be run on a worker thread spawned by the |
| // async::Loop itself. |
| async::Loop loop = async::Loop(&kAsyncLoopConfigNoAttachToCurrentThread); |
| |
| // The channel and the implementation bound to it. This must come before |peer_closed_waiter| |
| // so that the Wait is destroyed, and therefore cancelled, before the binding is destroyed in |
| // the default destruction order. |
| fidl::Binding<fuchsia::ui::scenic::internal::Flatland, std::unique_ptr<Flatland>> binding; |
| |
| // Waits for the invalidation of the binding on the main thread cleans up this instance. Uses |
| // WaitOnce since the handler will delete this FlatlandInstance. |
| async::WaitOnce peer_closed_waiter; |
| |
| FlatlandInstance(const zx::channel& channel, std::unique_ptr<Flatland> flatland) |
| : binding(std::move(flatland)), peer_closed_waiter(channel.get(), ZX_CHANNEL_PEER_CLOSED) {} |
| }; |
| std::unordered_map<scheduling::SessionId, std::unique_ptr<FlatlandInstance>> flatland_instances_; |
| }; |
| |
| } // namespace flatland |
| |
| #endif // SRC_UI_SCENIC_LIB_FLATLAND_FLATLAND_MANAGER_H_ |