Skip to content

Commit 34d155e

Browse files
cbrackenchaselatta
authored andcommitted
Revert "Rasterizer is initialized with an external view embedder (flutter#22348)" (flutter#22367)
This reverts commit 0d5f2e9. Due to merge conflicts, this also reverts flutter#22275: Revert "Do not involve external_view_embedder in submit frame process if threads are not merged. (flutter#22275)" This reverts commit 016fbde.
1 parent 7851991 commit 34d155e

File tree

8 files changed

+64
-305
lines changed

8 files changed

+64
-305
lines changed

shell/common/platform_view.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,6 @@ class PlatformView {
582582
ComputePlatformResolvedLocales(
583583
const std::vector<std::string>& supported_locale_data);
584584

585-
virtual std::shared_ptr<ExternalViewEmbedder> CreateExternalViewEmbedder();
586-
587585
protected:
588586
PlatformView::Delegate& delegate_;
589587
const TaskRunners task_runners_;
@@ -596,6 +594,8 @@ class PlatformView {
596594
// GPU task runner.
597595
virtual std::unique_ptr<Surface> CreateRenderingSurface();
598596

597+
virtual std::shared_ptr<ExternalViewEmbedder> CreateExternalViewEmbedder();
598+
599599
private:
600600
FML_DISALLOW_COPY_AND_ASSIGN(PlatformView);
601601
};

shell/common/rasterizer.cc

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ void Rasterizer::Setup(std::unique_ptr<Surface> surface) {
7676
user_override_resource_cache_bytes_);
7777
}
7878
compositor_context_->OnGrContextCreated();
79-
if (external_view_embedder_ &&
80-
external_view_embedder_->SupportsDynamicThreadMerging() &&
79+
if (surface_->GetExternalViewEmbedder() &&
80+
surface_->GetExternalViewEmbedder()->SupportsDynamicThreadMerging() &&
8181
!raster_thread_merger_) {
8282
const auto platform_id =
8383
delegate_.GetTaskRunners().GetPlatformTaskRunner()->GetTaskQueueId();
@@ -190,10 +190,11 @@ void Rasterizer::Draw(fml::RefPtr<Pipeline<flutter::LayerTree>> pipeline,
190190
consume_result = PipelineConsumeResult::MoreAvailable;
191191
}
192192

193-
// EndFrame should perform cleanups for the external_view_embedder.
194-
if (external_view_embedder_) {
195-
external_view_embedder_->EndFrame(should_resubmit_frame,
196-
raster_thread_merger_);
193+
// Merging the thread as we know the next `Draw` should be run on the platform
194+
// thread.
195+
if (surface_ != nullptr && surface_->GetExternalViewEmbedder() != nullptr) {
196+
surface_->GetExternalViewEmbedder()->EndFrame(should_resubmit_frame,
197+
raster_thread_merger_);
197198
}
198199

199200
// Consume as many pipeline items as possible. But yield the event loop
@@ -423,12 +424,14 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
423424
// for instrumentation.
424425
compositor_context_->ui_time().SetLapTime(layer_tree.build_time());
425426

427+
auto* external_view_embedder = surface_->GetExternalViewEmbedder();
428+
426429
SkCanvas* embedder_root_canvas = nullptr;
427-
if (external_view_embedder_) {
428-
external_view_embedder_->BeginFrame(
430+
if (external_view_embedder != nullptr) {
431+
external_view_embedder->BeginFrame(
429432
layer_tree.frame_size(), surface_->GetContext(),
430433
layer_tree.device_pixel_ratio(), raster_thread_merger_);
431-
embedder_root_canvas = external_view_embedder_->GetRootCanvas();
434+
embedder_root_canvas = external_view_embedder->GetRootCanvas();
432435
}
433436

434437
// On Android, the external view embedder deletes surfaces in `BeginFrame`.
@@ -451,13 +454,13 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
451454
embedder_root_canvas ? embedder_root_canvas : frame->SkiaCanvas();
452455

453456
auto compositor_frame = compositor_context_->AcquireFrame(
454-
surface_->GetContext(), // skia GrContext
455-
root_surface_canvas, // root surface canvas
456-
external_view_embedder_.get(), // external view embedder
457-
root_surface_transformation, // root surface transformation
458-
true, // instrumentation enabled
459-
frame->supports_readback(), // surface supports pixel reads
460-
raster_thread_merger_ // thread merger
457+
surface_->GetContext(), // skia GrContext
458+
root_surface_canvas, // root surface canvas
459+
external_view_embedder, // external view embedder
460+
root_surface_transformation, // root surface transformation
461+
true, // instrumentation enabled
462+
frame->supports_readback(), // surface supports pixel reads
463+
raster_thread_merger_ // thread merger
461464
);
462465

463466
if (compositor_frame) {
@@ -466,11 +469,10 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
466469
raster_status == RasterStatus::kSkipAndRetry) {
467470
return raster_status;
468471
}
469-
if (external_view_embedder_ != nullptr &&
470-
(!raster_thread_merger_ || raster_thread_merger_->IsMerged())) {
472+
if (external_view_embedder != nullptr) {
471473
FML_DCHECK(!frame->IsSubmitted());
472-
external_view_embedder_->SubmitFrame(surface_->GetContext(),
473-
std::move(frame));
474+
external_view_embedder->SubmitFrame(surface_->GetContext(),
475+
std::move(frame));
474476
} else {
475477
frame->Submit();
476478
}
@@ -651,11 +653,6 @@ void Rasterizer::SetNextFrameCallback(const fml::closure& callback) {
651653
next_frame_callback_ = callback;
652654
}
653655

654-
void Rasterizer::SetExternalViewEmbedder(
655-
const std::shared_ptr<ExternalViewEmbedder>& view_embedder) {
656-
external_view_embedder_ = view_embedder;
657-
}
658-
659656
void Rasterizer::FireNextFrameCallbackIfPresent() {
660657
if (!next_frame_callback_) {
661658
return;

shell/common/rasterizer.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include <memory>
99
#include <optional>
1010

11-
#include "flow/embedded_views.h"
1211
#include "flutter/common/settings.h"
1312
#include "flutter/common/task_runners.h"
1413
#include "flutter/flow/compositor_context.h"
@@ -350,16 +349,6 @@ class Rasterizer final : public SnapshotDelegate {
350349
///
351350
void SetNextFrameCallback(const fml::closure& callback);
352351

353-
//----------------------------------------------------------------------------
354-
/// @brief Set the External View Embedder. This is done on shell
355-
/// initialization. This is non-null on platforms that support
356-
/// embedding externally composited views.
357-
///
358-
/// @param[in] view_embedder The external view embedder object.
359-
///
360-
void SetExternalViewEmbedder(
361-
const std::shared_ptr<ExternalViewEmbedder>& view_embedder);
362-
363352
//----------------------------------------------------------------------------
364353
/// @brief Returns a pointer to the compositor context used by this
365354
/// rasterizer. This pointer will never be `nullptr`.
@@ -448,7 +437,6 @@ class Rasterizer final : public SnapshotDelegate {
448437
std::optional<size_t> max_cache_bytes_;
449438
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger_;
450439
fml::TaskRunnerAffineWeakPtrFactory<Rasterizer> weak_factory_;
451-
std::shared_ptr<ExternalViewEmbedder> external_view_embedder_;
452440

453441
// |SnapshotDelegate|
454442
sk_sp<SkImage> MakeRasterSnapshot(sk_sp<SkPicture> picture,

shell/common/rasterizer_unittests.cc

Lines changed: 12 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
#define FML_USED_ON_EMBEDDER
6-
75
#include "flutter/shell/common/rasterizer.h"
86

97
#include "flutter/shell/common/thread_host.h"
108
#include "flutter/testing/testing.h"
119
#include "gmock/gmock.h"
1210

1311
using testing::_;
14-
using testing::ByMove;
1512
using testing::Return;
1613
using testing::ReturnRef;
1714

@@ -95,65 +92,7 @@ TEST(RasterizerTest, drawEmptyPipeline) {
9592
latch.Wait();
9693
}
9794

98-
TEST(RasterizerTest,
99-
drawWithExternalViewEmbedder_ExternalViewEmbedderSubmitFrameCalled) {
100-
std::string test_name =
101-
::testing::UnitTest::GetInstance()->current_test_info()->name();
102-
ThreadHost thread_host("io.flutter.test." + test_name + ".",
103-
ThreadHost::Type::Platform | ThreadHost::Type::GPU |
104-
ThreadHost::Type::IO | ThreadHost::Type::UI);
105-
TaskRunners task_runners("test", thread_host.platform_thread->GetTaskRunner(),
106-
thread_host.raster_thread->GetTaskRunner(),
107-
thread_host.ui_thread->GetTaskRunner(),
108-
thread_host.io_thread->GetTaskRunner());
109-
MockDelegate delegate;
110-
EXPECT_CALL(delegate, GetTaskRunners())
111-
.WillRepeatedly(ReturnRef(task_runners));
112-
EXPECT_CALL(delegate, OnFrameRasterized(_));
113-
auto rasterizer = std::make_unique<Rasterizer>(delegate);
114-
auto surface = std::make_unique<MockSurface>();
115-
std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
116-
std::make_shared<MockExternalViewEmbedder>();
117-
rasterizer->SetExternalViewEmbedder(external_view_embedder);
118-
119-
auto surface_frame = std::make_unique<SurfaceFrame>(
120-
/*surface=*/nullptr, /*supports_readback=*/true,
121-
/*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; });
122-
EXPECT_CALL(*surface, AcquireFrame(SkISize()))
123-
.WillOnce(Return(ByMove(std::move(surface_frame))));
124-
125-
EXPECT_CALL(*external_view_embedder,
126-
BeginFrame(/*frame_size=*/SkISize(), /*context=*/nullptr,
127-
/*device_pixel_ratio=*/2.0,
128-
/*raster_thread_merger=*/
129-
fml::RefPtr<fml::RasterThreadMerger>(nullptr)))
130-
.Times(1);
131-
EXPECT_CALL(*external_view_embedder, SubmitFrame).Times(1);
132-
EXPECT_CALL(
133-
*external_view_embedder,
134-
EndFrame(/*should_resubmit_frame=*/false,
135-
/*raster_thread_merger=*/fml::RefPtr<fml::RasterThreadMerger>(
136-
nullptr)))
137-
.Times(1);
138-
139-
rasterizer->Setup(std::move(surface));
140-
fml::AutoResetWaitableEvent latch;
141-
thread_host.raster_thread->GetTaskRunner()->PostTask([&] {
142-
auto pipeline = fml::AdoptRef(new Pipeline<LayerTree>(/*depth=*/10));
143-
auto layer_tree = std::make_unique<LayerTree>(/*frame_size=*/SkISize(),
144-
/*device_pixel_ratio=*/2.0f);
145-
bool result = pipeline->Produce().Complete(std::move(layer_tree));
146-
EXPECT_TRUE(result);
147-
auto no_discard = [](LayerTree&) { return false; };
148-
rasterizer->Draw(pipeline, no_discard);
149-
latch.Signal();
150-
});
151-
latch.Wait();
152-
}
153-
154-
TEST(
155-
RasterizerTest,
156-
drawWithExternalViewEmbedderAndThreadMergerNotMerged_ExternalViewEmbedderSubmitFrameNotCalled) {
95+
TEST(RasterizerTest, drawWithExternalViewEmbedder) {
15796
std::string test_name =
15897
::testing::UnitTest::GetInstance()->current_test_info()->name();
15998
ThreadHost thread_host("io.flutter.test." + test_name + ".",
@@ -169,27 +108,14 @@ TEST(
169108
EXPECT_CALL(delegate, OnFrameRasterized(_));
170109
auto rasterizer = std::make_unique<Rasterizer>(delegate);
171110
auto surface = std::make_unique<MockSurface>();
172-
std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
173-
std::make_shared<MockExternalViewEmbedder>();
174-
rasterizer->SetExternalViewEmbedder(external_view_embedder);
175-
EXPECT_CALL(*external_view_embedder, SupportsDynamicThreadMerging)
176-
.WillRepeatedly(Return(true));
177-
auto surface_frame = std::make_unique<SurfaceFrame>(
178-
/*surface=*/nullptr, /*supports_readback=*/true,
179-
/*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; });
180-
EXPECT_CALL(*surface, AcquireFrame(SkISize()))
181-
.WillOnce(Return(ByMove(std::move(surface_frame))));
182-
183-
EXPECT_CALL(*external_view_embedder,
184-
BeginFrame(/*frame_size=*/SkISize(), /*context=*/nullptr,
185-
/*device_pixel_ratio=*/2.0,
186-
/*raster_thread_merger=*/_))
187-
.Times(1);
188-
EXPECT_CALL(*external_view_embedder, SubmitFrame).Times(0);
189-
EXPECT_CALL(*external_view_embedder, EndFrame(/*should_resubmit_frame=*/false,
190-
/*raster_thread_merger=*/_))
191-
.Times(1);
192-
111+
MockExternalViewEmbedder external_view_embedder;
112+
EXPECT_CALL(*surface, GetExternalViewEmbedder())
113+
.WillRepeatedly(Return(&external_view_embedder));
114+
EXPECT_CALL(external_view_embedder,
115+
BeginFrame(SkISize(), nullptr, 2.0,
116+
fml::RefPtr<fml::RasterThreadMerger>(nullptr)));
117+
EXPECT_CALL(external_view_embedder,
118+
EndFrame(false, fml::RefPtr<fml::RasterThreadMerger>(nullptr)));
193119
rasterizer->Setup(std::move(surface));
194120
fml::AutoResetWaitableEvent latch;
195121
thread_host.raster_thread->GetTaskRunner()->PostTask([&] {
@@ -198,66 +124,12 @@ TEST(
198124
/*device_pixel_ratio=*/2.0f);
199125
bool result = pipeline->Produce().Complete(std::move(layer_tree));
200126
EXPECT_TRUE(result);
201-
auto no_discard = [](LayerTree&) { return false; };
127+
std::function<bool(LayerTree&)> no_discard = [](LayerTree&) {
128+
return false;
129+
};
202130
rasterizer->Draw(pipeline, no_discard);
203131
latch.Signal();
204132
});
205133
latch.Wait();
206134
}
207-
208-
TEST(
209-
RasterizerTest,
210-
drawWithExternalViewEmbedderAndThreadsMerged_ExternalViewEmbedderSubmitFrameCalled) {
211-
std::string test_name =
212-
::testing::UnitTest::GetInstance()->current_test_info()->name();
213-
ThreadHost thread_host("io.flutter.test." + test_name + ".",
214-
ThreadHost::Type::Platform | ThreadHost::Type::GPU |
215-
ThreadHost::Type::IO | ThreadHost::Type::UI);
216-
fml::MessageLoop::EnsureInitializedForCurrentThread();
217-
TaskRunners task_runners("test",
218-
fml::MessageLoop::GetCurrent().GetTaskRunner(),
219-
fml::MessageLoop::GetCurrent().GetTaskRunner(),
220-
thread_host.ui_thread->GetTaskRunner(),
221-
thread_host.io_thread->GetTaskRunner());
222-
223-
MockDelegate delegate;
224-
EXPECT_CALL(delegate, GetTaskRunners())
225-
.WillRepeatedly(ReturnRef(task_runners));
226-
EXPECT_CALL(delegate, OnFrameRasterized(_));
227-
228-
auto rasterizer = std::make_unique<Rasterizer>(delegate);
229-
auto surface = std::make_unique<MockSurface>();
230-
231-
std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
232-
std::make_shared<MockExternalViewEmbedder>();
233-
rasterizer->SetExternalViewEmbedder(external_view_embedder);
234-
235-
auto surface_frame = std::make_unique<SurfaceFrame>(
236-
/*surface=*/nullptr, /*supports_readback=*/true,
237-
/*submit_callback=*/[](const SurfaceFrame&, SkCanvas*) { return true; });
238-
EXPECT_CALL(*surface, AcquireFrame(SkISize()))
239-
.WillOnce(Return(ByMove(std::move(surface_frame))));
240-
EXPECT_CALL(*external_view_embedder, SupportsDynamicThreadMerging)
241-
.WillRepeatedly(Return(true));
242-
243-
EXPECT_CALL(*external_view_embedder,
244-
BeginFrame(/*frame_size=*/SkISize(), /*context=*/nullptr,
245-
/*device_pixel_ratio=*/2.0,
246-
/*raster_thread_merger=*/_))
247-
.Times(1);
248-
EXPECT_CALL(*external_view_embedder, SubmitFrame).Times(1);
249-
EXPECT_CALL(*external_view_embedder, EndFrame(/*should_resubmit_frame=*/false,
250-
/*raster_thread_merger=*/_))
251-
.Times(1);
252-
253-
rasterizer->Setup(std::move(surface));
254-
255-
auto pipeline = fml::AdoptRef(new Pipeline<LayerTree>(/*depth=*/10));
256-
auto layer_tree = std::make_unique<LayerTree>(/*frame_size=*/SkISize(),
257-
/*device_pixel_ratio=*/2.0f);
258-
bool result = pipeline->Produce().Complete(std::move(layer_tree));
259-
EXPECT_TRUE(result);
260-
auto no_discard = [](LayerTree&) { return false; };
261-
rasterizer->Draw(pipeline, no_discard);
262-
}
263135
} // namespace flutter

shell/common/shell.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -547,10 +547,6 @@ bool Shell::Setup(std::unique_ptr<PlatformView> platform_view,
547547
rasterizer_ = std::move(rasterizer);
548548
io_manager_ = std::move(io_manager);
549549

550-
// Set the external view embedder for the rasterizer.
551-
auto view_embedder = platform_view_->CreateExternalViewEmbedder();
552-
rasterizer_->SetExternalViewEmbedder(view_embedder);
553-
554550
// The weak ptr must be generated in the platform thread which owns the unique
555551
// ptr.
556552
weak_engine_ = engine_->GetWeakPtr();

0 commit comments

Comments
 (0)