未验证 提交 2927e9fb 编写于 作者: G gaaclarke 提交者: GitHub

block thread merging with shared engines (#23733)

上级 8b27e6fb
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册