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

Commit 2927e9f

Browse files
authored
block thread merging with shared engines (#23733)
1 parent 8b27e6f commit 2927e9f

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

shell/common/rasterizer.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,17 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
466466
raster_status == RasterStatus::kSkipAndRetry) {
467467
return raster_status;
468468
}
469+
if (shared_engine_block_thread_merging_ && raster_thread_merger_ &&
470+
raster_thread_merger_->IsMerged()) {
471+
// TODO(73620): Remove when platform views are accounted for.
472+
FML_LOG(ERROR)
473+
<< "Error: Thread merging not implemented for engines with shared "
474+
"components.\n\n"
475+
"This is likely a result of using platform views with enigne "
476+
"groups. See "
477+
"https://github.com/flutter/flutter/issues/73620.";
478+
fml::KillProcess();
479+
}
469480
if (external_view_embedder_ &&
470481
(!raster_thread_merger_ || raster_thread_merger_->IsMerged())) {
471482
FML_DCHECK(!frame->IsSubmitted());

shell/common/rasterizer.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,15 @@ class Rasterizer final : public SnapshotDelegate {
434434
///
435435
void DisableThreadMergerIfNeeded();
436436

437+
/// @brief Mechanism to stop thread merging when using shared engine
438+
/// components.
439+
/// @details This is a temporary workaround until thread merging can be
440+
/// supported correctly. This should be called on the raster
441+
/// thread.
442+
/// @see https://github.com/flutter/flutter/issues/73620
443+
///
444+
void BlockThreadMerging() { shared_engine_block_thread_merging_ = true; }
445+
437446
private:
438447
Delegate& delegate_;
439448
std::unique_ptr<Surface> surface_;
@@ -450,6 +459,7 @@ class Rasterizer final : public SnapshotDelegate {
450459
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger_;
451460
fml::TaskRunnerAffineWeakPtrFactory<Rasterizer> weak_factory_;
452461
std::shared_ptr<ExternalViewEmbedder> external_view_embedder_;
462+
bool shared_engine_block_thread_merging_ = false;
453463

454464
// |SnapshotDelegate|
455465
sk_sp<SkImage> MakeRasterSnapshot(sk_sp<SkPicture> picture,

shell/common/shell.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,18 @@ std::unique_ptr<Shell> Shell::Spawn(
500500
}));
501501
result->shared_resource_context_ = io_manager_->GetSharedResourceContext();
502502
result->RunEngine(std::move(run_configuration));
503+
504+
task_runners_.GetRasterTaskRunner()->PostTask(
505+
[rasterizer = rasterizer_->GetWeakPtr(),
506+
spawn_rasterizer = result->rasterizer_->GetWeakPtr()]() {
507+
if (rasterizer) {
508+
rasterizer->BlockThreadMerging();
509+
}
510+
if (spawn_rasterizer) {
511+
spawn_rasterizer->BlockThreadMerging();
512+
}
513+
});
514+
503515
return result;
504516
}
505517

0 commit comments

Comments
 (0)