113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
//
 | 
						|
// 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 <fuchsia/ui/policy/cpp/fidl.h>
 | 
						|
#include <fuchsia/ui/scenic/cpp/fidl.h>
 | 
						|
#include <fuchsia_egl.h>
 | 
						|
#include <lib/async-loop/cpp/loop.h>
 | 
						|
#include <lib/ui/scenic/cpp/commands.h>
 | 
						|
#include <lib/ui/scenic/cpp/resources.h>
 | 
						|
#include <lib/ui/scenic/cpp/session.h>
 | 
						|
#include <zircon/types.h>
 | 
						|
#include <string>
 | 
						|
 | 
						|
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<fuchsia::ui::scenic::Event> 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<scenic::View> 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<fuchsia_egl_window, FuchsiaEGLWindowDeleter> mFuchsiaEGLWindow;
 | 
						|
};
 | 
						|
 | 
						|
#endif  // UTIL_FUCHSIA_SCENIC_WINDOW_H
 |