From 7a672981c18bf1d83afa444d69fa02efc6a43a19 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Wed, 17 Feb 2021 11:27:48 -0800 Subject: [PATCH] Started initializing the gpu disable syncswitch based on the app state. --- shell/common/shell.cc | 71 +++++++++++-------- shell/common/shell.h | 14 ++-- shell/common/shell_test.cc | 6 +- shell/common/shell_test.h | 3 +- shell/common/shell_unittests.cc | 23 ++++++ .../ios/framework/Source/FlutterEngine.mm | 15 ++-- 6 files changed, 90 insertions(+), 42 deletions(-) diff --git a/shell/common/shell.cc b/shell/common/shell.cc index e64573a45bb61..07c4172c60249 100644 --- a/shell/common/shell.cc +++ b/shell/common/shell.cc @@ -139,7 +139,8 @@ std::unique_ptr Shell::Create( TaskRunners task_runners, Settings settings, const Shell::CreateCallback& on_create_platform_view, - const Shell::CreateCallback& on_create_rasterizer) { + const Shell::CreateCallback& on_create_rasterizer, + bool is_gpu_disabled) { // This must come first as it initializes tracing. PerformInitializationTasks(settings); @@ -165,7 +166,7 @@ std::unique_ptr Shell::Create( std::move(isolate_snapshot), // std::move(on_create_platform_view), // std::move(on_create_rasterizer), // - CreateEngine); + CreateEngine, is_gpu_disabled); } std::unique_ptr Shell::CreateShellOnPlatformThread( @@ -176,7 +177,8 @@ std::unique_ptr Shell::CreateShellOnPlatformThread( fml::RefPtr isolate_snapshot, const Shell::CreateCallback& on_create_platform_view, const Shell::CreateCallback& on_create_rasterizer, - const Shell::EngineCreateCallback& on_create_engine) { + const Shell::EngineCreateCallback& on_create_engine, + bool is_gpu_disabled) { if (!task_runners.IsValid()) { FML_LOG(ERROR) << "Task runners to run the shell were invalid."; return nullptr; @@ -186,7 +188,8 @@ std::unique_ptr Shell::CreateShellOnPlatformThread( new Shell(std::move(vm), task_runners, settings, std::make_shared( task_runners.GetUITaskRunner(), - !settings.skia_deterministic_rendering_on_cpu))); + !settings.skia_deterministic_rendering_on_cpu), + is_gpu_disabled)); // Create the rasterizer on the raster thread. std::promise> rasterizer_promise; @@ -315,7 +318,8 @@ std::unique_ptr Shell::CreateWithSnapshot( fml::RefPtr isolate_snapshot, const Shell::CreateCallback& on_create_platform_view, const Shell::CreateCallback& on_create_rasterizer, - const Shell::EngineCreateCallback& on_create_engine) { + const Shell::EngineCreateCallback& on_create_engine, + bool is_gpu_disabled) { // This must come first as it initializes tracing. PerformInitializationTasks(settings); @@ -341,7 +345,8 @@ std::unique_ptr Shell::CreateWithSnapshot( isolate_snapshot = std::move(isolate_snapshot), // on_create_platform_view = std::move(on_create_platform_view), // on_create_rasterizer = std::move(on_create_rasterizer), // - on_create_engine = std::move(on_create_engine)]() mutable { + on_create_engine = std::move(on_create_engine), + is_gpu_disabled]() mutable { shell = CreateShellOnPlatformThread( std::move(vm), // std::move(task_runners), // @@ -350,7 +355,7 @@ std::unique_ptr Shell::CreateWithSnapshot( std::move(isolate_snapshot), // std::move(on_create_platform_view), // std::move(on_create_rasterizer), // - std::move(on_create_engine)); + std::move(on_create_engine), is_gpu_disabled); latch.Signal(); })); latch.Wait(); @@ -360,11 +365,12 @@ std::unique_ptr Shell::CreateWithSnapshot( Shell::Shell(DartVMRef vm, TaskRunners task_runners, Settings settings, - std::shared_ptr volatile_path_tracker) + std::shared_ptr volatile_path_tracker, + bool is_gpu_disabled) : task_runners_(std::move(task_runners)), settings_(std::move(settings)), vm_(std::move(vm)), - is_gpu_disabled_sync_switch_(new fml::SyncSwitch()), + is_gpu_disabled_sync_switch_(new fml::SyncSwitch(is_gpu_disabled)), volatile_path_tracker_(std::move(volatile_path_tracker)), weak_factory_gpu_(nullptr), weak_factory_(this) { @@ -481,25 +487,34 @@ std::unique_ptr Shell::Spawn( const CreateCallback& on_create_platform_view, const CreateCallback& on_create_rasterizer) const { FML_DCHECK(task_runners_.IsValid()); - std::unique_ptr result(CreateWithSnapshot( - PlatformData{}, task_runners_, GetSettings(), vm_, - vm_->GetVMData()->GetIsolateSnapshot(), on_create_platform_view, - on_create_rasterizer, - [engine = this->engine_.get()]( - Engine::Delegate& delegate, - const PointerDataDispatcherMaker& dispatcher_maker, DartVM& vm, - fml::RefPtr isolate_snapshot, - TaskRunners task_runners, const PlatformData& platform_data, - Settings settings, std::unique_ptr animator, - fml::WeakPtr io_manager, - fml::RefPtr unref_queue, - fml::WeakPtr snapshot_delegate, - std::shared_ptr volatile_path_tracker) { - return engine->Spawn(/*delegate=*/delegate, - /*dispatcher_maker=*/dispatcher_maker, - /*settings=*/settings, - /*animator=*/std::move(animator)); - })); + auto shell_maker = [&](bool is_gpu_disabled) { + std::unique_ptr result(CreateWithSnapshot( + PlatformData{}, task_runners_, GetSettings(), vm_, + vm_->GetVMData()->GetIsolateSnapshot(), on_create_platform_view, + on_create_rasterizer, + [engine = this->engine_.get()]( + Engine::Delegate& delegate, + const PointerDataDispatcherMaker& dispatcher_maker, DartVM& vm, + fml::RefPtr isolate_snapshot, + TaskRunners task_runners, const PlatformData& platform_data, + Settings settings, std::unique_ptr animator, + fml::WeakPtr io_manager, + fml::RefPtr unref_queue, + fml::WeakPtr snapshot_delegate, + std::shared_ptr volatile_path_tracker) { + return engine->Spawn(/*delegate=*/delegate, + /*dispatcher_maker=*/dispatcher_maker, + /*settings=*/settings, + /*animator=*/std::move(animator)); + }, + is_gpu_disabled)); + return result; + }; + std::unique_ptr result; + GetIsGpuDisabledSyncSwitch()->Execute( + fml::SyncSwitch::Handlers() + .SetIfFalse([&] { result = shell_maker(false); }) + .SetIfTrue([&] { result = shell_maker(true); })); result->shared_resource_context_ = io_manager_->GetSharedResourceContext(); result->RunEngine(std::move(run_configuration)); diff --git a/shell/common/shell.h b/shell/common/shell.h index a26c6cf53f653..4febfa4e8e659 100644 --- a/shell/common/shell.h +++ b/shell/common/shell.h @@ -134,6 +134,8 @@ class Shell final : public PlatformView::Delegate, /// valid rasterizer. This will be called /// on the render task runner before this /// method returns. + /// @param[in] is_gpu_disabled The default value for the switch that + /// turns off the GPU. /// /// @return A full initialized shell if the settings and callbacks are /// valid. The root isolate has been created but not yet launched. @@ -148,7 +150,8 @@ class Shell final : public PlatformView::Delegate, TaskRunners task_runners, Settings settings, const CreateCallback& on_create_platform_view, - const CreateCallback& on_create_rasterizer); + const CreateCallback& on_create_rasterizer, + bool is_gpu_disabled = false); //---------------------------------------------------------------------------- /// @brief Destroys the shell. This is a synchronous operation and @@ -413,7 +416,8 @@ class Shell final : public PlatformView::Delegate, Shell(DartVMRef vm, TaskRunners task_runners, Settings settings, - std::shared_ptr volatile_path_tracker); + std::shared_ptr volatile_path_tracker, + bool is_gpu_disabled); static std::unique_ptr CreateShellOnPlatformThread( DartVMRef vm, @@ -423,7 +427,8 @@ class Shell final : public PlatformView::Delegate, fml::RefPtr isolate_snapshot, const Shell::CreateCallback& on_create_platform_view, const Shell::CreateCallback& on_create_rasterizer, - const EngineCreateCallback& on_create_engine); + const EngineCreateCallback& on_create_engine, + bool is_gpu_disabled); static std::unique_ptr CreateWithSnapshot( const PlatformData& platform_data, TaskRunners task_runners, @@ -432,7 +437,8 @@ class Shell final : public PlatformView::Delegate, fml::RefPtr isolate_snapshot, const CreateCallback& on_create_platform_view, const CreateCallback& on_create_rasterizer, - const EngineCreateCallback& on_create_engine); + const EngineCreateCallback& on_create_engine, + bool is_gpu_disabled); bool Setup(std::unique_ptr platform_view, std::unique_ptr engine, diff --git a/shell/common/shell_test.cc b/shell/common/shell_test.cc index 0c753f523032f..380da75ec7b74 100644 --- a/shell/common/shell_test.cc +++ b/shell/common/shell_test.cc @@ -314,7 +314,8 @@ std::unique_ptr ShellTest::CreateShell( TaskRunners task_runners, bool simulate_vsync, std::shared_ptr - shell_test_external_view_embedder) { + shell_test_external_view_embedder, + bool is_gpu_disabled) { const auto vsync_clock = std::make_shared(); CreateVsyncWaiter create_vsync_waiter = [&]() { if (simulate_vsync) { @@ -335,7 +336,8 @@ std::unique_ptr ShellTest::CreateShell( ShellTestPlatformView::BackendType::kDefaultBackend, shell_test_external_view_embedder); }, - [](Shell& shell) { return std::make_unique(shell); }); + [](Shell& shell) { return std::make_unique(shell); }, + is_gpu_disabled); } void ShellTest::DestroyShell(std::unique_ptr shell) { DestroyShell(std::move(shell), GetTaskRunnersForFixture()); diff --git a/shell/common/shell_test.h b/shell/common/shell_test.h index 5d27335b23437..71ce1037f3c68 100644 --- a/shell/common/shell_test.h +++ b/shell/common/shell_test.h @@ -39,7 +39,8 @@ class ShellTest : public FixtureTest { TaskRunners task_runners, bool simulate_vsync = false, std::shared_ptr - shell_test_external_view_embedder = nullptr); + shell_test_external_view_embedder = nullptr, + bool is_gpu_disabled = false); void DestroyShell(std::unique_ptr shell); void DestroyShell(std::unique_ptr shell, TaskRunners task_runners); TaskRunners GetTaskRunnersForFixture(); diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc index 57dfc523c8a55..b9bec86095648 100644 --- a/shell/common/shell_unittests.cc +++ b/shell/common/shell_unittests.cc @@ -321,6 +321,29 @@ TEST_F(ShellTest, ASSERT_FALSE(DartVMRef::IsInstanceRunning()); } +TEST_F(ShellTest, InitializeWithDisabledGpu) { + ASSERT_FALSE(DartVMRef::IsInstanceRunning()); + Settings settings = CreateSettingsForFixture(); + ThreadHost thread_host("io.flutter.test." + GetCurrentTestName() + ".", + ThreadHost::Type::Platform); + auto task_runner = thread_host.platform_thread->GetTaskRunner(); + TaskRunners task_runners("test", task_runner, task_runner, task_runner, + task_runner); + auto shell = CreateShell( + std::move(settings), std::move(task_runners), /*simulate_vsync=*/false, + /*shell_test_external_view_embedder=*/nullptr, /*is_gpu_disabled=*/true); + ASSERT_TRUE(DartVMRef::IsInstanceRunning()); + ASSERT_TRUE(ValidateShell(shell.get())); + + bool is_disabled = false; + shell->GetIsGpuDisabledSyncSwitch()->Execute( + fml::SyncSwitch::Handlers().SetIfTrue([&] { is_disabled = true; })); + ASSERT_TRUE(is_disabled); + + DestroyShell(std::move(shell), std::move(task_runners)); + ASSERT_FALSE(DartVMRef::IsInstanceRunning()); +} + TEST_F(ShellTest, InitializeWithGPUAndPlatformThreadsTheSame) { ASSERT_FALSE(DartVMRef::IsInstanceRunning()); Settings settings = CreateSettingsForFixture(); diff --git a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm index 63b077388c6dd..4585c392b3eac 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm @@ -612,13 +612,14 @@ - (BOOL)createShell:(NSString*)entrypoint ); // Create the shell. This is a blocking operation. - std::unique_ptr shell = - flutter::Shell::Create(std::move(platformData), // window data - std::move(task_runners), // task runners - std::move(settings), // settings - on_create_platform_view, // platform view creation - on_create_rasterizer // rasterzier creation - ); + std::unique_ptr shell = flutter::Shell::Create( + std::move(platformData), // window data + std::move(task_runners), // task runners + std::move(settings), // settings + on_create_platform_view, // platform view creation + on_create_rasterizer, // rasterzier creation + /*is_gpu_disabled=*/[UIApplication sharedApplication].applicationState != + UIApplicationStateActive); if (shell == nullptr) { FML_LOG(ERROR) << "Could not start a shell FlutterEngine with entrypoint: "