// // Copyright 2019 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // ScenicWindow.h: // Subclasses OSWindow for Fuchsia's Scenic compositor. // #ifndef UTIL_FUCHSIA_SCENIC_WINDOW_H #define UTIL_FUCHSIA_SCENIC_WINDOW_H #include "common/debug.h" #include "util/OSWindow.h" #include "util/util_export.h" // Disable ANGLE-specific warnings that pop up in fuchsia headers. ANGLE_DISABLE_DESTRUCTOR_OVERRIDE_WARNING ANGLE_DISABLE_SUGGEST_OVERRIDE_WARNINGS #include #include #include #include #include #include #include #include #include ANGLE_REENABLE_SUGGEST_OVERRIDE_WARNINGS ANGLE_REENABLE_DESTRUCTOR_OVERRIDE_WARNING struct FuchsiaEGLWindowDeleter { void operator()(fuchsia_egl_window *eglWindow) { fuchsia_egl_window_destroy(eglWindow); } }; class ANGLE_UTIL_EXPORT ScenicWindow : public OSWindow { public: ScenicWindow(); ~ScenicWindow() override; // OSWindow: void disableErrorMessageDialog() override; void destroy() override; void resetNativeWindow() override; EGLNativeWindowType getNativeWindow() const override; EGLNativeDisplayType getNativeDisplay() const override; void messageLoop() override; void setMousePosition(int x, int y) override; bool setOrientation(int width, int height) override; bool setPosition(int x, int y) override; bool resize(int width, int height) override; void setVisible(bool isVisible) override; void signalTestEvent() override; // Presents the window to Scenic. // // We need to do this once per EGL window surface after adding the // surface's image pipe as a child of our window. void present(); // FIDL callbacks: void onScenicEvents(std::vector events); void onScenicError(zx_status_t status); void onFramePresented(fuchsia::scenic::scheduling::FramePresentedInfo info); void onViewMetrics(const fuchsia::ui::gfx::Metrics &metrics); void onViewProperties(const fuchsia::ui::gfx::ViewProperties &properties); private: bool initializeImpl(const std::string &name, int width, int height) override; void updateViewSize(); // ScenicWindow async loop. async::Loop *const mLoop; // System services. zx::channel mServiceRoot; fuchsia::ui::scenic::ScenicPtr mScenic; fuchsia::ui::policy::PresenterPtr mPresenter; // Scenic session & resources. scenic::Session mScenicSession; scenic::ShapeNode mShape; scenic::Material mMaterial; // Whether our scenic session has disconnected. bool mLostSession = false; // Present limiting. static constexpr int kMaxInFlightPresents = 2; int mInFlightPresents = 0; // Scenic view. std::unique_ptr mView; // View geometry. float mDisplayHeightDips = 0.f; float mDisplayWidthDips = 0.f; float mDisplayScaleX = 0.f; float mDisplayScaleY = 0.f; bool mHasViewProperties = false; bool mHasViewMetrics = false; bool mViewSizeDirty = false; // EGL native window. std::unique_ptr mFuchsiaEGLWindow; }; #endif // UTIL_FUCHSIA_SCENIC_WINDOW_H