@@ -139,7 +139,8 @@ std::unique_ptr<Shell> Shell::Create(
139139 TaskRunners task_runners,
140140 Settings settings,
141141 const Shell::CreateCallback<PlatformView>& on_create_platform_view,
142- const Shell::CreateCallback<Rasterizer>& on_create_rasterizer) {
142+ const Shell::CreateCallback<Rasterizer>& on_create_rasterizer,
143+ bool is_gpu_disabled) {
143144 // This must come first as it initializes tracing.
144145 PerformInitializationTasks (settings);
145146
@@ -165,7 +166,7 @@ std::unique_ptr<Shell> Shell::Create(
165166 std::move (isolate_snapshot), //
166167 std::move (on_create_platform_view), //
167168 std::move (on_create_rasterizer), //
168- CreateEngine);
169+ CreateEngine, is_gpu_disabled );
169170}
170171
171172std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread (
@@ -176,7 +177,8 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
176177 fml::RefPtr<const DartSnapshot> isolate_snapshot,
177178 const Shell::CreateCallback<PlatformView>& on_create_platform_view,
178179 const Shell::CreateCallback<Rasterizer>& on_create_rasterizer,
179- const Shell::EngineCreateCallback& on_create_engine) {
180+ const Shell::EngineCreateCallback& on_create_engine,
181+ bool is_gpu_disabled) {
180182 if (!task_runners.IsValid ()) {
181183 FML_LOG (ERROR) << " Task runners to run the shell were invalid." ;
182184 return nullptr ;
@@ -186,7 +188,8 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
186188 new Shell (std::move (vm), task_runners, settings,
187189 std::make_shared<VolatilePathTracker>(
188190 task_runners.GetUITaskRunner (),
189- !settings.skia_deterministic_rendering_on_cpu )));
191+ !settings.skia_deterministic_rendering_on_cpu ),
192+ is_gpu_disabled));
190193
191194 // Create the rasterizer on the raster thread.
192195 std::promise<std::unique_ptr<Rasterizer>> rasterizer_promise;
@@ -315,7 +318,8 @@ std::unique_ptr<Shell> Shell::CreateWithSnapshot(
315318 fml::RefPtr<const DartSnapshot> isolate_snapshot,
316319 const Shell::CreateCallback<PlatformView>& on_create_platform_view,
317320 const Shell::CreateCallback<Rasterizer>& on_create_rasterizer,
318- const Shell::EngineCreateCallback& on_create_engine) {
321+ const Shell::EngineCreateCallback& on_create_engine,
322+ bool is_gpu_disabled) {
319323 // This must come first as it initializes tracing.
320324 PerformInitializationTasks (settings);
321325
@@ -341,7 +345,8 @@ std::unique_ptr<Shell> Shell::CreateWithSnapshot(
341345 isolate_snapshot = std::move (isolate_snapshot), //
342346 on_create_platform_view = std::move (on_create_platform_view), //
343347 on_create_rasterizer = std::move (on_create_rasterizer), //
344- on_create_engine = std::move (on_create_engine)]() mutable {
348+ on_create_engine = std::move (on_create_engine),
349+ is_gpu_disabled]() mutable {
345350 shell = CreateShellOnPlatformThread (
346351 std::move (vm), //
347352 std::move (task_runners), //
@@ -350,7 +355,7 @@ std::unique_ptr<Shell> Shell::CreateWithSnapshot(
350355 std::move (isolate_snapshot), //
351356 std::move (on_create_platform_view), //
352357 std::move (on_create_rasterizer), //
353- std::move (on_create_engine));
358+ std::move (on_create_engine), is_gpu_disabled );
354359 latch.Signal ();
355360 }));
356361 latch.Wait ();
@@ -360,11 +365,12 @@ std::unique_ptr<Shell> Shell::CreateWithSnapshot(
360365Shell::Shell (DartVMRef vm,
361366 TaskRunners task_runners,
362367 Settings settings,
363- std::shared_ptr<VolatilePathTracker> volatile_path_tracker)
368+ std::shared_ptr<VolatilePathTracker> volatile_path_tracker,
369+ bool is_gpu_disabled)
364370 : task_runners_(std::move(task_runners)),
365371 settings_ (std::move(settings)),
366372 vm_(std::move(vm)),
367- is_gpu_disabled_sync_switch_(new fml::SyncSwitch()),
373+ is_gpu_disabled_sync_switch_(new fml::SyncSwitch(is_gpu_disabled )),
368374 volatile_path_tracker_(std::move(volatile_path_tracker)),
369375 weak_factory_gpu_(nullptr ),
370376 weak_factory_(this ) {
@@ -481,25 +487,34 @@ std::unique_ptr<Shell> Shell::Spawn(
481487 const CreateCallback<PlatformView>& on_create_platform_view,
482488 const CreateCallback<Rasterizer>& on_create_rasterizer) const {
483489 FML_DCHECK (task_runners_.IsValid ());
484- std::unique_ptr<Shell> result (CreateWithSnapshot (
485- PlatformData{}, task_runners_, GetSettings (), vm_,
486- vm_->GetVMData ()->GetIsolateSnapshot (), on_create_platform_view,
487- on_create_rasterizer,
488- [engine = this ->engine_ .get ()](
489- Engine::Delegate& delegate,
490- const PointerDataDispatcherMaker& dispatcher_maker, DartVM& vm,
491- fml::RefPtr<const DartSnapshot> isolate_snapshot,
492- TaskRunners task_runners, const PlatformData& platform_data,
493- Settings settings, std::unique_ptr<Animator> animator,
494- fml::WeakPtr<IOManager> io_manager,
495- fml::RefPtr<SkiaUnrefQueue> unref_queue,
496- fml::WeakPtr<SnapshotDelegate> snapshot_delegate,
497- std::shared_ptr<VolatilePathTracker> volatile_path_tracker) {
498- return engine->Spawn (/* delegate=*/ delegate,
499- /* dispatcher_maker=*/ dispatcher_maker,
500- /* settings=*/ settings,
501- /* animator=*/ std::move (animator));
502- }));
490+ auto shell_maker = [&](bool is_gpu_disabled) {
491+ std::unique_ptr<Shell> result (CreateWithSnapshot (
492+ PlatformData{}, task_runners_, GetSettings (), vm_,
493+ vm_->GetVMData ()->GetIsolateSnapshot (), on_create_platform_view,
494+ on_create_rasterizer,
495+ [engine = this ->engine_ .get ()](
496+ Engine::Delegate& delegate,
497+ const PointerDataDispatcherMaker& dispatcher_maker, DartVM& vm,
498+ fml::RefPtr<const DartSnapshot> isolate_snapshot,
499+ TaskRunners task_runners, const PlatformData& platform_data,
500+ Settings settings, std::unique_ptr<Animator> animator,
501+ fml::WeakPtr<IOManager> io_manager,
502+ fml::RefPtr<SkiaUnrefQueue> unref_queue,
503+ fml::WeakPtr<SnapshotDelegate> snapshot_delegate,
504+ std::shared_ptr<VolatilePathTracker> volatile_path_tracker) {
505+ return engine->Spawn (/* delegate=*/ delegate,
506+ /* dispatcher_maker=*/ dispatcher_maker,
507+ /* settings=*/ settings,
508+ /* animator=*/ std::move (animator));
509+ },
510+ is_gpu_disabled));
511+ return result;
512+ };
513+ std::unique_ptr<Shell> result;
514+ GetIsGpuDisabledSyncSwitch ()->Execute (
515+ fml::SyncSwitch::Handlers ()
516+ .SetIfFalse ([&] { result = shell_maker (false ); })
517+ .SetIfTrue ([&] { result = shell_maker (true ); }));
503518 result->shared_resource_context_ = io_manager_->GetSharedResourceContext ();
504519 result->RunEngine (std::move (run_configuration));
505520
0 commit comments