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

Commit fc4445d

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

File tree

4 files changed

+361
-100
lines changed

4 files changed

+361
-100
lines changed

shell/common/shell.cc

Lines changed: 146 additions & 99 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,6 +259,27 @@ std::unique_ptr<Shell> Shell::Create(
253259
);
254260
}
255261

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);
266+
TRACE_EVENT0("flutter", "Shell::Create");
267+
268+
auto vm = DartVMRef::Create(params->settings);
269+
FML_CHECK(vm) << "Must be able to initialize the VM.";
270+
271+
auto vm_data = vm->GetVMData();
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) //
280+
);
281+
}
282+
256283
std::unique_ptr<Shell> Shell::Create(
257284
TaskRunners task_runners,
258285
const WindowData window_data,
@@ -287,42 +314,62 @@ std::unique_ptr<Shell> Shell::Create(
287314
const Shell::CreateCallback<PlatformView>& on_create_platform_view,
288315
const Shell::CreateCallback<Rasterizer>& on_create_rasterizer,
289316
DartVMRef vm) {
317+
std::promise<std::unique_ptr<Shell>> shell_promise;
318+
auto shell_future = shell_promise.get_future();
319+
Shell::Create(
320+
[&shell_promise](std::unique_ptr<Shell> shell) mutable {
321+
// ui thread
322+
shell_promise.set_value(std::move(shell));
323+
},
324+
std::move(task_runners), window_data, settings,
325+
std::move(isolate_snapshot), std::move(on_create_platform_view),
326+
std::move(on_create_rasterizer), std::move(vm));
327+
return shell_future.get();
328+
}
329+
330+
void Shell::Create(
331+
ShellCreateCallback shell_init_callback,
332+
TaskRunners task_runners,
333+
const WindowData window_data,
334+
Settings settings,
335+
fml::RefPtr<const DartSnapshot> isolate_snapshot,
336+
const Shell::CreateCallback<PlatformView>& on_create_platform_view,
337+
const Shell::CreateCallback<Rasterizer>& on_create_rasterizer,
338+
DartVMRef vm) {
290339
PerformInitializationTasks(settings);
291340
PersistentCache::SetCacheSkSL(settings.cache_sksl);
292341

293342
TRACE_EVENT0("flutter", "Shell::CreateWithSnapshots");
294343

295344
if (!task_runners.IsValid() || !on_create_platform_view ||
296345
!on_create_rasterizer) {
297-
return nullptr;
346+
if (shell_init_callback) {
347+
shell_init_callback(nullptr);
348+
}
349+
return;
298350
}
299-
300-
fml::AutoResetWaitableEvent latch;
301-
std::unique_ptr<Shell> shell;
302351
fml::TaskRunner::RunNowOrPostTask(
303352
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 //
353+
fml::MakeCopyable(
354+
[shell_init_callback = std::move(shell_init_callback), //
355+
vm = std::move(vm), //
356+
task_runners = std::move(task_runners), //
357+
window_data, //
358+
settings, //
359+
isolate_snapshot = std::move(isolate_snapshot), //
360+
on_create_platform_view, //
361+
on_create_rasterizer //
313362
]() 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;
363+
CreateShellOnPlatformThread(std::move(shell_init_callback), //
364+
std::move(vm),
365+
std::move(task_runners), //
366+
window_data, //
367+
settings, //
368+
std::move(isolate_snapshot), //
369+
on_create_platform_view, //
370+
on_create_rasterizer //
371+
);
372+
}));
326373
}
327374

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

0 commit comments

Comments
 (0)