diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc index 3733e9586e8cc..0c671b8534efa 100644 --- a/shell/common/rasterizer.cc +++ b/shell/common/rasterizer.cc @@ -466,6 +466,17 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) { raster_status == RasterStatus::kSkipAndRetry) { return raster_status; } + if (shared_engine_block_thread_merging_ && raster_thread_merger_ && + raster_thread_merger_->IsMerged()) { + // TODO(73620): Remove when platform views are accounted for. + FML_LOG(ERROR) + << "Error: Thread merging not implemented for engines with shared " + "components.\n\n" + "This is likely a result of using platform views with enigne " + "groups. See " + "https://github.com/flutter/flutter/issues/73620."; + fml::KillProcess(); + } if (external_view_embedder_ && (!raster_thread_merger_ || raster_thread_merger_->IsMerged())) { FML_DCHECK(!frame->IsSubmitted()); diff --git a/shell/common/rasterizer.h b/shell/common/rasterizer.h index 208e455d1591c..b853e6628e4f8 100644 --- a/shell/common/rasterizer.h +++ b/shell/common/rasterizer.h @@ -434,6 +434,15 @@ class Rasterizer final : public SnapshotDelegate { /// void DisableThreadMergerIfNeeded(); + /// @brief Mechanism to stop thread merging when using shared engine + /// components. + /// @details This is a temporary workaround until thread merging can be + /// supported correctly. This should be called on the raster + /// thread. + /// @see https://github.com/flutter/flutter/issues/73620 + /// + void BlockThreadMerging() { shared_engine_block_thread_merging_ = true; } + private: Delegate& delegate_; std::unique_ptr surface_; @@ -450,6 +459,7 @@ class Rasterizer final : public SnapshotDelegate { fml::RefPtr raster_thread_merger_; fml::TaskRunnerAffineWeakPtrFactory weak_factory_; std::shared_ptr external_view_embedder_; + bool shared_engine_block_thread_merging_ = false; // |SnapshotDelegate| sk_sp MakeRasterSnapshot(sk_sp picture, diff --git a/shell/common/shell.cc b/shell/common/shell.cc index fe3e687f1333d..435138d7ce7af 100644 --- a/shell/common/shell.cc +++ b/shell/common/shell.cc @@ -500,6 +500,18 @@ std::unique_ptr Shell::Spawn( })); result->shared_resource_context_ = io_manager_->GetSharedResourceContext(); result->RunEngine(std::move(run_configuration)); + + task_runners_.GetRasterTaskRunner()->PostTask( + [rasterizer = rasterizer_->GetWeakPtr(), + spawn_rasterizer = result->rasterizer_->GetWeakPtr()]() { + if (rasterizer) { + rasterizer->BlockThreadMerging(); + } + if (spawn_rasterizer) { + spawn_rasterizer->BlockThreadMerging(); + } + }); + return result; }