blob: 47548226136df7b52e8745d45bfbda0cd9fa6ade [file] [log] [blame]
// Copyright 2018 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_BIN_APP_H_
#define SRC_UI_SCENIC_BIN_APP_H_
#include <lib/async/cpp/executor.h>
#include <memory>
#include <optional>
#include "src/graphics/display/lib/coordinator-getter/client.h"
#include "src/lib/async-watchdog/watchdog.h"
#include "src/lib/fsl/io/device_watcher.h"
#include "src/ui/lib/escher/escher.h"
#include "src/ui/scenic/lib/allocation/allocator.h"
#include "src/ui/scenic/lib/display/color_converter.h"
#include "src/ui/scenic/lib/display/display_manager.h"
#include "src/ui/scenic/lib/display/display_power_manager.h"
#include "src/ui/scenic/lib/display/singleton_display_service.h"
#include "src/ui/scenic/lib/flatland/engine/display_compositor.h"
#include "src/ui/scenic/lib/flatland/flatland_manager.h"
#include "src/ui/scenic/lib/flatland/flatland_presenter_impl.h"
#include "src/ui/scenic/lib/flatland/link_system.h"
#include "src/ui/scenic/lib/flatland/uber_struct_system.h"
#include "src/ui/scenic/lib/focus/focus_manager.h"
#include "src/ui/scenic/lib/input/input_system.h"
#include "src/ui/scenic/lib/scenic/scenic.h"
#include "src/ui/scenic/lib/scheduling/default_frame_scheduler.h"
#include "src/ui/scenic/lib/screen_capture/screen_capture_manager.h"
#include "src/ui/scenic/lib/screen_capture2/screen_capture2_manager.h"
#include "src/ui/scenic/lib/screenshot/screenshot_manager.h"
#include "src/ui/scenic/lib/shutdown/shutdown_manager.h"
#include "src/ui/scenic/lib/utils/cleanup_until_done.h"
#include "src/ui/scenic/lib/utils/metrics_impl.h"
#include "src/ui/scenic/lib/view_tree/geometry_provider.h"
#include "src/ui/scenic/lib/view_tree/observer_registry.h"
#include "src/ui/scenic/lib/view_tree/scoped_observer_registry.h"
#include "src/ui/scenic/lib/view_tree/view_ref_installed_impl.h"
#include "src/ui/scenic/lib/view_tree/view_tree_snapshotter.h"
#include "src/ui/scenic/scenic_structured_config.h"
namespace scenic_impl {
class DisplayInfoDelegate : public Scenic::GetDisplayInfoDelegateDeprecated {
public:
explicit DisplayInfoDelegate(std::shared_ptr<display::Display> display);
// TODO(https://fxbug.dev/42097798): Remove this when we externalize Displays.
// |Scenic::GetDisplayInfoDelegateDeprecated|
void GetDisplayInfo(fuchsia::ui::scenic::Scenic::GetDisplayInfoCallback callback) override;
// |Scenic::GetDisplayInfoDelegateDeprecated|
void GetDisplayOwnershipEvent(
fuchsia::ui::scenic::Scenic::GetDisplayOwnershipEventCallback callback) override;
fuchsia::math::SizeU GetDisplayDimensions();
private:
std::shared_ptr<display::Display> display_ = nullptr;
};
// What type of renderer is used by Scenic.
// LINT.IfChange
enum class RendererType : uint8_t {
// Use CPU for rendering.
CPU_RENDERER,
// Send all rendering operations to void.
NULL_RENDERER,
// Use Vulkan for rendering.
VULKAN,
};
// LINT.ThenChange(//src/lib/assembly/config_schema/src/platform_config/ui_config.rs)
class App {
public:
App(std::unique_ptr<sys::ComponentContext> app_context, inspect::Node inspect_node,
fpromise::promise<::display::CoordinatorClientEnd, zx_status_t> dc_handles_promise,
fit::closure quit_callback);
~App();
private:
void InitializeServices(escher::EscherUniquePtr escher,
std::shared_ptr<display::Display> display);
void InitializeGraphics(std::shared_ptr<display::Display> display);
void InitializeInput();
void InitializeHeartbeat(display::Display& display);
async::Executor executor_;
std::unique_ptr<sys::ComponentContext> app_context_;
const scenic_structured_config::Config config_values_;
std::shared_ptr<ShutdownManager> shutdown_manager_;
metrics::MetricsImpl metrics_logger_;
inspect::Node inspect_node_;
// FrameScheduler must be initialized early, since it must outlive all its
// dependencies.
scheduling::DefaultFrameScheduler frame_scheduler_;
RendererType renderer_type_;
std::optional<display::DisplayManager> display_manager_;
std::optional<display::SingletonDisplayService> singleton_display_service_;
std::optional<DisplayInfoDelegate> display_info_delegate_;
// DisplayPowerManager has a reference to |display_manager_|, so it should be
// destroyed before |display_manager_|.
std::optional<display::DisplayPowerManager> display_power_manager_;
escher::EscherUniquePtr escher_;
std::shared_ptr<utils::CleanupUntilDone> escher_cleanup_;
Scenic scenic_;
std::unique_ptr<fsl::DeviceWatcher> device_watcher_;
std::shared_ptr<allocation::Allocator> allocator_;
std::shared_ptr<flatland::UberStructSystem> uber_struct_system_;
std::shared_ptr<flatland::LinkSystem> link_system_;
std::shared_ptr<flatland::FlatlandPresenterImpl> flatland_presenter_;
std::shared_ptr<flatland::FlatlandManager> flatland_manager_;
std::shared_ptr<flatland::DisplayCompositor> flatland_compositor_;
std::shared_ptr<flatland::Engine> flatland_engine_;
display::ColorConverter color_converter_;
std::optional<input::InputSystem> input_;
focus::FocusManager focus_manager_;
std::optional<view_tree::ViewTreeSnapshotter> view_tree_snapshotter_;
std::optional<screen_capture::ScreenCaptureManager> screen_capture_manager_;
std::optional<screen_capture2::ScreenCapture2Manager> screen_capture2_manager_;
std::optional<screenshot::ScreenshotManager> screenshot_manager_;
view_tree::ViewRefInstalledImpl view_ref_installed_impl_;
view_tree::GeometryProvider geometry_provider_;
view_tree::Registry observer_registry_;
view_tree::ScopedRegistry scoped_observer_registry_;
uint64_t flatland_frame_count_ = 0;
uint64_t skipped_frame_count_ = 0;
async_watchdog::Watchdog watchdog_;
const bool enable_snapshot_dump_ = false;
};
} // namespace scenic_impl
#endif // SRC_UI_SCENIC_BIN_APP_H_