@@ -40,7 +40,8 @@ constexpr char kSystemChannel[] = "flutter/system";
40
40
constexpr char kTypeKey [] = " type" ;
41
41
constexpr char kFontChange [] = " fontsChange" ;
42
42
43
- std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread (
43
+ void Shell::CreateShellOnPlatformThread (
44
+ ShellCreateCallback async_init_callback,
44
45
DartVMRef vm,
45
46
TaskRunners task_runners,
46
47
const WindowData window_data,
@@ -50,52 +51,55 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
50
51
const Shell::CreateCallback<Rasterizer>& on_create_rasterizer) {
51
52
if (!task_runners.IsValid ()) {
52
53
FML_LOG (ERROR) << " Task runners to run the shell were invalid." ;
53
- return nullptr ;
54
+ if (async_init_callback) {
55
+ async_init_callback (nullptr );
56
+ }
57
+ return ;
54
58
}
55
59
56
60
auto shell =
57
61
std::unique_ptr<Shell>(new Shell (std::move (vm), task_runners, settings));
58
62
59
63
// Create the rasterizer on the raster thread.
60
- std::promise<std::unique_ptr<Rasterizer>> rasterizer_promise;
61
- auto rasterizer_future = rasterizer_promise.get_future ();
62
- std::promise<fml::WeakPtr<SnapshotDelegate>> snapshot_delegate_promise;
63
- auto snapshot_delegate_future = snapshot_delegate_promise.get_future ();
64
+ auto rasterizer_promise =
65
+ std::make_shared<std::promise<std::unique_ptr<Rasterizer>>>();
66
+
64
67
fml::TaskRunner::RunNowOrPostTask (
65
- task_runners.GetRasterTaskRunner (), [&rasterizer_promise, //
66
- &snapshot_delegate_promise ,
67
- on_create_rasterizer, //
68
- shell = shell. get () //
69
- ]() {
68
+ task_runners.GetRasterTaskRunner (),
69
+ [rasterizer_promise ,
70
+ on_create_rasterizer = std::move ( on_create_rasterizer) , //
71
+ shell = shell. get () //
72
+ ]() mutable {
70
73
TRACE_EVENT0 (" flutter" , " ShellSetupGPUSubsystem" );
71
74
std::unique_ptr<Rasterizer> rasterizer (on_create_rasterizer (*shell));
72
- snapshot_delegate_promise.set_value (rasterizer->GetSnapshotDelegate ());
73
- rasterizer_promise.set_value (std::move (rasterizer));
75
+ rasterizer_promise->set_value (std::move (rasterizer));
74
76
});
75
77
76
78
// Create the platform view on the platform thread (this thread).
77
79
auto platform_view = on_create_platform_view (*shell.get ());
78
80
if (!platform_view || !platform_view->GetWeakPtr ()) {
79
- return nullptr ;
81
+ if (async_init_callback) {
82
+ async_init_callback (nullptr );
83
+ }
84
+ return ;
80
85
}
81
86
82
87
// Ask the platform view for the vsync waiter. This will be used by the engine
83
88
// to create the animator.
84
89
auto vsync_waiter = platform_view->CreateVSyncWaiter ();
85
90
if (!vsync_waiter) {
86
- return nullptr ;
91
+ if (async_init_callback) {
92
+ async_init_callback (nullptr );
93
+ }
94
+ return ;
87
95
}
88
96
89
97
// Create the IO manager on the IO thread. The IO manager must be initialized
90
98
// first because it has state that the other subsystems depend on. It must
91
99
// first be booted and the necessary references obtained to initialize the
92
100
// other subsystems.
93
- std::promise<std::unique_ptr<ShellIOManager>> io_manager_promise;
94
- auto io_manager_future = io_manager_promise.get_future ();
95
- std::promise<fml::WeakPtr<ShellIOManager>> weak_io_manager_promise;
96
- auto weak_io_manager_future = weak_io_manager_promise.get_future ();
97
- std::promise<fml::RefPtr<SkiaUnrefQueue>> unref_queue_promise;
98
- auto unref_queue_future = unref_queue_promise.get_future ();
101
+ auto io_manager_promise =
102
+ std::make_shared<std::promise<std::unique_ptr<ShellIOManager>>>();
99
103
auto io_task_runner = shell->GetTaskRunners ().GetIOTaskRunner ();
100
104
101
105
// TODO(gw280): The WeakPtr here asserts that we are derefing it on the
@@ -106,73 +110,75 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
106
110
// https://github.com/flutter/flutter/issues/42948
107
111
fml::TaskRunner::RunNowOrPostTask (
108
112
io_task_runner,
109
- [&io_manager_promise, //
110
- &weak_io_manager_promise, //
111
- &unref_queue_promise, //
112
- platform_view = platform_view->GetWeakPtr (), //
113
- io_task_runner, //
113
+ [io_task_runner,
114
+ io_manager_promise, //
115
+ weak_platform_view = platform_view->GetWeakPtr (), //
114
116
is_backgrounded_sync_switch = shell->GetIsGpuDisabledSyncSwitch () //
115
- ]() {
117
+ ]() mutable {
116
118
TRACE_EVENT0 (" flutter" , " ShellSetupIOSubsystem" );
117
119
auto io_manager = std::make_unique<ShellIOManager>(
118
- platform_view .getUnsafe ()->CreateResourceContext (),
120
+ weak_platform_view .getUnsafe ()->CreateResourceContext (),
119
121
is_backgrounded_sync_switch, io_task_runner);
120
- weak_io_manager_promise.set_value (io_manager->GetWeakPtr ());
121
- unref_queue_promise.set_value (io_manager->GetSkiaUnrefQueue ());
122
- io_manager_promise.set_value (std::move (io_manager));
122
+ io_manager_promise->set_value (std::move (io_manager));
123
123
});
124
124
125
125
// Send dispatcher_maker to the engine constructor because shell won't have
126
126
// platform_view set until Shell::Setup is called later.
127
127
auto dispatcher_maker = platform_view->GetDispatcherMaker ();
128
128
129
129
// Create the engine on the UI thread.
130
- std::promise<std::unique_ptr<Engine>> engine_promise;
131
- auto engine_future = engine_promise.get_future ();
132
130
fml::TaskRunner::RunNowOrPostTask (
133
131
shell->GetTaskRunners ().GetUITaskRunner (),
134
- fml::MakeCopyable ([&engine_promise, //
135
- shell = shell.get (), //
136
- &dispatcher_maker, //
137
- &window_data, //
138
- isolate_snapshot = std::move (isolate_snapshot), //
139
- vsync_waiter = std::move (vsync_waiter), //
140
- &weak_io_manager_future, //
141
- &snapshot_delegate_future, //
142
- &unref_queue_future //
132
+ fml::MakeCopyable (
133
+ [shell = std::move (shell), //
134
+ platform_view = std::move (platform_view),
135
+ async_init_callback = std::move (async_init_callback), //
136
+ dispatcher_in = std::move (dispatcher_maker), //
137
+ window_data = std::move (window_data), //
138
+ isolate_snapshot = std::move (isolate_snapshot), //
139
+ vsync_waiter = std::move (vsync_waiter), //
140
+ io_manager_promise, //
141
+ // io_manager_future, //
142
+ // rasterizer_future,
143
+ rasterizer_promise //
143
144
]() mutable {
144
- TRACE_EVENT0 (" flutter" , " ShellSetupUISubsystem" );
145
- const auto & task_runners = shell->GetTaskRunners ();
146
-
147
- // The animator is owned by the UI thread but it gets its vsync pulses
148
- // from the platform.
149
- auto animator = std::make_unique<Animator>(*shell, task_runners,
150
- std::move (vsync_waiter));
151
-
152
- engine_promise.set_value (std::make_unique<Engine>(
153
- *shell, //
154
- dispatcher_maker, //
155
- *shell->GetDartVM (), //
156
- std::move (isolate_snapshot), //
157
- task_runners, //
158
- window_data, //
159
- shell->GetSettings (), //
160
- std::move (animator), //
161
- weak_io_manager_future.get (), //
162
- unref_queue_future.get (), //
163
- snapshot_delegate_future.get () //
164
- ));
165
- }));
166
-
167
- if (!shell->Setup (std::move (platform_view), //
168
- engine_future.get (), //
169
- rasterizer_future.get (), //
170
- io_manager_future.get ()) //
171
- ) {
172
- return nullptr ;
173
- }
174
-
175
- return shell;
145
+ TRACE_EVENT0 (" flutter" , " ShellSetupUISubsystem" );
146
+ const auto & task_runners = shell->GetTaskRunners ();
147
+
148
+ // The animator is owned by the UI thread but it gets its vsync
149
+ // pulses from the platform.
150
+ auto animator = std::make_unique<Animator>(*shell, task_runners,
151
+ std::move (vsync_waiter));
152
+
153
+ // wait params(io、gpu task end)
154
+ auto rasterizer = rasterizer_promise->get_future ().get ();
155
+ auto snapshot_delegate = rasterizer->GetSnapshotDelegate ();
156
+ auto io_manager = io_manager_promise->get_future ().get ();
157
+ auto unref_queue = io_manager->GetSkiaUnrefQueue ();
158
+
159
+ auto engine_ref =
160
+ std::make_unique<Engine>(*(shell.get ()), //
161
+ dispatcher_in, //
162
+ *shell->GetDartVM (), //
163
+ std::move (isolate_snapshot), //
164
+ task_runners, //
165
+ window_data, //
166
+ shell->GetSettings (), //
167
+ std::move (animator), //
168
+ io_manager->GetWeakPtr (), //
169
+ std::move (unref_queue), //
170
+ std::move (snapshot_delegate) //
171
+ );
172
+ if (!shell->Setup (std::move (platform_view), //
173
+ std::move (engine_ref), //
174
+ std::move (rasterizer), //
175
+ std::move (io_manager)) //
176
+ ) {
177
+ async_init_callback (nullptr );
178
+ } else {
179
+ async_init_callback (std::move (shell));
180
+ }
181
+ }));
176
182
}
177
183
178
184
static void RecordStartupTimestamp () {
@@ -253,33 +259,48 @@ std::unique_ptr<Shell> Shell::Create(
253
259
);
254
260
}
255
261
256
- std::unique_ptr<Shell> Shell::Create (
257
- TaskRunners task_runners,
258
- const WindowData window_data,
259
- Settings settings,
260
- Shell::CreateCallback<PlatformView> on_create_platform_view,
261
- Shell::CreateCallback<Rasterizer> on_create_rasterizer) {
262
- PerformInitializationTasks (settings);
263
- PersistentCache::SetCacheSkSL (settings.cache_sksl );
264
-
262
+ void Shell::Create (ShellCreateCallback shell_init_callback,
263
+ std::unique_ptr<ShellCreateParams> params) {
264
+ PerformInitializationTasks (params->settings );
265
+ PersistentCache::SetCacheSkSL (params->settings .cache_sksl );
265
266
TRACE_EVENT0 (" flutter" , " Shell::Create" );
266
267
267
- auto vm = DartVMRef::Create (settings);
268
+ auto vm = DartVMRef::Create (params-> settings );
268
269
FML_CHECK (vm) << " Must be able to initialize the VM." ;
269
270
270
271
auto vm_data = vm->GetVMData ();
271
-
272
- return Shell::Create ( std::move (task_runners), //
273
- std::move (window_data), //
274
- std::move (settings), //
275
- vm_data->GetIsolateSnapshot (), // isolate snapshot
276
- on_create_platform_view, //
277
- on_create_rasterizer, //
278
- std::move (vm) //
272
+ Shell::Create ( std::move (shell_init_callback),
273
+ std::move (params-> task_runners ), //
274
+ std::move (params-> window_data ), //
275
+ std::move (params-> settings ), //
276
+ vm_data->GetIsolateSnapshot (), // isolate snapshot
277
+ std::move (params-> on_create_platform_view ), //
278
+ std::move (params-> on_create_rasterizer ), //
279
+ std::move (vm) //
279
280
);
280
281
}
281
282
282
283
std::unique_ptr<Shell> Shell::Create (
284
+ TaskRunners task_runners,
285
+ const WindowData window_data,
286
+ Settings settings,
287
+ Shell::CreateCallback<PlatformView> on_create_platform_view,
288
+ Shell::CreateCallback<Rasterizer> on_create_rasterizer) {
289
+ std::promise<std::unique_ptr<Shell>> shell_promise;
290
+ auto shell_future = shell_promise.get_future ();
291
+ Shell::Create (
292
+ [&shell_promise](std::unique_ptr<Shell> shell) mutable {
293
+ // ui thread here
294
+ shell_promise.set_value (std::move (shell));
295
+ },
296
+ std::make_unique<ShellCreateParams>(
297
+ std::move (task_runners), window_data, settings,
298
+ std::move (on_create_platform_view), std::move (on_create_rasterizer)));
299
+ return shell_future.get ();
300
+ }
301
+
302
+ void Shell::Create (
303
+ ShellCreateCallback shell_init_callback,
283
304
TaskRunners task_runners,
284
305
const WindowData window_data,
285
306
Settings settings,
@@ -294,35 +315,33 @@ std::unique_ptr<Shell> Shell::Create(
294
315
295
316
if (!task_runners.IsValid () || !on_create_platform_view ||
296
317
!on_create_rasterizer) {
297
- return nullptr ;
318
+ if (shell_init_callback) {
319
+ shell_init_callback (nullptr );
320
+ }
321
+ return ;
298
322
}
299
-
300
- fml::AutoResetWaitableEvent latch;
301
- std::unique_ptr<Shell> shell;
302
323
fml::TaskRunner::RunNowOrPostTask (
303
324
task_runners.GetPlatformTaskRunner (),
304
- fml::MakeCopyable ([&latch, //
305
- vm = std::move (vm), //
306
- &shell, //
307
- task_runners = std::move (task_runners), //
308
- window_data, //
309
- settings, //
310
- isolate_snapshot = std::move (isolate_snapshot), //
311
- on_create_platform_view, //
312
- on_create_rasterizer //
325
+ fml::MakeCopyable (
326
+ [shell_init_callback = std::move (shell_init_callback), //
327
+ vm = std::move (vm), //
328
+ task_runners = std::move (task_runners), //
329
+ window_data, //
330
+ settings, //
331
+ isolate_snapshot = std::move (isolate_snapshot), //
332
+ on_create_platform_view, //
333
+ on_create_rasterizer //
313
334
]() mutable {
314
- shell = CreateShellOnPlatformThread (std::move (vm),
315
- std::move (task_runners), //
316
- window_data, //
317
- settings, //
318
- std::move (isolate_snapshot), //
319
- on_create_platform_view, //
320
- on_create_rasterizer //
321
- );
322
- latch.Signal ();
323
- }));
324
- latch.Wait ();
325
- return shell;
335
+ CreateShellOnPlatformThread (std::move (shell_init_callback), //
336
+ std::move (vm),
337
+ std::move (task_runners), //
338
+ window_data, //
339
+ settings, //
340
+ std::move (isolate_snapshot), //
341
+ on_create_platform_view, //
342
+ on_create_rasterizer //
343
+ );
344
+ }));
326
345
}
327
346
328
347
Shell::Shell (DartVMRef vm, TaskRunners task_runners, Settings settings)
0 commit comments