Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 43 additions & 28 deletions shell/common/shell.cc
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ std::unique_ptr<Shell> Shell::Create(
TaskRunners task_runners,
Settings settings,
const Shell::CreateCallback<PlatformView>& on_create_platform_view,
const Shell::CreateCallback<Rasterizer>& on_create_rasterizer) {
const Shell::CreateCallback<Rasterizer>& on_create_rasterizer,
bool is_gpu_disabled) {
// This must come first as it initializes tracing.
PerformInitializationTasks(settings);

Expand All @@ -165,7 +166,7 @@ std::unique_ptr<Shell> 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> Shell::CreateShellOnPlatformThread(
Expand All @@ -176,7 +177,8 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
fml::RefPtr<const DartSnapshot> isolate_snapshot,
const Shell::CreateCallback<PlatformView>& on_create_platform_view,
const Shell::CreateCallback<Rasterizer>& 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;
Expand All @@ -186,7 +188,8 @@ std::unique_ptr<Shell> Shell::CreateShellOnPlatformThread(
new Shell(std::move(vm), task_runners, settings,
std::make_shared<VolatilePathTracker>(
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<std::unique_ptr<Rasterizer>> rasterizer_promise;
Expand Down Expand Up @@ -315,7 +318,8 @@ std::unique_ptr<Shell> Shell::CreateWithSnapshot(
fml::RefPtr<const DartSnapshot> isolate_snapshot,
const Shell::CreateCallback<PlatformView>& on_create_platform_view,
const Shell::CreateCallback<Rasterizer>& 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);

Expand All @@ -341,7 +345,8 @@ std::unique_ptr<Shell> 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), //
Expand All @@ -350,7 +355,7 @@ std::unique_ptr<Shell> 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();
Expand All @@ -360,11 +365,12 @@ std::unique_ptr<Shell> Shell::CreateWithSnapshot(
Shell::Shell(DartVMRef vm,
TaskRunners task_runners,
Settings settings,
std::shared_ptr<VolatilePathTracker> volatile_path_tracker)
std::shared_ptr<VolatilePathTracker> 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) {
Expand Down Expand Up @@ -481,25 +487,34 @@ std::unique_ptr<Shell> Shell::Spawn(
const CreateCallback<PlatformView>& on_create_platform_view,
const CreateCallback<Rasterizer>& on_create_rasterizer) const {
FML_DCHECK(task_runners_.IsValid());
std::unique_ptr<Shell> 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<const DartSnapshot> isolate_snapshot,
TaskRunners task_runners, const PlatformData& platform_data,
Settings settings, std::unique_ptr<Animator> animator,
fml::WeakPtr<IOManager> io_manager,
fml::RefPtr<SkiaUnrefQueue> unref_queue,
fml::WeakPtr<SnapshotDelegate> snapshot_delegate,
std::shared_ptr<VolatilePathTracker> 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<Shell> 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<const DartSnapshot> isolate_snapshot,
TaskRunners task_runners, const PlatformData& platform_data,
Settings settings, std::unique_ptr<Animator> animator,
fml::WeakPtr<IOManager> io_manager,
fml::RefPtr<SkiaUnrefQueue> unref_queue,
fml::WeakPtr<SnapshotDelegate> snapshot_delegate,
std::shared_ptr<VolatilePathTracker> 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<Shell> 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));

Expand Down
14 changes: 10 additions & 4 deletions shell/common/shell.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -148,7 +150,8 @@ class Shell final : public PlatformView::Delegate,
TaskRunners task_runners,
Settings settings,
const CreateCallback<PlatformView>& on_create_platform_view,
const CreateCallback<Rasterizer>& on_create_rasterizer);
const CreateCallback<Rasterizer>& on_create_rasterizer,
bool is_gpu_disabled = false);

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

static std::unique_ptr<Shell> CreateShellOnPlatformThread(
DartVMRef vm,
Expand All @@ -423,7 +427,8 @@ class Shell final : public PlatformView::Delegate,
fml::RefPtr<const DartSnapshot> isolate_snapshot,
const Shell::CreateCallback<PlatformView>& on_create_platform_view,
const Shell::CreateCallback<Rasterizer>& on_create_rasterizer,
const EngineCreateCallback& on_create_engine);
const EngineCreateCallback& on_create_engine,
bool is_gpu_disabled);
static std::unique_ptr<Shell> CreateWithSnapshot(
const PlatformData& platform_data,
TaskRunners task_runners,
Expand All @@ -432,7 +437,8 @@ class Shell final : public PlatformView::Delegate,
fml::RefPtr<const DartSnapshot> isolate_snapshot,
const CreateCallback<PlatformView>& on_create_platform_view,
const CreateCallback<Rasterizer>& on_create_rasterizer,
const EngineCreateCallback& on_create_engine);
const EngineCreateCallback& on_create_engine,
bool is_gpu_disabled);

bool Setup(std::unique_ptr<PlatformView> platform_view,
std::unique_ptr<Engine> engine,
Expand Down
6 changes: 4 additions & 2 deletions shell/common/shell_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,8 @@ std::unique_ptr<Shell> ShellTest::CreateShell(
TaskRunners task_runners,
bool simulate_vsync,
std::shared_ptr<ShellTestExternalViewEmbedder>
shell_test_external_view_embedder) {
shell_test_external_view_embedder,
bool is_gpu_disabled) {
const auto vsync_clock = std::make_shared<ShellTestVsyncClock>();
CreateVsyncWaiter create_vsync_waiter = [&]() {
if (simulate_vsync) {
Expand All @@ -335,7 +336,8 @@ std::unique_ptr<Shell> ShellTest::CreateShell(
ShellTestPlatformView::BackendType::kDefaultBackend,
shell_test_external_view_embedder);
},
[](Shell& shell) { return std::make_unique<Rasterizer>(shell); });
[](Shell& shell) { return std::make_unique<Rasterizer>(shell); },
is_gpu_disabled);
}
void ShellTest::DestroyShell(std::unique_ptr<Shell> shell) {
DestroyShell(std::move(shell), GetTaskRunnersForFixture());
Expand Down
3 changes: 2 additions & 1 deletion shell/common/shell_test.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ class ShellTest : public FixtureTest {
TaskRunners task_runners,
bool simulate_vsync = false,
std::shared_ptr<ShellTestExternalViewEmbedder>
shell_test_external_view_embedder = nullptr);
shell_test_external_view_embedder = nullptr,
bool is_gpu_disabled = false);
void DestroyShell(std::unique_ptr<Shell> shell);
void DestroyShell(std::unique_ptr<Shell> shell, TaskRunners task_runners);
TaskRunners GetTaskRunnersForFixture();
Expand Down
23 changes: 23 additions & 0 deletions shell/common/shell_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
15 changes: 8 additions & 7 deletions shell/platform/darwin/ios/framework/Source/FlutterEngine.mm
Original file line number Diff line number Diff line change
Expand Up @@ -612,13 +612,14 @@ - (BOOL)createShell:(NSString*)entrypoint
);

// Create the shell. This is a blocking operation.
std::unique_ptr<flutter::Shell> 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<flutter::Shell> 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: "
Expand Down