9 #include "flutter/fml/logging.h"
17 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
19 if (::eglInitialize(display,
nullptr,
nullptr) != EGL_TRUE) {
27 if (display_ != EGL_NO_DISPLAY) {
28 if (::eglTerminate(display_) != EGL_TRUE) {
35 return display_ != EGL_NO_DISPLAY;
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));
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);
99 attributes.push_back(EGL_WINDOW_BIT);
102 attributes.push_back(EGL_PBUFFER_BIT);
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);
174 EGLNativeWindowType window) {
175 const EGLint attribs[] = {EGL_NONE};
176 auto surface = ::eglCreateWindowSurface(display_,
181 if (surface == EGL_NO_SURFACE) {
185 return std::unique_ptr<Surface>(
new Surface(display_, surface));
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));
An EGL config. These are returned by the display to indicate support for a specific config descriptor...
const EGLConfig & GetHandle() const
const ConfigDescriptor & GetDescriptor() const
An instance of an EGL context.
const EGLContext & GetHandle() const
Get the underlying handle to the EGL context.
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 applica...
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 ...
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,...
const EGLDisplay & GetHandle() const
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....
An instance of an EGL surface. There is no ability to create surfaces directly. Instead,...
#define IMPELLER_LOG_EGL_ERROR