block thread merging with shared engines (#23733)

This commit is contained in:
gaaclarke 2021-01-19 15:38:56 -08:00 committed by GitHub
parent 8b27e6fb45
commit 2927e9fb43
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 0 deletions

View File

@ -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());

View File

@ -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,

View File

@ -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;
}