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

Commit 0932d55

Browse files
lucky-chenpeihan.cph
authored and
peihan.cph
committed
future: engine supprot create shell with aysnc mode
1 parent deef266 commit 0932d55

File tree

4 files changed

+324
-127
lines changed

4 files changed

+324
-127
lines changed

shell/common/shell.cc

Lines changed: 136 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ constexpr char kSystemChannel[] = "flutter/system";
4040
constexpr char kTypeKey[] = "type";
4141
constexpr char kFontChange[] = "fontsChange";
4242

43-
std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
43+
void Shell::CreateShellOnPlatformThread(
44+
ShellCreateCallback async_init_callback,
4445
DartVMRef vm,
4546
TaskRunners task_runners,
4647
const WindowData window_data,
@@ -50,52 +51,55 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
5051
const Shell::CreateCallback<Rasterizer>& on_create_rasterizer) {
5152
if (!task_runners.IsValid()) {
5253
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;
5458
}
5559

5660
auto shell =
5761
std::unique_ptr<Shell>(new Shell(std::move(vm), task_runners, settings));
5862

5963
// 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+
6467
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 {
7073
TRACE_EVENT0("flutter", "ShellSetupGPUSubsystem");
7174
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));
7476
});
7577

7678
// Create the platform view on the platform thread (this thread).
7779
auto platform_view = on_create_platform_view(*shell.get());
7880
if (!platform_view || !platform_view->GetWeakPtr()) {
79-
return nullptr;
81+
if (async_init_callback) {
82+
async_init_callback(nullptr);
83+
}
84+
return;
8085
}
8186

8287
// Ask the platform view for the vsync waiter. This will be used by the engine
8388
// to create the animator.
8489
auto vsync_waiter = platform_view->CreateVSyncWaiter();
8590
if (!vsync_waiter) {
86-
return nullptr;
91+
if (async_init_callback) {
92+
async_init_callback(nullptr);
93+
}
94+
return;
8795
}
8896

8997
// Create the IO manager on the IO thread. The IO manager must be initialized
9098
// first because it has state that the other subsystems depend on. It must
9199
// first be booted and the necessary references obtained to initialize the
92100
// 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>>>();
99103
auto io_task_runner = shell->GetTaskRunners().GetIOTaskRunner();
100104

101105
// TODO(gw280): The WeakPtr here asserts that we are derefing it on the
@@ -106,73 +110,75 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
106110
// https://github.com/flutter/flutter/issues/42948
107111
fml::TaskRunner::RunNowOrPostTask(
108112
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(), //
114116
is_backgrounded_sync_switch = shell->GetIsGpuDisabledSyncSwitch() //
115-
]() {
117+
]() mutable {
116118
TRACE_EVENT0("flutter", "ShellSetupIOSubsystem");
117119
auto io_manager = std::make_unique<ShellIOManager>(
118-
platform_view.getUnsafe()->CreateResourceContext(),
120+
weak_platform_view.getUnsafe()->CreateResourceContext(),
119121
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));
123123
});
124124

125125
// Send dispatcher_maker to the engine constructor because shell won't have
126126
// platform_view set until Shell::Setup is called later.
127127
auto dispatcher_maker = platform_view->GetDispatcherMaker();
128128

129129
// Create the engine on the UI thread.
130-
std::promise<std::unique_ptr<Engine>> engine_promise;
131-
auto engine_future = engine_promise.get_future();
132130
fml::TaskRunner::RunNowOrPostTask(
133131
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 //
143144
]() 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+
}));
176182
}
177183

178184
static void RecordStartupTimestamp() {
@@ -253,33 +259,48 @@ std::unique_ptr<Shell> Shell::Create(
253259
);
254260
}
255261

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);
265266
TRACE_EVENT0("flutter", "Shell::Create");
266267

267-
auto vm = DartVMRef::Create(settings);
268+
auto vm = DartVMRef::Create(params->settings);
268269
FML_CHECK(vm) << "Must be able to initialize the VM.";
269270

270271
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) //
279280
);
280281
}
281282

282283
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,
283304
TaskRunners task_runners,
284305
const WindowData window_data,
285306
Settings settings,
@@ -294,35 +315,33 @@ std::unique_ptr<Shell> Shell::Create(
294315

295316
if (!task_runners.IsValid() || !on_create_platform_view ||
296317
!on_create_rasterizer) {
297-
return nullptr;
318+
if (shell_init_callback) {
319+
shell_init_callback(nullptr);
320+
}
321+
return;
298322
}
299-
300-
fml::AutoResetWaitableEvent latch;
301-
std::unique_ptr<Shell> shell;
302323
fml::TaskRunner::RunNowOrPostTask(
303324
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 //
313334
]() 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+
}));
326345
}
327346

328347
Shell::Shell(DartVMRef vm, TaskRunners task_runners, Settings settings)

0 commit comments

Comments
 (0)