Flutter Windows Embedder
manager.h
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_MANAGER_H_
6 #define FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_MANAGER_H_
7 
8 // OpenGL ES and EGL includes
9 #include <EGL/egl.h>
10 #include <EGL/eglext.h>
11 #include <EGL/eglplatform.h>
12 #include <GLES2/gl2.h>
13 #include <GLES2/gl2ext.h>
14 
15 // Windows platform specific includes
16 #include <d3d11.h>
17 #include <windows.h>
18 #include <wrl/client.h>
19 #include <memory>
20 
21 #include "flutter/fml/macros.h"
25 
26 namespace flutter {
27 namespace egl {
28 
29 // A manager for initializing ANGLE correctly and using it to create and
30 // destroy surfaces
31 class Manager {
32  public:
33  static std::unique_ptr<Manager> Create(bool enable_impeller);
34 
35  virtual ~Manager();
36 
37  // Whether the manager is currently valid.
38  bool IsValid() const;
39 
40  // Creates an EGL surface that can be used to render a Flutter view into a
41  // win32 HWND.
42  //
43  // After the surface is created, |WindowSurface::SetVSyncEnabled| should be
44  // called on a thread that can make the surface current.
45  //
46  // HWND is the window backing the surface. Width and height are the surface's
47  // physical pixel dimensions.
48  //
49  // Returns nullptr on failure.
50  virtual std::unique_ptr<WindowSurface> CreateWindowSurface(HWND hwnd,
51  size_t width,
52  size_t height);
53 
54  // Check if the current thread has a context bound.
55  bool HasContextCurrent();
56 
57  // Creates a |EGLSurface| from the provided handle.
58  EGLSurface CreateSurfaceFromHandle(EGLenum handle_type,
59  EGLClientBuffer handle,
60  const EGLint* attributes) const;
61 
62  // Gets the |EGLDisplay|.
63  EGLDisplay egl_display() const { return display_; };
64 
65  // Gets the |ID3D11Device| chosen by ANGLE.
66  bool GetDevice(ID3D11Device** device);
67 
68  // Get the EGL context used to render Flutter views.
69  virtual Context* render_context() const;
70 
71  // Get the EGL context used for async texture uploads.
72  virtual Context* resource_context() const;
73 
74  protected:
75  // Creates a new surface manager retaining reference to the passed-in target
76  // for the lifetime of the manager.
77  explicit Manager(bool enable_impeller);
78 
79  private:
80  // Number of active instances of Manager
81  static int instance_count_;
82 
83  // Initialize the EGL display.
84  bool InitializeDisplay();
85 
86  // Initialize the EGL configs.
87  bool InitializeConfig(bool enable_impeller);
88 
89  // Initialize the EGL render and resource contexts.
90  bool InitializeContexts();
91 
92  // Initialize the D3D11 device.
93  bool InitializeDevice();
94 
95  void CleanUp();
96 
97  // Whether the manager was initialized successfully.
98  bool is_valid_ = false;
99 
100  // EGL representation of native display.
101  EGLDisplay display_ = EGL_NO_DISPLAY;
102 
103  // EGL framebuffer configuration.
104  EGLConfig config_ = nullptr;
105 
106  // The EGL context used to render Flutter views.
107  std::unique_ptr<Context> render_context_;
108 
109  // The EGL context used for async texture uploads.
110  std::unique_ptr<Context> resource_context_;
111 
112  // The current D3D device.
113  Microsoft::WRL::ComPtr<ID3D11Device> resolved_device_ = nullptr;
114 
115  FML_DISALLOW_COPY_AND_ASSIGN(Manager);
116 };
117 
118 } // namespace egl
119 } // namespace flutter
120 
121 #endif // FLUTTER_SHELL_PLATFORM_WINDOWS_EGL_MANAGER_H_
flutter::egl::Manager::render_context
virtual Context * render_context() const
Definition: manager.cc:318
flutter::egl::Manager::IsValid
bool IsValid() const
Definition: manager.cc:262
surface.h
flutter::egl::Manager::HasContextCurrent
bool HasContextCurrent()
Definition: manager.cc:296
flutter::egl::Context
Definition: context.h:20
flutter::egl::Manager::~Manager
virtual ~Manager()
Definition: manager.cc:44
flutter::egl::Manager::CreateSurfaceFromHandle
EGLSurface CreateSurfaceFromHandle(EGLenum handle_type, EGLClientBuffer handle, const EGLint *attributes) const
Definition: manager.cc:300
window_surface.h
flutter
Definition: accessibility_bridge_windows.cc:11
flutter::egl::Manager
Definition: manager.h:31
flutter::egl::Manager::resource_context
virtual Context * resource_context() const
Definition: manager.cc:322
context.h
flutter::egl::Manager::Manager
Manager(bool enable_impeller)
Definition: manager.cc:26
flutter::egl::Manager::GetDevice
bool GetDevice(ID3D11Device **device)
Definition: manager.cc:307
flutter::egl::Manager::Create
static std::unique_ptr< Manager > Create(bool enable_impeller)
Definition: manager.cc:17
flutter::egl::Manager::egl_display
EGLDisplay egl_display() const
Definition: manager.h:63
flutter::egl::Manager::CreateWindowSurface
virtual std::unique_ptr< WindowSurface > CreateWindowSurface(HWND hwnd, size_t width, size_t height)
Definition: manager.cc:266