Skip to content

Commit e0472d6

Browse files
robert-ancellGitHub Actions Bot
authored andcommitted
Fix rendering corruption by Flutter and GDK sharing the same OpenGL context (flutter#53103)
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 1a948ed commit e0472d6

1 file changed

Lines changed: 15 additions & 3 deletions

File tree

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

@@ -39,6 +42,7 @@ static void fl_renderer_gdk_clear_current(FlRenderer* renderer) {
3942
static void fl_renderer_gdk_dispose(GObject* object) {
4043
FlRendererGdk* self = FL_RENDERER_GDK(object);
4144

45+
g_clear_object(&self->gdk_context);
4246
g_clear_object(&self->main_context);
4347
g_clear_object(&self->resource_context);
4448

@@ -64,6 +68,14 @@ FlRendererGdk* fl_renderer_gdk_new(GdkWindow* window) {
6468
}
6569

6670
gboolean fl_renderer_gdk_create_contexts(FlRendererGdk* self, GError** error) {
71+
self->gdk_context = gdk_window_create_gl_context(self->window, error);
72+
if (self->gdk_context == nullptr) {
73+
return FALSE;
74+
}
75+
if (!gdk_gl_context_realize(self->gdk_context, error)) {
76+
return FALSE;
77+
}
78+
6779
self->main_context = gdk_window_create_gl_context(self->window, error);
6880
if (self->main_context == nullptr) {
6981
return FALSE;
@@ -85,5 +97,5 @@ gboolean fl_renderer_gdk_create_contexts(FlRendererGdk* self, GError** error) {
8597

8698
GdkGLContext* fl_renderer_gdk_get_context(FlRendererGdk* self) {
8799
g_return_val_if_fail(FL_IS_RENDERER_GDK(self), nullptr);
88-
return self->main_context;
100+
return self->gdk_context;
89101
}

0 commit comments

Comments
 (0)