Skip to content

Commit 407bae5

Browse files
committed
Fix rendering corruption by Flutter and GDK sharing the same OpenGL context
Solved by having three contexts - one for GDK and two for Flutter. Regression introduced in flutter#50754 Fixes flutter/flutter#148653
1 parent 21f1d14 commit 407bae5

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

shell/platform/linux/fl_renderer_gdk.cc

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ struct _FlRendererGdk {
1010
// Window being rendered on.
1111
GdkWindow* window;
1212

13-
// Main OpenGL rendering context.
13+
// OpenGL rendering context used by GDK.
14+
GdkGLContext* gdk_context;
15+
16+
// Main OpenGL rendering context used by Flutter.
1417
GdkGLContext* main_context;
1518

16-
// Secondary OpenGL rendering context.
19+
// Secondary OpenGL rendering context used by Flutter.
1720
GdkGLContext* resource_context;
1821
};
1922

@@ -56,6 +59,7 @@ static gdouble fl_renderer_gdk_get_refresh_rate(FlRenderer* renderer) {
5659
static void fl_renderer_gdk_dispose(GObject* object) {
5760
FlRendererGdk* self = FL_RENDERER_GDK(object);
5861

62+
g_clear_object(&self->gdk_context);
5963
g_clear_object(&self->main_context);
6064
g_clear_object(&self->resource_context);
6165

@@ -82,6 +86,14 @@ FlRendererGdk* fl_renderer_gdk_new(GdkWindow* window) {
8286
}
8387

8488
gboolean fl_renderer_gdk_create_contexts(FlRendererGdk* self, GError** error) {
89+
self->gdk_context = gdk_window_create_gl_context(self->window, error);
90+
if (self->gdk_context == nullptr) {
91+
return FALSE;
92+
}
93+
if (!gdk_gl_context_realize(self->gdk_context, error)) {
94+
return FALSE;
95+
}
96+
8597
self->main_context = gdk_window_create_gl_context(self->window, error);
8698
if (self->main_context == nullptr) {
8799
return FALSE;
@@ -103,5 +115,5 @@ gboolean fl_renderer_gdk_create_contexts(FlRendererGdk* self, GError** error) {
103115

104116
GdkGLContext* fl_renderer_gdk_get_context(FlRendererGdk* self) {
105117
g_return_val_if_fail(FL_IS_RENDERER_GDK(self), nullptr);
106-
return self->main_context;
118+
return self->gdk_context;
107119
}

0 commit comments

Comments
 (0)