Skip to content

Commit bfe95d3

Browse files
Move OpenGL context management to FlOpenGLManager (#166025)
This helps to make a non-OpenGL FlRenderer
1 parent d6ec7d4 commit bfe95d3

19 files changed

+320
-590
lines changed

engine/src/flutter/ci/licenses_golden/licenses_flutter

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53264,6 +53264,8 @@ ORIGIN: ../../../flutter/shell/platform/linux/fl_mouse_cursor_channel.cc + ../..
5326453264
ORIGIN: ../../../flutter/shell/platform/linux/fl_mouse_cursor_channel.h + ../../../flutter/LICENSE
5326553265
ORIGIN: ../../../flutter/shell/platform/linux/fl_mouse_cursor_handler.cc + ../../../flutter/LICENSE
5326653266
ORIGIN: ../../../flutter/shell/platform/linux/fl_mouse_cursor_handler.h + ../../../flutter/LICENSE
53267+
ORIGIN: ../../../flutter/shell/platform/linux/fl_opengl_manager.cc + ../../../flutter/LICENSE
53268+
ORIGIN: ../../../flutter/shell/platform/linux/fl_opengl_manager.h + ../../../flutter/LICENSE
5326753269
ORIGIN: ../../../flutter/shell/platform/linux/fl_pixel_buffer_texture.cc + ../../../flutter/LICENSE
5326853270
ORIGIN: ../../../flutter/shell/platform/linux/fl_pixel_buffer_texture_private.h + ../../../flutter/LICENSE
5326953271
ORIGIN: ../../../flutter/shell/platform/linux/fl_pixel_buffer_texture_test.cc + ../../../flutter/LICENSE
@@ -53284,10 +53286,6 @@ ORIGIN: ../../../flutter/shell/platform/linux/fl_renderable.cc + ../../../flutte
5328453286
ORIGIN: ../../../flutter/shell/platform/linux/fl_renderable.h + ../../../flutter/LICENSE
5328553287
ORIGIN: ../../../flutter/shell/platform/linux/fl_renderer.cc + ../../../flutter/LICENSE
5328653288
ORIGIN: ../../../flutter/shell/platform/linux/fl_renderer.h + ../../../flutter/LICENSE
53287-
ORIGIN: ../../../flutter/shell/platform/linux/fl_renderer_gdk.cc + ../../../flutter/LICENSE
53288-
ORIGIN: ../../../flutter/shell/platform/linux/fl_renderer_gdk.h + ../../../flutter/LICENSE
53289-
ORIGIN: ../../../flutter/shell/platform/linux/fl_renderer_headless.cc + ../../../flutter/LICENSE
53290-
ORIGIN: ../../../flutter/shell/platform/linux/fl_renderer_headless.h + ../../../flutter/LICENSE
5329153289
ORIGIN: ../../../flutter/shell/platform/linux/fl_renderer_test.cc + ../../../flutter/LICENSE
5329253290
ORIGIN: ../../../flutter/shell/platform/linux/fl_scrolling_manager.cc + ../../../flutter/LICENSE
5329353291
ORIGIN: ../../../flutter/shell/platform/linux/fl_scrolling_manager.h + ../../../flutter/LICENSE
@@ -56281,6 +56279,8 @@ FILE: ../../../flutter/shell/platform/linux/fl_mouse_cursor_channel.cc
5628156279
FILE: ../../../flutter/shell/platform/linux/fl_mouse_cursor_channel.h
5628256280
FILE: ../../../flutter/shell/platform/linux/fl_mouse_cursor_handler.cc
5628356281
FILE: ../../../flutter/shell/platform/linux/fl_mouse_cursor_handler.h
56282+
FILE: ../../../flutter/shell/platform/linux/fl_opengl_manager.cc
56283+
FILE: ../../../flutter/shell/platform/linux/fl_opengl_manager.h
5628456284
FILE: ../../../flutter/shell/platform/linux/fl_pixel_buffer_texture.cc
5628556285
FILE: ../../../flutter/shell/platform/linux/fl_pixel_buffer_texture_private.h
5628656286
FILE: ../../../flutter/shell/platform/linux/fl_pixel_buffer_texture_test.cc
@@ -56301,10 +56301,6 @@ FILE: ../../../flutter/shell/platform/linux/fl_renderable.cc
5630156301
FILE: ../../../flutter/shell/platform/linux/fl_renderable.h
5630256302
FILE: ../../../flutter/shell/platform/linux/fl_renderer.cc
5630356303
FILE: ../../../flutter/shell/platform/linux/fl_renderer.h
56304-
FILE: ../../../flutter/shell/platform/linux/fl_renderer_gdk.cc
56305-
FILE: ../../../flutter/shell/platform/linux/fl_renderer_gdk.h
56306-
FILE: ../../../flutter/shell/platform/linux/fl_renderer_headless.cc
56307-
FILE: ../../../flutter/shell/platform/linux/fl_renderer_headless.h
5630856304
FILE: ../../../flutter/shell/platform/linux/fl_renderer_test.cc
5630956305
FILE: ../../../flutter/shell/platform/linux/fl_scrolling_manager.cc
5631056306
FILE: ../../../flutter/shell/platform/linux/fl_scrolling_manager.h

engine/src/flutter/shell/platform/linux/BUILD.gn

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ source_set("flutter_linux_sources") {
128128
"fl_method_response.cc",
129129
"fl_mouse_cursor_channel.cc",
130130
"fl_mouse_cursor_handler.cc",
131+
"fl_opengl_manager.cc",
131132
"fl_pixel_buffer_texture.cc",
132133
"fl_platform_channel.cc",
133134
"fl_platform_handler.cc",
@@ -136,8 +137,6 @@ source_set("flutter_linux_sources") {
136137
"fl_pointer_manager.cc",
137138
"fl_renderable.cc",
138139
"fl_renderer.cc",
139-
"fl_renderer_gdk.cc",
140-
"fl_renderer_headless.cc",
141140
"fl_scrolling_manager.cc",
142141
"fl_settings.cc",
143142
"fl_settings_channel.cc",
@@ -261,7 +260,7 @@ executable("flutter_linux_unittests") {
261260
"testing/mock_epoxy.cc",
262261
"testing/mock_gtk.cc",
263262
"testing/mock_plugin_registrar.cc",
264-
"testing/mock_renderer.cc",
263+
"testing/mock_renderable.cc",
265264
"testing/mock_settings.cc",
266265
"testing/mock_signal_handler.cc",
267266
"testing/mock_texture_registrar.cc",

engine/src/flutter/shell/platform/linux/fl_engine.cc

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
66

7+
#include <epoxy/egl.h>
78
#include <gmodule.h>
89

910
#include <cstring>
@@ -16,12 +17,11 @@
1617
#include "flutter/shell/platform/linux/fl_display_monitor.h"
1718
#include "flutter/shell/platform/linux/fl_engine_private.h"
1819
#include "flutter/shell/platform/linux/fl_keyboard_handler.h"
20+
#include "flutter/shell/platform/linux/fl_opengl_manager.h"
1921
#include "flutter/shell/platform/linux/fl_pixel_buffer_texture_private.h"
2022
#include "flutter/shell/platform/linux/fl_platform_handler.h"
2123
#include "flutter/shell/platform/linux/fl_plugin_registrar_private.h"
2224
#include "flutter/shell/platform/linux/fl_renderer.h"
23-
#include "flutter/shell/platform/linux/fl_renderer_gdk.h"
24-
#include "flutter/shell/platform/linux/fl_renderer_headless.h"
2525
#include "flutter/shell/platform/linux/fl_settings_handler.h"
2626
#include "flutter/shell/platform/linux/fl_texture_gl_private.h"
2727
#include "flutter/shell/platform/linux/fl_texture_registrar_private.h"
@@ -51,6 +51,9 @@ struct _FlEngine {
5151
// Renders the Flutter app.
5252
FlRenderer* renderer;
5353

54+
// Manages OpenGL contexts.
55+
FlOpenGLManager* opengl_manager;
56+
5457
// Messenger used to send and receive platform messages.
5558
FlBinaryMessenger* binary_messenger;
5659

@@ -274,25 +277,24 @@ static bool compositor_present_view_callback(
274277
// Flutter engine rendering callbacks.
275278

276279
static void* fl_engine_gl_proc_resolver(void* user_data, const char* name) {
277-
FlEngine* self = static_cast<FlEngine*>(user_data);
278-
return fl_renderer_get_proc_address(self->renderer, name);
280+
return reinterpret_cast<void*>(eglGetProcAddress(name));
279281
}
280282

281283
static bool fl_engine_gl_make_current(void* user_data) {
282284
FlEngine* self = static_cast<FlEngine*>(user_data);
283-
fl_renderer_make_current(self->renderer);
285+
fl_opengl_manager_make_current(self->opengl_manager);
284286
return true;
285287
}
286288

287289
static bool fl_engine_gl_clear_current(void* user_data) {
288290
FlEngine* self = static_cast<FlEngine*>(user_data);
289-
fl_renderer_clear_current(self->renderer);
291+
fl_opengl_manager_clear_current(self->opengl_manager);
290292
return true;
291293
}
292294

293295
static uint32_t fl_engine_gl_get_fbo(void* user_data) {
294-
FlEngine* self = static_cast<FlEngine*>(user_data);
295-
return fl_renderer_get_fbo(self->renderer);
296+
// There is only one frame buffer object - always return that.
297+
return 0;
296298
}
297299

298300
static bool fl_engine_gl_present(void* user_data) {
@@ -303,7 +305,7 @@ static bool fl_engine_gl_present(void* user_data) {
303305

304306
static bool fl_engine_gl_make_resource_current(void* user_data) {
305307
FlEngine* self = static_cast<FlEngine*>(user_data);
306-
fl_renderer_make_resource_current(self->renderer);
308+
fl_opengl_manager_make_resource_current(self->opengl_manager);
307309
return true;
308310
}
309311

@@ -483,6 +485,7 @@ static void fl_engine_dispose(GObject* object) {
483485
g_clear_object(&self->project);
484486
g_clear_object(&self->display_monitor);
485487
g_clear_object(&self->renderer);
488+
g_clear_object(&self->opengl_manager);
486489
g_clear_object(&self->texture_registrar);
487490
g_clear_object(&self->binary_messenger);
488491
g_clear_object(&self->settings_handler);
@@ -533,6 +536,8 @@ static void fl_engine_init(FlEngine* self) {
533536
g_warning("Failed get get engine function pointers");
534537
}
535538

539+
self->opengl_manager = fl_opengl_manager_new();
540+
536541
self->display_monitor =
537542
fl_display_monitor_new(self, gdk_display_get_default());
538543
self->task_runner = fl_task_runner_new(self);
@@ -550,15 +555,13 @@ static void fl_engine_init(FlEngine* self) {
550555
}
551556

552557
static FlEngine* fl_engine_new_full(FlDartProject* project,
553-
FlRenderer* renderer,
554558
FlBinaryMessenger* binary_messenger) {
555559
g_return_val_if_fail(FL_IS_DART_PROJECT(project), nullptr);
556-
g_return_val_if_fail(FL_IS_RENDERER(renderer), nullptr);
557560

558561
FlEngine* self = FL_ENGINE(g_object_new(fl_engine_get_type(), nullptr));
559562

560563
self->project = FL_DART_PROJECT(g_object_ref(project));
561-
self->renderer = FL_RENDERER(g_object_ref(renderer));
564+
self->renderer = fl_renderer_new(self);
562565
if (binary_messenger != nullptr) {
563566
self->binary_messenger =
564567
FL_BINARY_MESSENGER(g_object_ref(binary_messenger));
@@ -570,8 +573,6 @@ static FlEngine* fl_engine_new_full(FlDartProject* project,
570573
fl_mouse_cursor_handler_new(self->binary_messenger);
571574
self->windowing_handler = fl_windowing_handler_new(self);
572575

573-
fl_renderer_set_engine(self->renderer, self);
574-
575576
return self;
576577
}
577578

@@ -581,35 +582,30 @@ FlEngine* fl_engine_for_id(int64_t id) {
581582
return FL_ENGINE(engine);
582583
}
583584

584-
FlEngine* fl_engine_new_with_renderer(FlDartProject* project,
585-
FlRenderer* renderer) {
586-
g_return_val_if_fail(FL_IS_DART_PROJECT(project), nullptr);
587-
g_return_val_if_fail(FL_IS_RENDERER(renderer), nullptr);
588-
return fl_engine_new_full(project, renderer, nullptr);
589-
}
590-
591585
G_MODULE_EXPORT FlEngine* fl_engine_new(FlDartProject* project) {
592-
g_autoptr(FlRendererGdk) renderer = fl_renderer_gdk_new();
593-
return fl_engine_new_with_renderer(project, FL_RENDERER(renderer));
586+
return fl_engine_new_full(project, nullptr);
594587
}
595588

596589
FlEngine* fl_engine_new_with_binary_messenger(
597590
FlBinaryMessenger* binary_messenger) {
598591
g_autoptr(FlDartProject) project = fl_dart_project_new();
599-
g_autoptr(FlRendererGdk) renderer = fl_renderer_gdk_new();
600-
return fl_engine_new_full(project, FL_RENDERER(renderer), binary_messenger);
592+
return fl_engine_new_full(project, binary_messenger);
601593
}
602594

603595
G_MODULE_EXPORT FlEngine* fl_engine_new_headless(FlDartProject* project) {
604-
g_autoptr(FlRendererHeadless) renderer = fl_renderer_headless_new();
605-
return fl_engine_new_with_renderer(project, FL_RENDERER(renderer));
596+
return fl_engine_new(project);
606597
}
607598

608599
FlRenderer* fl_engine_get_renderer(FlEngine* self) {
609600
g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
610601
return self->renderer;
611602
}
612603

604+
FlOpenGLManager* fl_engine_get_opengl_manager(FlEngine* self) {
605+
g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
606+
return self->opengl_manager;
607+
}
608+
613609
FlDisplayMonitor* fl_engine_get_display_monitor(FlEngine* self) {
614610
g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
615611
return self->display_monitor;

engine/src/flutter/shell/platform/linux/fl_engine_private.h

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "flutter/shell/platform/linux/fl_display_monitor.h"
1212
#include "flutter/shell/platform/linux/fl_keyboard_manager.h"
1313
#include "flutter/shell/platform/linux/fl_mouse_cursor_handler.h"
14+
#include "flutter/shell/platform/linux/fl_opengl_manager.h"
1415
#include "flutter/shell/platform/linux/fl_renderable.h"
1516
#include "flutter/shell/platform/linux/fl_renderer.h"
1617
#include "flutter/shell/platform/linux/fl_task_runner.h"
@@ -63,26 +64,24 @@ FlEngine* fl_engine_new_with_binary_messenger(
6364
FlBinaryMessenger* binary_messenger);
6465

6566
/**
66-
* fl_engine_new_with_renderer:
67-
* @project: an #FlDartProject.
68-
* @renderer: an #FlRenderer.
67+
* fl_engine_get_renderer:
68+
* @engine: an #FlEngine.
6969
*
70-
* Creates new Flutter engine.
70+
* Gets the renderer used by this engine.
7171
*
72-
* Returns: a new #FlEngine.
72+
* Returns: an #FlRenderer.
7373
*/
74-
FlEngine* fl_engine_new_with_renderer(FlDartProject* project,
75-
FlRenderer* renderer);
74+
FlRenderer* fl_engine_get_renderer(FlEngine* engine);
7675

7776
/**
78-
* fl_engine_get_renderer:
77+
* fl_engine_get_opengl_manager:
7978
* @engine: an #FlEngine.
8079
*
81-
* Gets the renderer used by this engine.
80+
* Gets the OpenGL manager used by this engine.
8281
*
83-
* Returns: an #FlRenderer.
82+
* Returns: an #FlOpenGLManager.
8483
*/
85-
FlRenderer* fl_engine_get_renderer(FlEngine* engine);
84+
FlOpenGLManager* fl_engine_get_opengl_manager(FlEngine* engine);
8685

8786
/**
8887
* fl_engine_get_display_monitor:

engine/src/flutter/shell/platform/linux/fl_engine_test.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
1111
#include "flutter/shell/platform/linux/public/flutter_linux/fl_json_message_codec.h"
1212
#include "flutter/shell/platform/linux/public/flutter_linux/fl_string_codec.h"
13-
#include "flutter/shell/platform/linux/testing/mock_renderer.h"
13+
#include "flutter/shell/platform/linux/testing/mock_renderable.h"
1414

1515
// MOCK_ENGINE_PROC is leaky by design
1616
// NOLINTBEGIN(clang-analyzer-core.StackAddressEscape)
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "flutter/shell/platform/linux/fl_opengl_manager.h"
6+
7+
struct _FlOpenGLManager {
8+
GObject parent_instance;
9+
10+
// OpenGL rendering context used by GDK.
11+
GdkGLContext* gdk_context;
12+
13+
// Main OpenGL rendering context used by Flutter.
14+
GdkGLContext* main_context;
15+
16+
// OpenGL rendering context used by a Flutter background thread for
17+
// asynchronous texture uploads.
18+
GdkGLContext* resource_context;
19+
};
20+
21+
G_DEFINE_TYPE(FlOpenGLManager, fl_opengl_manager, G_TYPE_OBJECT)
22+
23+
static void fl_opengl_manager_dispose(GObject* object) {
24+
FlOpenGLManager* self = FL_OPENGL_MANAGER(object);
25+
26+
g_clear_object(&self->gdk_context);
27+
g_clear_object(&self->main_context);
28+
g_clear_object(&self->resource_context);
29+
30+
G_OBJECT_CLASS(fl_opengl_manager_parent_class)->dispose(object);
31+
}
32+
33+
static void fl_opengl_manager_class_init(FlOpenGLManagerClass* klass) {
34+
G_OBJECT_CLASS(klass)->dispose = fl_opengl_manager_dispose;
35+
}
36+
37+
static void fl_opengl_manager_init(FlOpenGLManager* self) {}
38+
39+
FlOpenGLManager* fl_opengl_manager_new() {
40+
FlOpenGLManager* self =
41+
FL_OPENGL_MANAGER(g_object_new(fl_opengl_manager_get_type(), nullptr));
42+
return self;
43+
}
44+
45+
gboolean fl_opengl_manager_create_contexts(FlOpenGLManager* self,
46+
GdkWindow* window,
47+
GError** error) {
48+
g_return_val_if_fail(FL_IS_OPENGL_MANAGER(self), FALSE);
49+
50+
self->gdk_context = gdk_window_create_gl_context(window, error);
51+
if (self->gdk_context == nullptr) {
52+
return FALSE;
53+
}
54+
if (!gdk_gl_context_realize(self->gdk_context, error)) {
55+
return FALSE;
56+
}
57+
58+
self->main_context = gdk_window_create_gl_context(window, error);
59+
if (self->main_context == nullptr) {
60+
return FALSE;
61+
}
62+
if (!gdk_gl_context_realize(self->main_context, error)) {
63+
return FALSE;
64+
}
65+
66+
self->resource_context = gdk_window_create_gl_context(window, error);
67+
if (self->resource_context == nullptr) {
68+
return FALSE;
69+
}
70+
if (!gdk_gl_context_realize(self->resource_context, error)) {
71+
return FALSE;
72+
}
73+
74+
return TRUE;
75+
}
76+
77+
GdkGLContext* fl_opengl_manager_get_context(FlOpenGLManager* self) {
78+
g_return_val_if_fail(FL_IS_OPENGL_MANAGER(self), nullptr);
79+
return self->gdk_context;
80+
}
81+
82+
void fl_opengl_manager_make_current(FlOpenGLManager* self) {
83+
gdk_gl_context_make_current(self->main_context);
84+
}
85+
86+
void fl_opengl_manager_make_resource_current(FlOpenGLManager* self) {
87+
gdk_gl_context_make_current(self->resource_context);
88+
}
89+
90+
void fl_opengl_manager_clear_current(FlOpenGLManager* self) {
91+
gdk_gl_context_clear_current();
92+
}

0 commit comments

Comments
 (0)