Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit b658d77

Browse files
author
Emmanuel Garcia
committed
Enable/Disable from shell delegate
1 parent 7481a1f commit b658d77

File tree

5 files changed

+57
-63
lines changed

5 files changed

+57
-63
lines changed

fml/raster_thread_merger.cc

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,13 @@ RasterThreadMerger::RasterThreadMerger(fml::TaskQueueId platform_queue_id,
2222
}
2323

2424
void RasterThreadMerger::MergeWithLease(size_t lease_term) {
25+
FML_DCHECK(lease_term > 0) << "lease_term should be positive.";
2526
if (TaskQueuesAreSame()) {
2627
return;
2728
}
28-
if (!IsEnabled()) {
29+
if (!IsEnabledUnSafe()) {
2930
return;
3031
}
31-
32-
FML_DCHECK(lease_term > 0) << "lease_term should be positive.";
3332
std::scoped_lock lock(lease_term_mutex_);
3433
if (!IsMergedUnSafe()) {
3534
bool success = task_queues_->Merge(platform_queue_id_, gpu_queue_id_);
@@ -40,14 +39,13 @@ void RasterThreadMerger::MergeWithLease(size_t lease_term) {
4039
}
4140

4241
void RasterThreadMerger::UnMergeNow() {
42+
std::scoped_lock lock(lease_term_mutex_);
4343
if (TaskQueuesAreSame()) {
4444
return;
4545
}
46-
if (!IsEnabled()) {
46+
if (!IsEnabledUnSafe()) {
4747
return;
4848
}
49-
50-
std::scoped_lock lock(lease_term_mutex_);
5149
lease_term_ = 0;
5250
bool success = task_queues_->Unmerge(platform_queue_id_);
5351
FML_CHECK(success) << "Unable to un-merge the raster and platform threads.";
@@ -57,7 +55,7 @@ bool RasterThreadMerger::IsOnPlatformThread() const {
5755
return MessageLoop::GetCurrentTaskQueueId() == platform_queue_id_;
5856
}
5957

60-
bool RasterThreadMerger::IsOnRasterizingThread() {
58+
bool RasterThreadMerger::IsOnRasterizingThread() const {
6159
if (IsMergedUnSafe()) {
6260
return IsOnPlatformThread();
6361
} else {
@@ -77,7 +75,7 @@ void RasterThreadMerger::ExtendLeaseTo(size_t lease_term) {
7775
}
7876
}
7977

80-
bool RasterThreadMerger::IsMerged() {
78+
bool RasterThreadMerger::IsMerged() const {
8179
std::scoped_lock lock(lease_term_mutex_);
8280
return IsMergedUnSafe();
8381
}
@@ -94,14 +92,18 @@ void RasterThreadMerger::Disable() {
9492

9593
bool RasterThreadMerger::IsEnabled() const {
9694
std::scoped_lock lock(lease_term_mutex_);
95+
return IsEnabledUnSafe();
96+
}
97+
98+
bool RasterThreadMerger::IsEnabledUnSafe() const {
9799
return enabled_;
98100
}
99101

100-
bool RasterThreadMerger::IsMergedUnSafe() {
102+
bool RasterThreadMerger::IsMergedUnSafe() const {
101103
return lease_term_ > 0 || TaskQueuesAreSame();
102104
}
103105

104-
bool RasterThreadMerger::TaskQueuesAreSame() {
106+
bool RasterThreadMerger::TaskQueuesAreSame() const {
105107
return platform_queue_id_ == gpu_queue_id_;
106108
}
107109

fml/raster_thread_merger.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class RasterThreadMerger
5555
// When task queues are statically merged this method becomes no-op.
5656
RasterThreadStatus DecrementLease();
5757

58-
bool IsMerged();
58+
bool IsMerged() const;
5959

6060
// Waits until the threads are merged.
6161
//
@@ -68,7 +68,7 @@ class RasterThreadMerger
6868
// Returns true if the current thread owns rasterizing.
6969
// When the threads are merged, platform thread owns rasterizing.
7070
// When un-merged, raster thread owns rasterizing.
71-
bool IsOnRasterizingThread();
71+
bool IsOnRasterizingThread() const;
7272

7373
// Returns true if the current thread is the platform thread.
7474
bool IsOnPlatformThread() const;
@@ -95,10 +95,13 @@ class RasterThreadMerger
9595
std::mutex lease_term_mutex_;
9696
bool enabled_;
9797

98-
bool IsMergedUnSafe();
98+
bool IsMergedUnSafe() const;
99+
100+
bool IsEnabledUnSafe() const;
101+
99102
// The platform_queue_id and gpu_queue_id are exactly the same.
100103
// We consider the threads are always merged and cannot be unmerged.
101-
bool TaskQueuesAreSame();
104+
bool TaskQueuesAreSame() const;
102105

103106
FML_FRIEND_REF_COUNTED_THREAD_SAFE(RasterThreadMerger);
104107
FML_FRIEND_MAKE_REF_COUNTED(RasterThreadMerger);

shell/common/rasterizer.cc

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,17 @@ void Rasterizer::Teardown() {
7777
compositor_context_->OnGrContextDestroyed();
7878
surface_.reset();
7979
last_layer_tree_.reset();
80-
if (raster_thread_merger_.get() != nullptr &&
81-
raster_thread_merger_.get()->IsMerged()) {
82-
raster_thread_merger_->UnMergeNow();
80+
}
81+
82+
void Rasterizer::EnableThreadMergerIfNeeded() {
83+
if (raster_thread_merger_) {
84+
raster_thread_merger_->Enable();
85+
}
86+
}
87+
88+
void Rasterizer::DisableThreadMergerIfNeeded() {
89+
if (raster_thread_merger_) {
90+
raster_thread_merger_->Disable();
8391
}
8492
}
8593

@@ -146,11 +154,12 @@ void Rasterizer::Draw(fml::RefPtr<Pipeline<flutter::LayerTree>> pipeline) {
146154

147155
// Merging the thread as we know the next `Draw` should be run on the platform
148156
// thread.
149-
if (surface_ != nullptr && surface_->GetExternalViewEmbedder() != nullptr) {
150-
auto should_resubmit_frame = raster_status == RasterStatus::kResubmit;
151-
surface_->GetExternalViewEmbedder()->EndFrame(should_resubmit_frame,
152-
raster_thread_merger_);
153-
}
157+
// if (surface_ != nullptr && surface_->GetExternalViewEmbedder() != nullptr)
158+
// {
159+
// auto should_resubmit_frame = raster_status == RasterStatus::kResubmit;
160+
// surface_->GetExternalViewEmbedder()->EndFrame(should_resubmit_frame,
161+
// raster_thread_merger_);
162+
// }
154163

155164
// Consume as many pipeline items as possible. But yield the event loop
156165
// between successive tries.
@@ -358,12 +367,12 @@ RasterStatus Rasterizer::DoDraw(
358367
// - |Draw| for B yields as its on the wrong thread.
359368
// This enqueue ensures that we attempt to consume from the right
360369
// thread one more time after un-merge.
361-
if (raster_thread_merger_) {
362-
if (raster_thread_merger_->DecrementLease() ==
363-
fml::RasterThreadStatus::kUnmergedNow) {
364-
return RasterStatus::kEnqueuePipeline;
365-
}
366-
}
370+
// if (raster_thread_merger_) {
371+
// if (raster_thread_merger_->DecrementLease() ==
372+
// fml::RasterThreadStatus::kUnmergedNow) {
373+
// return RasterStatus::kEnqueuePipeline;
374+
// }
375+
// }
367376

368377
return raster_status;
369378
}
@@ -377,7 +386,7 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
377386
// for instrumentation.
378387
compositor_context_->ui_time().SetLapTime(layer_tree.build_time());
379388

380-
auto* external_view_embedder = surface_->GetExternalViewEmbedder();
389+
flutter::ExternalViewEmbedder* external_view_embedder = nullptr;
381390

382391
SkCanvas* embedder_root_canvas = nullptr;
383392
if (external_view_embedder != nullptr) {
@@ -663,24 +672,6 @@ std::optional<size_t> Rasterizer::GetResourceCacheMaxBytes() const {
663672
return std::nullopt;
664673
}
665674

666-
bool Rasterizer::EnsureThreadsAreMerged() {
667-
if (surface_ == nullptr || raster_thread_merger_.get() == nullptr) {
668-
return false;
669-
}
670-
fml::TaskRunner::RunNowOrPostTask(
671-
delegate_.GetTaskRunners().GetRasterTaskRunner(),
672-
[weak_this = weak_factory_.GetWeakPtr(),
673-
thread_merger = raster_thread_merger_]() {
674-
if (weak_this->surface_ == nullptr) {
675-
return;
676-
}
677-
thread_merger->MergeWithLease(10);
678-
});
679-
raster_thread_merger_->WaitUntilMerged();
680-
FML_DCHECK(raster_thread_merger_->IsMerged());
681-
return true;
682-
}
683-
684675
Rasterizer::Screenshot::Screenshot() {}
685676

686677
Rasterizer::Screenshot::Screenshot(sk_sp<SkData> p_data, SkISize p_size)

shell/common/rasterizer.h

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -389,21 +389,9 @@ class Rasterizer final : public SnapshotDelegate {
389389
///
390390
std::optional<size_t> GetResourceCacheMaxBytes() const;
391391

392-
//----------------------------------------------------------------------------
393-
/// @brief Makes sure the raster task runner and the platform task runner
394-
/// are merged.
395-
///
396-
/// @attention If raster and platform task runners are not the same or not
397-
/// merged, this method will try to merge the task runners,
398-
/// blocking the current thread until the 2 task runners are
399-
/// merged.
400-
///
401-
/// @return `true` if raster and platform task runners are the same.
402-
/// `true` if/when raster and platform task runners are merged.
403-
/// `false` if the surface or the |RasterThreadMerger| has not
404-
/// been initialized.
405-
///
406-
bool EnsureThreadsAreMerged();
392+
void EnableThreadMergerIfNeeded();
393+
394+
void DisableThreadMergerIfNeeded();
407395

408396
private:
409397
Delegate& delegate_;

shell/common/shell.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,9 @@ void Shell::OnPlatformViewCreated(std::unique_ptr<Surface> surface) {
619619
FML_DCHECK(is_setup_);
620620
FML_DCHECK(task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread());
621621

622+
// Enables the thread merger which may be used by the external view embedder.
623+
rasterizer_->EnabledThreadMergerIfNeeded();
624+
622625
// Note:
623626
// This is a synchronous operation because certain platforms depend on
624627
// setup/suspension of all activities that may be interacting with the GPU in
@@ -708,6 +711,14 @@ void Shell::OnPlatformViewDestroyed() {
708711
FML_DCHECK(is_setup_);
709712
FML_DCHECK(task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread());
710713

714+
// Prevent any request to merge the raster and platform threads while the
715+
// platform view is destroyed.
716+
//
717+
// This prevents a dead lock where the platform thread is blocked waiting for
718+
// the latch, but the latch is never released because the raster queue is all
719+
// the sudden running on the platform thread.
720+
rasterizer_->DisableThreadMergerIfNeeded();
721+
711722
// Note:
712723
// This is a synchronous operation because certain platforms depend on
713724
// setup/suspension of all activities that may be interacting with the GPU in
@@ -747,7 +758,6 @@ void Shell::OnPlatformViewDestroyed() {
747758
// surface is about to go away.
748759
fml::TaskRunner::RunNowOrPostTask(task_runners_.GetUITaskRunner(), ui_task);
749760
latch.Wait();
750-
rasterizer_->EnsureThreadsAreMerged();
751761
fml::TaskRunner::RunNowOrPostTask(task_runners_.GetRasterTaskRunner(),
752762
raster_task);
753763
latch.Wait();

0 commit comments

Comments
 (0)