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
11 changes: 11 additions & 0 deletions shell/common/rasterizer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
10 changes: 10 additions & 0 deletions shell/common/rasterizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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> surface_;
Expand All @@ -450,6 +459,7 @@ class Rasterizer final : public SnapshotDelegate {
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger_;
fml::TaskRunnerAffineWeakPtrFactory<Rasterizer> weak_factory_;
std::shared_ptr<ExternalViewEmbedder> external_view_embedder_;
bool shared_engine_block_thread_merging_ = false;

// |SnapshotDelegate|
sk_sp<SkImage> MakeRasterSnapshot(sk_sp<SkPicture> picture,
Expand Down
12 changes: 12 additions & 0 deletions shell/common/shell.cc
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,18 @@ std::unique_ptr<Shell> 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;
}

Expand Down