Flutter Impeller
impeller::egl::Display Class Reference

#include <display.h>

Public Member Functions

 Display ()
 
virtual ~Display ()
 
virtual bool IsValid () const
 
virtual std::unique_ptr< ConfigChooseConfig (ConfigDescriptor config) const
 
virtual std::unique_ptr< ContextCreateContext (const Config &config, const Context *share_context)
 
virtual std::unique_ptr< SurfaceCreateWindowSurface (const Config &config, EGLNativeWindowType window)
 
virtual std::unique_ptr< SurfaceCreatePixelBufferSurface (const Config &config, size_t width, size_t height)
 

Detailed Description

Definition at line 21 of file display.h.

Constructor & Destructor Documentation

◆ Display()

impeller::egl::Display::Display ( )

Definition at line 15 of file display.cc.

15  {
16  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
17 
18  if (::eglInitialize(display, nullptr, nullptr) != EGL_TRUE) {
20  return;
21  }
22  display_ = display;
23 }

References IMPELLER_LOG_EGL_ERROR.

◆ ~Display()

impeller::egl::Display::~Display ( )
virtual

Definition at line 25 of file display.cc.

25  {
26  if (display_ != EGL_NO_DISPLAY) {
27  if (::eglTerminate(display_) != EGL_TRUE) {
29  }
30  }
31 }

References IMPELLER_LOG_EGL_ERROR.

Member Function Documentation

◆ ChooseConfig()

std::unique_ptr< Config > impeller::egl::Display::ChooseConfig ( ConfigDescriptor  config) const
virtual

Definition at line 72 of file display.cc.

72  {
73  if (!display_) {
74  return nullptr;
75  }
76 
77  std::vector<EGLint> attributes;
78 
79  {
80  attributes.push_back(EGL_RENDERABLE_TYPE);
81  switch (config.api) {
82  case API::kOpenGL:
83  attributes.push_back(EGL_OPENGL_BIT);
84  break;
85  case API::kOpenGLES2:
86  attributes.push_back(EGL_OPENGL_ES2_BIT);
87  break;
88  case API::kOpenGLES3:
89  attributes.push_back(EGL_OPENGL_ES3_BIT);
90  break;
91  }
92  }
93 
94  {
95  attributes.push_back(EGL_SURFACE_TYPE);
96  switch (config.surface_type) {
98  attributes.push_back(EGL_WINDOW_BIT);
99  break;
101  attributes.push_back(EGL_PBUFFER_BIT);
102  break;
103  }
104  }
105 
106  {
107  switch (config.color_format) {
109  attributes.push_back(EGL_RED_SIZE);
110  attributes.push_back(8);
111  attributes.push_back(EGL_GREEN_SIZE);
112  attributes.push_back(8);
113  attributes.push_back(EGL_BLUE_SIZE);
114  attributes.push_back(8);
115  attributes.push_back(EGL_ALPHA_SIZE);
116  attributes.push_back(8);
117  break;
119  attributes.push_back(EGL_RED_SIZE);
120  attributes.push_back(5);
121  attributes.push_back(EGL_GREEN_SIZE);
122  attributes.push_back(6);
123  attributes.push_back(EGL_BLUE_SIZE);
124  attributes.push_back(5);
125  break;
126  }
127  }
128 
129  {
130  attributes.push_back(EGL_DEPTH_SIZE);
131  attributes.push_back(static_cast<EGLint>(config.depth_bits));
132  }
133 
134  {
135  attributes.push_back(EGL_STENCIL_SIZE);
136  attributes.push_back(static_cast<EGLint>(config.stencil_bits));
137  }
138 
139  {
140  const auto sample_count = static_cast<EGLint>(config.samples);
141  if (sample_count > 1) {
142  attributes.push_back(EGL_SAMPLE_BUFFERS);
143  attributes.push_back(1);
144  attributes.push_back(EGL_SAMPLES);
145  attributes.push_back(sample_count);
146  }
147  }
148 
149  // termination sentinel must be present.
150  attributes.push_back(EGL_NONE);
151 
152  EGLConfig config_out = nullptr;
153  EGLint config_count_out = 0;
154  if (::eglChooseConfig(display_, // display
155  attributes.data(), // attributes (null terminated)
156  &config_out, // matched configs
157  1, // configs array size
158  &config_count_out // match configs count
159  ) != EGL_TRUE) {
161  return nullptr;
162  }
163 
164  if (config_count_out != 1u) {
166  return nullptr;
167  }
168 
169  return std::make_unique<Config>(config, config_out);
170 }

