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

Commit d2944ef

Browse files
committed
Refactor FlutterEngine usage in Linux shell
1 parent 1dba1ef commit d2944ef

File tree

14 files changed

+669
-182
lines changed

14 files changed

+669
-182
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,8 +1159,17 @@ FILE: ../../../flutter/shell/platform/glfw/public/flutter_glfw.h
11591159
FILE: ../../../flutter/shell/platform/glfw/text_input_plugin.cc
11601160
FILE: ../../../flutter/shell/platform/glfw/text_input_plugin.h
11611161
FILE: ../../../flutter/shell/platform/linux/fl_dart_project.cc
1162+
FILE: ../../../flutter/shell/platform/linux/fl_engine.cc
1163+
FILE: ../../../flutter/shell/platform/linux/fl_engine_private.h
1164+
FILE: ../../../flutter/shell/platform/linux/fl_renderer.cc
1165+
FILE: ../../../flutter/shell/platform/linux/fl_renderer.h
1166+
FILE: ../../../flutter/shell/platform/linux/fl_renderer_egl.cc
1167+
FILE: ../../../flutter/shell/platform/linux/fl_renderer_egl.h
1168+
FILE: ../../../flutter/shell/platform/linux/fl_renderer_x11.cc
1169+
FILE: ../../../flutter/shell/platform/linux/fl_renderer_x11.h
11621170
FILE: ../../../flutter/shell/platform/linux/fl_view.cc
11631171
FILE: ../../../flutter/shell/platform/linux/public/flutter_linux/fl_dart_project.h
1172+
FILE: ../../../flutter/shell/platform/linux/public/flutter_linux/fl_engine.h
11641173
FILE: ../../../flutter/shell/platform/linux/public/flutter_linux/fl_view.h
11651174
FILE: ../../../flutter/shell/platform/linux/public/flutter_linux/flutter_linux.h
11661175
FILE: ../../../flutter/shell/platform/windows/angle_surface_manager.cc

