Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 50c69ae

Browse files
committed
Implement an EGL resource context for the Linux shell.
1 parent 8b61e0b commit 50c69ae

File tree

4 files changed

+63
-0
lines changed

4 files changed

+63
-0
lines changed

shell/platform/linux/fl_engine.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,15 @@ static bool fl_engine_gl_present(void* user_data) {
108108
return result;
109109
}
110110

111+
static bool fl_engine_gl_make_resource_current(void* user_data) {
112+
FlEngine* self = static_cast<FlEngine*>(user_data);
113+
g_autoptr(GError) error = nullptr;
114+
gboolean result = fl_renderer_make_resource_current(self->renderer, &error);
115+
if (!result)
116+
g_warning("%s", error->message);
117+
return result;
118+
}
119+
111120
// Called by the engine to determine if it is on the GTK thread.
112121
static bool fl_engine_runs_task_on_current_thread(void* user_data) {
113122
FlEngine* self = static_cast<FlEngine*>(user_data);
@@ -222,6 +231,7 @@ gboolean fl_engine_start(FlEngine* self, GError** error) {
222231
config.open_gl.clear_current = fl_engine_gl_clear_current;
223232
config.open_gl.fbo_callback = fl_engine_gl_get_fbo;
224233
config.open_gl.present = fl_engine_gl_present;
234+
config.open_gl.make_resource_current = fl_engine_gl_make_resource_current;
225235

226236
FlutterTaskRunnerDescription platform_task_runner = {};
227237
platform_task_runner.struct_size = sizeof(FlutterTaskRunnerDescription);

shell/platform/linux/fl_renderer.cc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ typedef struct {
1212
EGLDisplay egl_display;
1313
EGLSurface egl_surface;
1414
EGLContext egl_context;
15+
16+
EGLSurface resource_surface;
17+
EGLContext resource_context;
1518
} FlRendererPrivate;
1619

1720
G_DEFINE_TYPE_WITH_PRIVATE(FlRenderer, fl_renderer, G_TYPE_OBJECT)
@@ -124,6 +127,23 @@ static gboolean fl_renderer_real_start(FlRenderer* self, GError** error) {
124127
eglQueryContext(priv->egl_display, priv->egl_context,
125128
EGL_CONTEXT_CLIENT_VERSION, &value);
126129

130+
const EGLint shared_context_attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1,
131+
EGL_NONE};
132+
priv->resource_surface = eglCreatePbufferSurface(
133+
priv->egl_display, egl_config, shared_context_attribs);
134+
if (priv->resource_surface == nullptr) {
135+
g_set_error(error, fl_renderer_error_quark(), FL_RENDERER_ERROR_FAILED,
136+
"Failed to create EGL resource surface: %s", get_egl_error());
137+
return FALSE;
138+
}
139+
priv->resource_context = eglCreateContext(
140+
priv->egl_display, egl_config, priv->egl_context, context_attributes);
141+
if (priv->resource_context == nullptr) {
142+
g_set_error(error, fl_renderer_error_quark(), FL_RENDERER_ERROR_FAILED,
143+
"Failed to create EGL resource context: %s", get_egl_error());
144+
return FALSE;
145+
}
146+
127147
return TRUE;
128148
}
129149

@@ -155,6 +175,20 @@ gboolean fl_renderer_make_current(FlRenderer* self, GError** error) {
155175
return TRUE;
156176
}
157177

178+
gboolean fl_renderer_make_resource_current(FlRenderer* self, GError** error) {
179+
FlRendererPrivate* priv =
180+
static_cast<FlRendererPrivate*>(fl_renderer_get_instance_private(self));
181+
182+
if (!eglMakeCurrent(priv->egl_display, priv->resource_surface,
183+
priv->resource_surface, priv->resource_context)) {
184+
g_set_error(error, fl_renderer_error_quark(), FL_RENDERER_ERROR_FAILED,
185+
"Failed to make EGL context current: %s", get_egl_error());
186+
return FALSE;
187+
}
188+
189+
return TRUE;
190+
}
191+
158192
gboolean fl_renderer_clear_current(FlRenderer* self, GError** error) {
159193
FlRendererPrivate* priv =
160194
static_cast<FlRendererPrivate*>(fl_renderer_get_instance_private(self));

shell/platform/linux/fl_renderer.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,19 @@ void* fl_renderer_get_proc_address(FlRenderer* renderer, const char* name);
8080
*/
8181
gboolean fl_renderer_make_current(FlRenderer* renderer, GError** error);
8282

83+
/**
84+
* fl_renderer_make_resource_current:
85+
* @renderer: an #FlRenderer.
86+
* @error: (allow-none): #GError location to store the error occurring, or %NULL
87+
* to ignore.
88+
*
89+
* Makes the resource rendering context current.
90+
*
91+
* Returns %TRUE if successful.
92+
*/
93+
gboolean fl_renderer_make_resource_current(FlRenderer* renderer,
94+
GError** error);
95+
8396
/**
8497
* fl_renderer_clear_current:
8598
* @renderer: an #FlRenderer.

shell/platform/linux/testing/mock_egl.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ EGLContext eglCreateContext(EGLDisplay dpy,
2323
return nullptr;
2424
}
2525

26+
EGLSurface eglCreatePbufferSurface(EGLDisplay dpy,
27+
EGLConfig config,
28+
const EGLint* attrib_list) {
29+
return nullptr;
30+
}
31+
2632
EGLSurface eglCreateWindowSurface(EGLDisplay dpy,
2733
EGLConfig config,
2834
EGLNativeWindowType win,

0 commit comments

Comments
 (0)