References impeller::egl::ConfigDescriptor::api, impeller::egl::ConfigDescriptor::color_format, impeller::egl::ConfigDescriptor::depth_bits, IMPELLER_LOG_EGL_ERROR, impeller::egl::kOpenGL, impeller::egl::kOpenGLES2, impeller::egl::kOpenGLES3, impeller::egl::kPBuffer, impeller::egl::kRGB565, impeller::egl::kRGBA8888, impeller::egl::kWindow, impeller::egl::ConfigDescriptor::samples, impeller::egl::ConfigDescriptor::stencil_bits, and impeller::egl::ConfigDescriptor::surface_type.

◆ CreateContext()

std::unique_ptr< Context > impeller::egl::Display::CreateContext ( const Config config,
const Context share_context 
)
virtual

Definition at line 37 of file display.cc.

38  {
39  const auto& desc = config.GetDescriptor();
40 
41  std::vector<EGLint> attributes;
42  switch (desc.api) {
43  case API::kOpenGL:
44  break;
45  case API::kOpenGLES2:
46  attributes.push_back(EGL_CONTEXT_CLIENT_VERSION);
47  attributes.push_back(2);
48  break;
49  case API::kOpenGLES3:
50  attributes.push_back(EGL_CONTEXT_CLIENT_VERSION);
51  attributes.push_back(3);
52  break;
53  }
54  // Termination sentinel must be present.
55  attributes.push_back(EGL_NONE);
56 
57  auto context = ::eglCreateContext(
58  display_, // display
59  config.GetHandle(), // config
60  share_context != nullptr ? share_context->GetHandle() : nullptr, // share
61  attributes.data() // attributes
62  );
63 
64  if (context == EGL_NO_CONTEXT) {
66  return nullptr;
67  }
68 
69  return std::make_unique<Context>(display_, context);
70 }

References impeller::egl::Config::GetDescriptor(), impeller::egl::Context::GetHandle(), impeller::egl::Config::GetHandle(), IMPELLER_LOG_EGL_ERROR, impeller::egl::kOpenGL, impeller::egl::kOpenGLES2, and impeller::egl::kOpenGLES3.

◆ CreatePixelBufferSurface()

std::unique_ptr< Surface > impeller::egl::Display::CreatePixelBufferSurface ( const Config config,
size_t  width,
size_t  height 
)
virtual

Definition at line 188 of file display.cc.

190  {
191  // clang-format off
192  const EGLint attribs[] = {
193  EGL_WIDTH, static_cast<EGLint>(width),
194  EGL_HEIGHT, static_cast<EGLint>(height),
195  EGL_NONE
196  };
197  // clang-format on
198  auto surface = ::eglCreatePbufferSurface(display_, // display
199  config.GetHandle(), // config
200  attribs // attrib_list
201  );
202  if (surface == EGL_NO_SURFACE) {
204  return nullptr;
205  }
206  return std::make_unique<Surface>(display_, surface);
207 }

References impeller::egl::Config::GetHandle(), and IMPELLER_LOG_EGL_ERROR.

◆ CreateWindowSurface()

std::unique_ptr< Surface > impeller::egl::Display::CreateWindowSurface ( const Config config,
EGLNativeWindowType  window 
)
virtual

Definition at line 172 of file display.cc.

174  {
175  const EGLint attribs[] = {EGL_NONE};
176  auto surface = ::eglCreateWindowSurface(display_, // display
177  config.GetHandle(), // config
178  window, // window
179  attribs // attrib_list
180  );
181  if (surface == EGL_NO_SURFACE) {
183  return nullptr;
184  }
185  return std::make_unique<Surface>(display_, surface);
186 }

References impeller::egl::Config::GetHandle(), and IMPELLER_LOG_EGL_ERROR.

◆ IsValid()

bool impeller::egl::Display::IsValid ( ) const
virtual

Definition at line 33 of file display.cc.

33  {
34  return display_ != EGL_NO_DISPLAY;
35 }

The documentation for this class was generated from the following files:
impeller::egl::ColorFormat::kRGB565
@ kRGB565
impeller::egl::API::kOpenGLES2
@ kOpenGLES2
impeller::egl::API::kOpenGL
@ kOpenGL
impeller::egl::SurfaceType::kWindow
@ kWindow
IMPELLER_LOG_EGL_ERROR
#define IMPELLER_LOG_EGL_ERROR
Definition: egl.h:19
impeller::egl::ColorFormat::kRGBA8888
@ kRGBA8888
impeller::egl::API::kOpenGLES3
@ kOpenGLES3
impeller::egl::SurfaceType::kPBuffer
@ kPBuffer