shell/platform/linux/BUILD.gn

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ source_set("flutter_linux") {
5757

5858
sources = [
5959
"fl_dart_project.cc",
60+
"fl_engine.cc",
61+
"fl_renderer.cc",
62+
"fl_renderer_egl.cc",
63+
"fl_renderer_x11.cc",
6064
"fl_view.cc",
6165
]
6266

shell/platform/linux/fl_engine.cc

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
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/public/flutter_linux/fl_engine.h"
6+
#include "flutter/shell/platform/linux/fl_engine_private.h"
7+
#include "flutter/shell/platform/linux/fl_renderer.h"
8+
9+
#include <gmodule.h>
10+
11+
struct _FlEngine {
12+
GObject parent_instance;
13+
14+
FlDartProject *project;
15+
FlRenderer* renderer;
16+
FLUTTER_API_SYMBOL(FlutterEngine) engine;
17+
};
18+
19+
G_DEFINE_TYPE(FlEngine, fl_engine, G_TYPE_OBJECT)
20+
21+
static void* fl_engine_gl_proc_resolver(void* user_data, const char* name) {
22+
FlEngine* self = static_cast<FlEngine*>(user_data);
23+
return fl_renderer_get_proc_address(self->renderer, name);
24+
}
25+
26+
static bool fl_engine_gl_make_current(void* user_data) {
27+
FlEngine* self = static_cast<FlEngine*>(user_data);
28+
g_autoptr(GError) error = NULL;
29+
gboolean result = fl_renderer_make_current(self->renderer, &error);
30+
if (!result)
31+
g_warning ("%s", error->message);
32+
return result;
33+
}
34+
35+
static bool fl_engine_gl_clear_current(void* user_data) {
36+
FlEngine* self = static_cast<FlEngine*>(user_data);
37+
g_autoptr(GError) error = NULL;
38+
gboolean result = fl_renderer_clear_current(self->renderer, &error);
39+
if (!result)
40+
g_warning ("%s", error->message);
41+
return result;
42+
}
43+
44+
static uint32_t fl_engine_gl_fbo_callback(void* user_data) {
45+
FlEngine* self = static_cast<FlEngine*>(user_data);
46+
return fl_renderer_get_fbo(self->renderer);
47+
}
48+
49+
static bool fl_engine_gl_present(void* user_data) {
50+
FlEngine* self = static_cast<FlEngine*>(user_data);
51+
g_autoptr(GError) error = NULL;
52+
gboolean result = fl_renderer_present(self->renderer, &error);
53+
if (!result)
54+
g_warning ("%s", error->message);
55+
return result;
56+
}
57+
58+
static void fl_engine_dispose(GObject* object) {
59+
FlEngine* self = FL_ENGINE(object);
60+
61+
g_clear_object(&self->project);
62+
g_clear_object(&self->renderer);
63+
64+
FlutterEngineDeinitialize(self->engine);
65+
FlutterEngineShutdown(self->engine);
66+
67+
G_OBJECT_CLASS(fl_engine_parent_class)->dispose(object);
68+
}
69+
70+
static void fl_engine_class_init(FlEngineClass* klass) {
71+
G_OBJECT_CLASS(klass)->dispose = fl_engine_dispose;
72+
}
73+
74+
static void fl_engine_init(FlEngine* self) {}
75+
76+
FlEngine* fl_engine_new(FlDartProject *project, FlRenderer* renderer) {
77+
g_return_val_if_fail (FL_IS_DART_PROJECT (project), nullptr);
78+
g_return_val_if_fail (FL_IS_RENDERER(renderer), nullptr);
79+
80+
FlEngine* self =
81+
static_cast<FlEngine*>(g_object_new(fl_engine_get_type(), nullptr));
82+
self->project = static_cast<FlDartProject*>(g_object_ref (project));
83+
self->renderer = static_cast<FlRenderer*>(g_object_ref(renderer));
84+
return self;
85+
}
86+
87+
FlRenderer* fl_engine_get_renderer(FlEngine* self) {
88+
return self->renderer;
89+
}
90+
91+
gboolean fl_engine_start(FlEngine* self, GError** error) {
92+
if (!fl_renderer_start(self->renderer, error))
93+
return FALSE;
94+
95+
FlutterRendererConfig config = {};
96+
config.type = kOpenGL;
97+
config.open_gl.struct_size = sizeof(FlutterOpenGLRendererConfig);
98+
config.open_gl.gl_proc_resolver = fl_engine_gl_proc_resolver;
99+
config.open_gl.make_current = fl_engine_gl_make_current;
100+
config.open_gl.clear_current = fl_engine_gl_clear_current;
101+
config.open_gl.fbo_callback = fl_engine_gl_fbo_callback;
102+
config.open_gl.present = fl_engine_gl_present;
103+
104+
FlutterProjectArgs args = {};
105+
args.struct_size = sizeof(FlutterProjectArgs);
106+
args.assets_path = fl_dart_project_get_assets_path(self->project);
107+
args.icu_data_path = fl_dart_project_get_icu_data_path(self->project);
108+
109+
FlutterEngineResult result = FlutterEngineInitialize(
110+
FLUTTER_ENGINE_VERSION, &config, &args, self, &self->engine);
111+
if (result != kSuccess) {
112+
g_set_error(error, fl_renderer_error_quark(), FL_RENDERER_ERROR_FAILED,
113+
"Failed to initialize Flutter engine");
114+
return FALSE;
115+
}
116+
117+
result = FlutterEngineRunInitialized(self->engine);
118+
if (result != kSuccess) {
119+
g_set_error(error, fl_renderer_error_quark(), FL_RENDERER_ERROR_FAILED,
120+
"Failed to run Flutter engine");
121+
return FALSE;
122+
}
123+
124+
return TRUE;
125+
}
126+
127+
FlDartProject* fl_engine_get_project(FlEngine* self) {
128+
g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
129+
130+
return self->project;
131+
}
132+
133+
void fl_engine_send_window_metrics_event(FlEngine* self,
134+
size_t width,
135+
size_t height,
136+
double pixel_ratio) {
137+
FlutterWindowMetricsEvent event = {};
138+
event.struct_size = sizeof(FlutterWindowMetricsEvent);
139+
event.width = width;
140+
event.height = height;
141+
event.pixel_ratio = pixel_ratio;
142+
FlutterEngineSendWindowMetricsEvent(self->engine, &event);
143+
}
144+
145+
void
146+
fl_engine_send_mouse_pointer_event(FlEngine* self,
147+
FlutterPointerPhase phase,
148+
size_t timestamp,
149+
double x,
150+
double y,
151+
int64_t buttons) {
152+
FlutterPointerEvent fl_event = {};
153+
fl_event.struct_size = sizeof(fl_event);
154+
fl_event.phase = phase;
155+
fl_event.timestamp = timestamp;
156+
fl_event.x = x;
157+
fl_event.y = y;
158+
fl_event.device_kind = kFlutterPointerDeviceKindMouse;
159+
fl_event.buttons = buttons;
160+
FlutterEngineSendPointerEvent(self->engine, &fl_event, 1);
161+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_ENGINE_PRIVATE_H_
6+
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_ENGINE_PRIVATE_H_
7+
8+
#include <glib-object.h>
9+
10+
#include "flutter/shell/platform/embedder/embedder.h"
11+
#include "flutter/shell/platform/linux/fl_renderer.h"
12+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_dart_project.h"
13+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
14+
15+
G_BEGIN_DECLS
16+
17+
FlEngine* fl_engine_new(FlDartProject* project, FlRenderer* renderer);
18+
19+
gboolean fl_engine_start(FlEngine* self, GError** error);
20+
21+
FlRenderer* fl_engine_get_renderer(FlEngine* engine);
22+
23+
void fl_engine_send_window_metrics_event(FlEngine* engine,
24+
size_t width,
25+
size_t height,
26+
double pixel_ratio);
27+
28+
void fl_engine_send_mouse_pointer_event(FlEngine* engine,
29+
FlutterPointerPhase phase,
30+
size_t timestamp,
31+
double x,
32+
double y,
33+
int64_t buttons);
34+
35+
G_END_DECLS
36+
37+
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_ENGINE_PRIVATE_H_
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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 "fl_renderer.h"
6+
7+
#include "flutter/shell/platform/embedder/embedder.h"
8+
9+
G_DEFINE_QUARK(fl_renderer_error_quark, fl_renderer_error)
10+
11+
G_DEFINE_TYPE(FlRenderer, fl_renderer, G_TYPE_OBJECT)
12+
13+
static gboolean fl_renderer_real_start(FlRenderer* self, GError **error) {
14+
return TRUE;
15+
}
16+
17+
static void fl_renderer_class_init(FlRendererClass* klass) {
18+
klass->start = fl_renderer_real_start;
19+
}
20+
21+
static void fl_renderer_init(FlRenderer* self) {}
22+
23+
gboolean fl_renderer_start(FlRenderer* self, GError **error) {
24+
return FL_RENDERER_GET_CLASS(self)->start(self, error);
25+
}
26+
27+
void* fl_renderer_get_proc_address(FlRenderer* self, const char* name) {
28+
return FL_RENDERER_GET_CLASS(self)->get_proc_address(self, name);
29+
}
30+
31+
gboolean fl_renderer_make_current(FlRenderer* self, GError **error) {
32+
return FL_RENDERER_GET_CLASS(self)->make_current(self, error);
33+
}
34+
35+
gboolean fl_renderer_clear_current(FlRenderer* self, GError **error) {
36+
return FL_RENDERER_GET_CLASS(self)->clear_current(self, error);
37+
}
38+
39+
guint32 fl_renderer_get_fbo(FlRenderer* self) {
40+
return FL_RENDERER_GET_CLASS(self)->get_fbo(self);
41+
}
42+
43+
gboolean fl_renderer_present(FlRenderer* self, GError **error) {
44+
return FL_RENDERER_GET_CLASS(self)->present(self, error);
45+
}
46+

shell/platform/linux/fl_renderer.h

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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+
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_RENDERER_H_
6+
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_RENDERER_H_
7+
8+
#include <glib-object.h>
9+
10+
#include "flutter/shell/platform/linux/public/flutter_linux/fl_dart_project.h"
11+
12+
G_BEGIN_DECLS
13+
14+
typedef enum {
15+
FL_RENDERER_ERROR_FAILED,
16+
} FlRendererError;
17+
18+
GQuark fl_renderer_error_quark(void) G_GNUC_CONST;
19+
20+
G_DECLARE_DERIVABLE_TYPE(FlRenderer, fl_renderer, FL, RENDERER, GObject)
21+
22+
struct _FlRendererClass {
23+
GObjectClass parent_class;
24+
25+
gboolean (*start)(FlRenderer* renderer, GError** error);
26+
void* (*get_proc_address)(FlRenderer* renderer, const char* name);
27+
gboolean (*make_current)(FlRenderer* renderer, GError** error);
28+
gboolean (*clear_current)(FlRenderer* renderer, GError** error);
29+
guint32 (*get_fbo)(FlRenderer* renderer);
30+
gboolean (*present)(FlRenderer* renderer, GError** error);
31+
};
32+
33+
G_END_DECLS
34+
35+
gboolean fl_renderer_start(FlRenderer* self, GError** error);
36+
37+
void* fl_renderer_get_proc_address(FlRenderer* renderer, const char* name);
38+
39+
gboolean fl_renderer_make_current(FlRenderer* renderer, GError** error);
40+
41+
gboolean fl_renderer_clear_current(FlRenderer* renderer, GError** error);
42+
43+
guint32 fl_renderer_get_fbo(FlRenderer* renderer);
44+
45+
gboolean fl_renderer_present(FlRenderer* renderer, GError** error);
46+
47+
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_RENDERER_H_

0 commit comments

Comments
 (0)