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

Commit 8425b08

Browse files
committed
Started initializing the gpu disable syncswitch based on the app state.
1 parent 04afdad commit 8425b08

File tree

6 files changed

+89
-42
lines changed

6 files changed

+89
-42
lines changed

shell/common/shell.cc

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

171172
std::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(
360365
Shell::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

shell/common/shell.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ class Shell final : public PlatformView::Delegate,
134134
/// valid rasterizer. This will be called
135135
/// on the render task runner before this
136136
/// method returns.
137+
/// @param[in] is_gpu_disabled The default value for the switch that
138+
/// turns off the GPU.
137139
///
138140
/// @return A full initialized shell if the settings and callbacks are
139141
/// valid. The root isolate has been created but not yet launched.
@@ -148,7 +150,8 @@ class Shell final : public PlatformView::Delegate,
148150
TaskRunners task_runners,
149151
Settings settings,
150152
const CreateCallback<PlatformView>& on_create_platform_view,
151-
const CreateCallback<Rasterizer>& on_create_rasterizer);
153+
const CreateCallback<Rasterizer>& on_create_rasterizer,
154+
bool is_gpu_disabled = false);
152155

153156
//----------------------------------------------------------------------------
154157
/// @brief Destroys the shell. This is a synchronous operation and
@@ -413,7 +416,8 @@ class Shell final : public PlatformView::Delegate,
413416
Shell(DartVMRef vm,
414417
TaskRunners task_runners,
415418
Settings settings,
416-
std::shared_ptr<VolatilePathTracker> volatile_path_tracker);
419+
std::shared_ptr<VolatilePathTracker> volatile_path_tracker,
420+
bool is_gpu_disabled);
417421

418422
static std::unique_ptr<Shell> CreateShellOnPlatformThread(
419423
DartVMRef vm,
@@ -423,7 +427,8 @@ class Shell final : public PlatformView::Delegate,
423427
fml::RefPtr<const DartSnapshot> isolate_snapshot,
424428
const Shell::CreateCallback<PlatformView>& on_create_platform_view,
425429
const Shell::CreateCallback<Rasterizer>& on_create_rasterizer,
426-
const EngineCreateCallback& on_create_engine);
430+
const EngineCreateCallback& on_create_engine,
431+
bool is_gpu_disabled);
427432
static std::unique_ptr<Shell> CreateWithSnapshot(
428433
const PlatformData& platform_data,
429434
TaskRunners task_runners,
@@ -432,7 +437,8 @@ class Shell final : public PlatformView::Delegate,
432437
fml::RefPtr<const DartSnapshot> isolate_snapshot,
433438
const CreateCallback<PlatformView>& on_create_platform_view,
434439
const CreateCallback<Rasterizer>& on_create_rasterizer,
435-
const EngineCreateCallback& on_create_engine);
440+
const EngineCreateCallback& on_create_engine,
441+
bool is_gpu_disabled);
436442

437443
bool Setup(std::unique_ptr<PlatformView> platform_view,
438444
std::unique_ptr<Engine> engine,

shell/common/shell_test.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,8 @@ std::unique_ptr<Shell> ShellTest::CreateShell(
314314
TaskRunners task_runners,
315315
bool simulate_vsync,
316316
std::shared_ptr<ShellTestExternalViewEmbedder>
317-
shell_test_external_view_embedder) {
317+
shell_test_external_view_embedder,
318+
bool is_gpu_disabled) {
318319
const auto vsync_clock = std::make_shared<ShellTestVsyncClock>();
319320
CreateVsyncWaiter create_vsync_waiter = [&]() {
320321
if (simulate_vsync) {
@@ -335,7 +336,8 @@ std::unique_ptr<Shell> ShellTest::CreateShell(
335336
ShellTestPlatformView::BackendType::kDefaultBackend,
336337
shell_test_external_view_embedder);
337338
},
338-
[](Shell& shell) { return std::make_unique<Rasterizer>(shell); });
339+
[](Shell& shell) { return std::make_unique<Rasterizer>(shell); },
340+
is_gpu_disabled);
339341
}
340342
void ShellTest::DestroyShell(std::unique_ptr<Shell> shell) {
341343
DestroyShell(std::move(shell), GetTaskRunnersForFixture());

shell/common/shell_test.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ class ShellTest : public FixtureTest {
3939
TaskRunners task_runners,
4040
bool simulate_vsync = false,
4141
std::shared_ptr<ShellTestExternalViewEmbedder>
42-
shell_test_external_view_embedder = nullptr);
42+
shell_test_external_view_embedder = nullptr,
43+
bool is_gpu_disabled = false);
4344
void DestroyShell(std::unique_ptr<Shell> shell);
4445
void DestroyShell(std::unique_ptr<Shell> shell, TaskRunners task_runners);
4546
TaskRunners GetTaskRunnersForFixture();

shell/common/shell_unittests.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,29 @@ TEST_F(ShellTest,
321321
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
322322
}
323323

324+
TEST_F(ShellTest, InitializeWithDisabledGpu) {
325+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
326+
Settings settings = CreateSettingsForFixture();
327+
ThreadHost thread_host("io.flutter.test." + GetCurrentTestName() + ".",
328+
ThreadHost::Type::Platform);
329+
auto task_runner = thread_host.platform_thread->GetTaskRunner();
330+
TaskRunners task_runners("test", task_runner, task_runner, task_runner,
331+
task_runner);
332+
auto shell = CreateShell(
333+
std::move(settings), std::move(task_runners), /*simulate_vsync=*/false,
334+
/*shell_test_external_view_embedder=*/nullptr, /*is_gpu_disabled=*/true);
335+
ASSERT_TRUE(DartVMRef::IsInstanceRunning());
336+
ASSERT_TRUE(ValidateShell(shell.get()));
337+
338+
bool is_disabled = false;
339+
shell->GetIsGpuDisabledSyncSwitch()->Execute(
340+
fml::SyncSwitch::Handlers().SetIfTrue([&] { is_disabled = true; }));
341+
ASSERT_TRUE(is_disabled);
342+
343+
DestroyShell(std::move(shell), std::move(task_runners));
344+
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
345+
}
346+
324347
TEST_F(ShellTest, InitializeWithGPUAndPlatformThreadsTheSame) {
325348
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
326349
Settings settings = CreateSettingsForFixture();

shell/platform/darwin/ios/framework/Source/FlutterEngine.mm

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -612,13 +612,13 @@ - (BOOL)createShell:(NSString*)entrypoint
612612
);
613613

614614
// Create the shell. This is a blocking operation.
615-
std::unique_ptr<flutter::Shell> shell =
616-
flutter::Shell::Create(std::move(platformData), // window data
617-
std::move(task_runners), // task runners
618-
std::move(settings), // settings
619-
on_create_platform_view, // platform view creation
620-
on_create_rasterizer // rasterzier creation
621-
);
615+
std::unique_ptr<flutter::Shell> shell = flutter::Shell::Create(
616+
std::move(platformData), // window data
617+
std::move(task_runners), // task runners
618+
std::move(settings), // settings
619+
on_create_platform_view, // platform view creation
620+
on_create_rasterizer, // rasterzier creation
621+
[UIApplication sharedApplication].applicationState != UIApplicationStateActive);
622622

623623
if (shell == nullptr) {
624624
FML_LOG(ERROR) << "Could not start a shell FlutterEngine with entrypoint: "

0 commit comments

Comments
 (0)