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

Commit 6f0edb6

Browse files
committed
Rasterizer is initialized with an external view embedder
This allows us to not rely on surface methods for getting the external view embedder.
1 parent 6e95e00 commit 6f0edb6

File tree

5 files changed

+46
-27
lines changed

5 files changed

+46
-27
lines changed

shell/common/platform_view.h

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

585+
virtual std::shared_ptr<ExternalViewEmbedder> CreateExternalViewEmbedder();
586+
585587
protected:
586588
PlatformView::Delegate& delegate_;
587589
const TaskRunners task_runners_;
@@ -594,8 +596,6 @@ class PlatformView {
594596
// GPU task runner.
595597
virtual std::unique_ptr<Surface> CreateRenderingSurface();
596598

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

shell/common/rasterizer.cc

Lines changed: 23 additions & 20 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 (surface_->GetExternalViewEmbedder() &&
80-
surface_->GetExternalViewEmbedder()->SupportsDynamicThreadMerging() &&
79+
if (external_view_embedder_ &&
80+
external_view_embedder_->SupportsDynamicThreadMerging() &&
8181
!raster_thread_merger_) {
8282
const auto platform_id =
8383
delegate_.GetTaskRunners().GetPlatformTaskRunner()->GetTaskQueueId();
@@ -192,9 +192,9 @@ void Rasterizer::Draw(fml::RefPtr<Pipeline<flutter::LayerTree>> pipeline,
192192

193193
// Merging the thread as we know the next `Draw` should be run on the platform
194194
// thread.
195-
if (surface_ != nullptr && surface_->GetExternalViewEmbedder() != nullptr) {
196-
surface_->GetExternalViewEmbedder()->EndFrame(should_resubmit_frame,
197-
raster_thread_merger_);
195+
if (external_view_embedder_) {
196+
external_view_embedder_->EndFrame(should_resubmit_frame,
197+
raster_thread_merger_);
198198
}
199199

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

427-
auto* external_view_embedder = surface_->GetExternalViewEmbedder();
428-
429427
SkCanvas* embedder_root_canvas = nullptr;
430-
if (external_view_embedder != nullptr) {
431-
external_view_embedder->BeginFrame(
428+
if (external_view_embedder_) {
429+
external_view_embedder_->BeginFrame(
432430
layer_tree.frame_size(), surface_->GetContext(),
433431
layer_tree.device_pixel_ratio(), raster_thread_merger_);
434-
embedder_root_canvas = external_view_embedder->GetRootCanvas();
432+
embedder_root_canvas = external_view_embedder_->GetRootCanvas();
435433
}
436434

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

456454
auto compositor_frame = compositor_context_->AcquireFrame(
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
455+
surface_->GetContext(), // skia GrContext
456+
root_surface_canvas, // root surface canvas
457+
external_view_embedder_.get(), // external view embedder
458+
root_surface_transformation, // root surface transformation
459+
true, // instrumentation enabled
460+
frame->supports_readback(), // surface supports pixel reads
461+
raster_thread_merger_ // thread merger
464462
);
465463

466464
if (compositor_frame) {
@@ -469,10 +467,10 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) {
469467
raster_status == RasterStatus::kSkipAndRetry) {
470468
return raster_status;
471469
}
472-
if (external_view_embedder != nullptr) {
470+
if (external_view_embedder_) {
473471
FML_DCHECK(!frame->IsSubmitted());
474-
external_view_embedder->SubmitFrame(surface_->GetContext(),
475-
std::move(frame));
472+
external_view_embedder_->SubmitFrame(surface_->GetContext(),
473+
std::move(frame));
476474
} else {
477475
frame->Submit();
478476
}
@@ -653,6 +651,11 @@ void Rasterizer::SetNextFrameCallback(const fml::closure& callback) {
653651
next_frame_callback_ = callback;
654652
}
655653

654+
void Rasterizer::SetExternalViewEmbedder(
655+
const std::shared_ptr<ExternalViewEmbedder>& view_embedder) {
656+
external_view_embedder_ = view_embedder;
657+
}
658+
656659
void Rasterizer::FireNextFrameCallbackIfPresent() {
657660
if (!next_frame_callback_) {
658661
return;

shell/common/rasterizer.h

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

11+
#include "flow/embedded_views.h"
1112
#include "flutter/common/settings.h"
1213
#include "flutter/common/task_runners.h"
1314
#include "flutter/flow/compositor_context.h"
@@ -349,6 +350,16 @@ class Rasterizer final : public SnapshotDelegate {
349350
///
350351
void SetNextFrameCallback(const fml::closure& callback);
351352

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+
352363
//----------------------------------------------------------------------------
353364
/// @brief Returns a pointer to the compositor context used by this
354365
/// rasterizer. This pointer will never be `nullptr`.
@@ -437,6 +448,7 @@ class Rasterizer final : public SnapshotDelegate {
437448
std::optional<size_t> max_cache_bytes_;
438449
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger_;
439450
fml::TaskRunnerAffineWeakPtrFactory<Rasterizer> weak_factory_;
451+
std::shared_ptr<ExternalViewEmbedder> external_view_embedder_;
440452

441453
// |SnapshotDelegate|
442454
sk_sp<SkImage> MakeRasterSnapshot(sk_sp<SkPicture> picture,

shell/common/rasterizer_unittests.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,13 @@ TEST(RasterizerTest, drawWithExternalViewEmbedder) {
108108
EXPECT_CALL(delegate, OnFrameRasterized(_));
109109
auto rasterizer = std::make_unique<Rasterizer>(delegate);
110110
auto surface = std::make_unique<MockSurface>();
111-
MockExternalViewEmbedder external_view_embedder;
112-
EXPECT_CALL(*surface, GetExternalViewEmbedder())
113-
.WillRepeatedly(Return(&external_view_embedder));
114-
EXPECT_CALL(external_view_embedder,
111+
std::shared_ptr<MockExternalViewEmbedder> external_view_embedder =
112+
std::make_shared<MockExternalViewEmbedder>();
113+
rasterizer->SetExternalViewEmbedder(external_view_embedder);
114+
EXPECT_CALL(*external_view_embedder,
115115
BeginFrame(SkISize(), nullptr, 2.0,
116116
fml::RefPtr<fml::RasterThreadMerger>(nullptr)));
117-
EXPECT_CALL(external_view_embedder,
117+
EXPECT_CALL(*external_view_embedder,
118118
EndFrame(false, fml::RefPtr<fml::RasterThreadMerger>(nullptr)));
119119
rasterizer->Setup(std::move(surface));
120120
fml::AutoResetWaitableEvent latch;

shell/common/shell.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,10 @@ 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+
550554
// The weak ptr must be generated in the platform thread which owns the unique
551555
// ptr.
552556
weak_engine_ = engine_->GetWeakPtr();

0 commit comments

Comments
 (0)