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

Commit ac8175f

Browse files
author
Chris Yang
authored
Only create raster_thread_merge when explicitly requested by the embedding platform (#20487)
1 parent 31a0e45 commit ac8175f

11 files changed

+116
-11
lines changed

flow/embedded_views.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,8 @@ const std::vector<std::shared_ptr<Mutator>>::const_iterator MutatorsStack::End()
6060
return vector_.end();
6161
};
6262

63+
bool ExternalViewEmbedder::SupportsDynamicThreadMerging() {
64+
return false;
65+
}
66+
6367
} // namespace flutter

flow/embedded_views.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,10 @@ class ExternalViewEmbedder {
266266
// sets the stage for the next pre-roll.
267267
virtual void CancelFrame() = 0;
268268

269+
// Indicates the begining of a frame.
270+
//
271+
// The `raster_thread_merger` will be null if |SupportsDynamicThreadMerging|
272+
// returns false.
269273
virtual void BeginFrame(
270274
SkISize frame_size,
271275
GrDirectContext* context,
@@ -306,10 +310,20 @@ class ExternalViewEmbedder {
306310
// A new frame on the platform thread starts immediately. If the GPU thread
307311
// still has some task running, there could be two frames being rendered
308312
// concurrently, which causes undefined behaviors.
313+
//
314+
// The `raster_thread_merger` will be null if |SupportsDynamicThreadMerging|
315+
// returns false.
309316
virtual void EndFrame(
310317
bool should_resubmit_frame,
311318
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {}
312319

320+
// Whether the embedder should support dynamic thread merging.
321+
//
322+
// Returning `true` results a |RasterThreadMerger| instance to be created.
323+
// * See also |BegineFrame| and |EndFrame| for getting the
324+
// |RasterThreadMerger| instance.
325+
virtual bool SupportsDynamicThreadMerging();
326+
313327
FML_DISALLOW_COPY_AND_ASSIGN(ExternalViewEmbedder);
314328

315329
}; // ExternalViewEmbedder

shell/common/rasterizer.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ void Rasterizer::Setup(std::unique_ptr<Surface> surface) {
6161
#if !defined(OS_FUCHSIA)
6262
// TODO(sanjayc77): https://github.com/flutter/flutter/issues/53179. Add
6363
// support for raster thread merger for Fuchsia.
64-
if (surface_->GetExternalViewEmbedder()) {
64+
if (surface_->GetExternalViewEmbedder() &&
65+
surface_->GetExternalViewEmbedder()->SupportsDynamicThreadMerging()) {
6566
const auto platform_id =
6667
delegate_.GetTaskRunners().GetPlatformTaskRunner()->GetTaskQueueId();
6768
const auto gpu_id =

shell/common/shell_test_external_view_embedder.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,16 @@ void ShellTestExternalViewEmbedder::SubmitFrame(
4545
void ShellTestExternalViewEmbedder::EndFrame(
4646
bool should_resubmit_frame,
4747
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
48-
end_frame_call_back_(should_resubmit_frame);
48+
end_frame_call_back_(should_resubmit_frame, raster_thread_merger);
4949
}
5050

5151
// |ExternalViewEmbedder|
5252
SkCanvas* ShellTestExternalViewEmbedder::GetRootCanvas() {
5353
return nullptr;
5454
}
5555

56+
bool ShellTestExternalViewEmbedder::SupportsDynamicThreadMerging() {
57+
return support_thread_merging_;
58+
}
59+
5660
} // namespace flutter

shell/common/shell_test_external_view_embedder.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ namespace flutter {
1515
///
1616
class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder {
1717
public:
18-
using EndFrameCallBack = std::function<void(bool)>;
18+
using EndFrameCallBack =
19+
std::function<void(bool, fml::RefPtr<fml::RasterThreadMerger>)>;
1920

2021
ShellTestExternalViewEmbedder(const EndFrameCallBack& end_frame_call_back,
21-
PostPrerollResult post_preroll_result)
22+
PostPrerollResult post_preroll_result,
23+
bool support_thread_merging)
2224
: end_frame_call_back_(end_frame_call_back),
23-
post_preroll_result_(post_preroll_result) {}
25+
post_preroll_result_(post_preroll_result),
26+
support_thread_merging_(support_thread_merging) {}
2427

2528
~ShellTestExternalViewEmbedder() = default;
2629

@@ -62,9 +65,14 @@ class ShellTestExternalViewEmbedder final : public ExternalViewEmbedder {
6265
// |ExternalViewEmbedder|
6366
SkCanvas* GetRootCanvas() override;
6467

68+
// |ExternalViewEmbedder|
69+
bool SupportsDynamicThreadMerging() override;
70+
6571
const EndFrameCallBack end_frame_call_back_;
6672
const PostPrerollResult post_preroll_result_;
6773

74+
bool support_thread_merging_;
75+
6876
FML_DISALLOW_COPY_AND_ASSIGN(ShellTestExternalViewEmbedder);
6977
};
7078

shell/common/shell_unittests.cc

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -475,18 +475,69 @@ TEST_F(ShellTest, FrameRasterizedCallbackIsCalled) {
475475
#if !defined(OS_FUCHSIA)
476476
// TODO(sanjayc77): https://github.com/flutter/flutter/issues/53179. Add
477477
// support for raster thread merger for Fuchsia.
478+
TEST_F(ShellTest, ExternalEmbedderNoThreadMerger) {
479+
auto settings = CreateSettingsForFixture();
480+
fml::AutoResetWaitableEvent endFrameLatch;
481+
bool end_frame_called = false;
482+
auto end_frame_callback =
483+
[&](bool should_resubmit_frame,
484+
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
485+
ASSERT_TRUE(raster_thread_merger.get() == nullptr);
486+
ASSERT_FALSE(should_resubmit_frame);
487+
end_frame_called = true;
488+
endFrameLatch.Signal();
489+
};
490+
auto external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
491+
end_frame_callback, PostPrerollResult::kResubmitFrame, false);
492+
auto shell = CreateShell(std::move(settings), GetTaskRunnersForFixture(),
493+
false, external_view_embedder);
494+
495+
// Create the surface needed by rasterizer
496+
PlatformViewNotifyCreated(shell.get());
497+
498+
auto configuration = RunConfiguration::InferFromSettings(settings);
499+
configuration.SetEntrypoint("emptyMain");
500+
501+
RunEngine(shell.get(), std::move(configuration));
502+
503+
LayerTreeBuilder builder = [&](std::shared_ptr<ContainerLayer> root) {
504+
SkPictureRecorder recorder;
505+
SkCanvas* recording_canvas =
506+
recorder.beginRecording(SkRect::MakeXYWH(0, 0, 80, 80));
507+
recording_canvas->drawRect(SkRect::MakeXYWH(0, 0, 80, 80),
508+
SkPaint(SkColor4f::FromColor(SK_ColorRED)));
509+
auto sk_picture = recorder.finishRecordingAsPicture();
510+
fml::RefPtr<SkiaUnrefQueue> queue = fml::MakeRefCounted<SkiaUnrefQueue>(
511+
this->GetCurrentTaskRunner(), fml::TimeDelta::FromSeconds(0));
512+
auto picture_layer = std::make_shared<PictureLayer>(
513+
SkPoint::Make(10, 10),
514+
flutter::SkiaGPUObject<SkPicture>({sk_picture, queue}), false, false);
515+
root->Add(picture_layer);
516+
};
517+
518+
PumpOneFrame(shell.get(), 100, 100, builder);
519+
endFrameLatch.Wait();
520+
521+
ASSERT_TRUE(end_frame_called);
522+
523+
DestroyShell(std::move(shell));
524+
}
525+
478526
TEST_F(ShellTest,
479527
ExternalEmbedderEndFrameIsCalledWhenPostPrerollResultIsResubmit) {
480528
auto settings = CreateSettingsForFixture();
481529
fml::AutoResetWaitableEvent endFrameLatch;
482530
bool end_frame_called = false;
483-
auto end_frame_callback = [&](bool should_resubmit_frame) {
484-
ASSERT_TRUE(should_resubmit_frame);
485-
end_frame_called = true;
486-
endFrameLatch.Signal();
487-
};
531+
auto end_frame_callback =
532+
[&](bool should_resubmit_frame,
533+
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) {
534+
ASSERT_TRUE(raster_thread_merger.get() != nullptr);
535+
ASSERT_TRUE(should_resubmit_frame);
536+
end_frame_called = true;
537+
endFrameLatch.Signal();
538+
};
488539
auto external_view_embedder = std::make_shared<ShellTestExternalViewEmbedder>(
489-
end_frame_callback, PostPrerollResult::kResubmitFrame);
540+
end_frame_callback, PostPrerollResult::kResubmitFrame, true);
490541
auto shell = CreateShell(std::move(settings), GetTaskRunnersForFixture(),
491542
false, external_view_embedder);
492543

shell/platform/android/external_view_embedder/external_view_embedder.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,4 +295,9 @@ void AndroidExternalViewEmbedder::EndFrame(
295295
}
296296
}
297297

298+
// |ExternalViewEmbedder|
299+
bool AndroidExternalViewEmbedder::SupportsDynamicThreadMerging() {
300+
return true;
301+
}
302+
298303
} // namespace flutter

shell/platform/android/external_view_embedder/external_view_embedder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class AndroidExternalViewEmbedder final : public ExternalViewEmbedder {
7070
bool should_resubmit_frame,
7171
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
7272

73+
bool SupportsDynamicThreadMerging() override;
74+
7375
// Gets the rect based on the device pixel ratio of a platform view displayed
7476
// on the screen.
7577
SkRect GetViewRect(int view_id) const;

shell/platform/android/external_view_embedder/external_view_embedder_unittests.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,5 +556,13 @@ TEST(AndroidExternalViewEmbedder, DestroyOverlayLayersOnSizeChange) {
556556
raster_thread_merger);
557557
}
558558

559+
TEST(AndroidExternalViewEmbedder, SupportsDynamicThreadMerging) {
560+
auto jni_mock = std::make_shared<JNIMock>();
561+
562+
auto embedder =
563+
std::make_unique<AndroidExternalViewEmbedder>(nullptr, jni_mock, nullptr);
564+
ASSERT_TRUE(embedder->SupportsDynamicThreadMerging());
565+
}
566+
559567
} // namespace testing
560568
} // namespace flutter

shell/platform/darwin/ios/ios_surface.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ class IOSSurface : public ExternalViewEmbedder {
8888
void EndFrame(bool should_resubmit_frame,
8989
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger) override;
9090

91+
// |ExternalViewEmbedder|
92+
bool SupportsDynamicThreadMerging() override;
93+
9194
public:
9295
FML_DISALLOW_COPY_AND_ASSIGN(IOSSurface);
9396
};

shell/platform/darwin/ios/ios_surface.mm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,9 @@ bool IsIosEmbeddedViewsPreviewEnabled() {
155155
return platform_views_controller_->EndFrame(should_resubmit_frame, raster_thread_merger);
156156
}
157157

158+
// |ExternalViewEmbedder|
159+
bool IOSSurface::SupportsDynamicThreadMerging() {
160+
return true;
161+
}
162+
158163
} // namespace flutter

0 commit comments

Comments
 (0)