Path: blob/main_old/util/fuchsia/ScenicWindow.h
1693 views
//1// Copyright 2019 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// ScenicWindow.h:6// Subclasses OSWindow for Fuchsia's Scenic compositor.7//89#ifndef UTIL_FUCHSIA_SCENIC_WINDOW_H10#define UTIL_FUCHSIA_SCENIC_WINDOW_H1112#include "common/debug.h"13#include "util/OSWindow.h"14#include "util/util_export.h"1516// Disable ANGLE-specific warnings that pop up in fuchsia headers.17ANGLE_DISABLE_DESTRUCTOR_OVERRIDE_WARNING18ANGLE_DISABLE_SUGGEST_OVERRIDE_WARNINGS1920#include <fuchsia/ui/policy/cpp/fidl.h>21#include <fuchsia/ui/scenic/cpp/fidl.h>22#include <fuchsia_egl.h>23#include <lib/async-loop/cpp/loop.h>24#include <lib/ui/scenic/cpp/commands.h>25#include <lib/ui/scenic/cpp/resources.h>26#include <lib/ui/scenic/cpp/session.h>27#include <zircon/types.h>28#include <string>2930ANGLE_REENABLE_SUGGEST_OVERRIDE_WARNINGS31ANGLE_REENABLE_DESTRUCTOR_OVERRIDE_WARNING3233struct FuchsiaEGLWindowDeleter34{35void operator()(fuchsia_egl_window *eglWindow) { fuchsia_egl_window_destroy(eglWindow); }36};3738class ANGLE_UTIL_EXPORT ScenicWindow : public OSWindow39{40public:41ScenicWindow();42~ScenicWindow() override;4344// OSWindow:45void disableErrorMessageDialog() override;46void destroy() override;47void resetNativeWindow() override;48EGLNativeWindowType getNativeWindow() const override;49EGLNativeDisplayType getNativeDisplay() const override;50void messageLoop() override;51void setMousePosition(int x, int y) override;52bool setOrientation(int width, int height) override;53bool setPosition(int x, int y) override;54bool resize(int width, int height) override;55void setVisible(bool isVisible) override;56void signalTestEvent() override;5758// Presents the window to Scenic.59//60// We need to do this once per EGL window surface after adding the61// surface's image pipe as a child of our window.62void present();6364// FIDL callbacks:65void onScenicEvents(std::vector<fuchsia::ui::scenic::Event> events);66void onScenicError(zx_status_t status);67void onFramePresented(fuchsia::scenic::scheduling::FramePresentedInfo info);68void onViewMetrics(const fuchsia::ui::gfx::Metrics &metrics);69void onViewProperties(const fuchsia::ui::gfx::ViewProperties &properties);7071private:72bool initializeImpl(const std::string &name, int width, int height) override;73void updateViewSize();7475// ScenicWindow async loop.76async::Loop *const mLoop;7778// System services.79zx::channel mServiceRoot;80fuchsia::ui::scenic::ScenicPtr mScenic;81fuchsia::ui::policy::PresenterPtr mPresenter;8283// Scenic session & resources.84scenic::Session mScenicSession;85scenic::ShapeNode mShape;86scenic::Material mMaterial;8788// Whether our scenic session has disconnected.89bool mLostSession = false;9091// Present limiting.92static constexpr int kMaxInFlightPresents = 2;93int mInFlightPresents = 0;9495// Scenic view.96std::unique_ptr<scenic::View> mView;9798// View geometry.99float mDisplayHeightDips = 0.f;100float mDisplayWidthDips = 0.f;101float mDisplayScaleX = 0.f;102float mDisplayScaleY = 0.f;103bool mHasViewProperties = false;104bool mHasViewMetrics = false;105bool mViewSizeDirty = false;106107// EGL native window.108std::unique_ptr<fuchsia_egl_window, FuchsiaEGLWindowDeleter> mFuchsiaEGLWindow;109};110111#endif // UTIL_FUCHSIA_SCENIC_WINDOW_H112113114