A connection to an EGL display. Only one connection per application instance is sufficient.
More...
|
| Display () |
|
virtual | ~Display () |
|
virtual bool | IsValid () const |
|
virtual std::unique_ptr< Config > | ChooseConfig (ConfigDescriptor config) const |
| Choose a config that most closely matches a given descriptor. If there are no matches, this method returns nullptr . More...
|
|
virtual std::unique_ptr< Context > | CreateContext (const Config &config, const Context *share_context) |
| Create a context with a supported config. The supported config can be obtained via a successful call to ChooseConfig . More...
|
|
virtual std::unique_ptr< Surface > | CreateWindowSurface (const Config &config, EGLNativeWindowType window) |
| Create a window surface. The window is an opaque pointer whose value value is platform specific. For instance, ANativeWindow on Android. More...
|
|
virtual std::unique_ptr< Surface > | CreatePixelBufferSurface (const Config &config, size_t width, size_t height) |
| Create an offscreen pixelbuffer surface. These are of limited use except in the context where applications need to render to a texture in an offscreen context. In such cases, a 1x1 pixel buffer surface is created to obtain a surface that can be used to make the context current on the background thread. More...
|
|
const EGLDisplay & | GetHandle () const |
|
A connection to an EGL display. Only one connection per application instance is sufficient.
The display connection is used to first choose a config from among the available, create a context from that config, and then use that context with a surface on one (and only one) thread at a time.
Definition at line 28 of file display.h.
Choose a config that most closely matches a given descriptor. If there are no matches, this method returns nullptr
.
- Parameters
-
[in] | config | The configuration |
- Returns
- A config that matches a descriptor if one is available.
nullptr
otherwise.
Definition at line 73 of file display.cc.
78 std::vector<EGLint> attributes;
81 attributes.push_back(EGL_RENDERABLE_TYPE);
84 attributes.push_back(EGL_OPENGL_BIT);
87 attributes.push_back(EGL_OPENGL_ES2_BIT);
90 attributes.push_back(EGL_OPENGL_ES3_BIT);
96 attributes.push_back(EGL_SURFACE_TYPE);
97 switch (config.surface_type) {
99 attributes.push_back(EGL_WINDOW_BIT);
102 attributes.push_back(EGL_PBUFFER_BIT);
108 switch (config.color_format) {
110 attributes.push_back(EGL_RED_SIZE);
111 attributes.push_back(8);
112 attributes.push_back(EGL_GREEN_SIZE);
113 attributes.push_back(8);
114 attributes.push_back(EGL_BLUE_SIZE);
115 attributes.push_back(8);
116 attributes.push_back(EGL_ALPHA_SIZE);
117 attributes.push_back(8);
120 attributes.push_back(EGL_RED_SIZE);
121 attributes.push_back(5);
122 attributes.push_back(EGL_GREEN_SIZE);
123 attributes.push_back(6);
124 attributes.push_back(EGL_BLUE_SIZE);
125 attributes.push_back(5);
131 attributes.push_back(EGL_DEPTH_SIZE);
132 attributes.push_back(
static_cast<EGLint
>(config.depth_bits));
136 attributes.push_back(EGL_STENCIL_SIZE);
137 attributes.push_back(
static_cast<EGLint
>(config.stencil_bits));
141 const auto sample_count =
static_cast<EGLint
>(config.samples);
142 if (sample_count > 1) {
143 attributes.push_back(EGL_SAMPLE_BUFFERS);
144 attributes.push_back(1);
145 attributes.push_back(EGL_SAMPLES);
146 attributes.push_back(sample_count);
151 attributes.push_back(EGL_NONE);
153 EGLConfig config_out =
nullptr;
154 EGLint config_count_out = 0;
155 if (::eglChooseConfig(display_,
165 if (config_count_out < 1) {
169 return std::make_unique<Config>(config, config_out);
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.
std::unique_ptr< Context > impeller::egl::Display::CreateContext |
( |
const Config & |
config, |
|
|
const Context * |
share_context |
|
) |
| |
|
virtual |
Create a context with a supported config. The supported config can be obtained via a successful call to ChooseConfig
.
- Parameters
-
[in] | config | The configuration. |
[in] | share_context | The share context. Context within the same share-group use the same handle table. The contexts should still only be used exclusively on each thread however. |
- Returns
- A context if one can be created.
nullptr
otherwise.
Definition at line 38 of file display.cc.
40 const auto& desc = config.GetDescriptor();
42 std::vector<EGLint> attributes;
47 attributes.push_back(EGL_CONTEXT_CLIENT_VERSION);
48 attributes.push_back(2);
51 attributes.push_back(EGL_CONTEXT_CLIENT_VERSION);
52 attributes.push_back(3);
56 attributes.push_back(EGL_NONE);
58 auto context = ::eglCreateContext(
61 share_context !=
nullptr ? share_context->GetHandle() :
nullptr,
65 if (context == EGL_NO_CONTEXT) {
70 return std::unique_ptr<Context>(
new Context(display_, context));
References impeller::egl::Config::GetDescriptor(), impeller::egl::Config::GetHandle(), impeller::egl::Context::GetHandle(), IMPELLER_LOG_EGL_ERROR, impeller::egl::kOpenGL, impeller::egl::kOpenGLES2, and impeller::egl::kOpenGLES3.
std::unique_ptr< Surface > impeller::egl::Display::CreatePixelBufferSurface |
( |
const Config & |
config, |
|
|
size_t |
width, |
|
|
size_t |
height |
|
) |
| |
|
virtual |
Create an offscreen pixelbuffer surface. These are of limited use except in the context where applications need to render to a texture in an offscreen context. In such cases, a 1x1 pixel buffer surface is created to obtain a surface that can be used to make the context current on the background thread.
- Parameters
-
[in] | config | The configuration |
[in] | width | The width |
[in] | height | The height |
- Returns
- A valid pixel buffer surface if one can be created.
nullptr
otherwise.
Definition at line 188 of file display.cc.
192 const EGLint attribs[] = {
193 EGL_WIDTH,
static_cast<EGLint
>(width),
194 EGL_HEIGHT,
static_cast<EGLint
>(height),
198 auto surface = ::eglCreatePbufferSurface(display_,
202 if (surface == EGL_NO_SURFACE) {
206 return std::unique_ptr<Surface>(
new Surface(display_, surface));
References impeller::egl::Config::GetHandle(), and IMPELLER_LOG_EGL_ERROR.