mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
block thread merging with shared engines (#23733)
This commit is contained in:
parent
8b27e6fb45
commit
2927e9fb43
@ -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());
|
||||
|
||||
@ -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_;
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user