From 6f0edb60a402796500f05471775d9aa229cc374c Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Fri, 30 Oct 2020 09:34:09 -0700 Subject: [PATCH] Rasterizer is initialized with an external view embedder This allows us to not rely on surface methods for getting the external view embedder. --- shell/common/platform_view.h | 4 +-- shell/common/rasterizer.cc | 43 +++++++++++++++------------- shell/common/rasterizer.h | 12 ++++++++ shell/common/rasterizer_unittests.cc | 10 +++---- shell/common/shell.cc | 4 +++ 5 files changed, 46 insertions(+), 27 deletions(-) diff --git a/shell/common/platform_view.h b/shell/common/platform_view.h index a67b4b793cce1..6e12917b1849b 100644 --- a/shell/common/platform_view.h +++ b/shell/common/platform_view.h @@ -582,6 +582,8 @@ class PlatformView { ComputePlatformResolvedLocales( const std::vector& supported_locale_data); + virtual std::shared_ptr CreateExternalViewEmbedder(); + protected: PlatformView::Delegate& delegate_; const TaskRunners task_runners_; @@ -594,8 +596,6 @@ class PlatformView { // GPU task runner. virtual std::unique_ptr CreateRenderingSurface(); - virtual std::shared_ptr CreateExternalViewEmbedder(); - private: FML_DISALLOW_COPY_AND_ASSIGN(PlatformView); }; diff --git a/shell/common/rasterizer.cc b/shell/common/rasterizer.cc index 6679943bb2b2d..0b151d2626a6b 100644 --- a/shell/common/rasterizer.cc +++ b/shell/common/rasterizer.cc @@ -76,8 +76,8 @@ void Rasterizer::Setup(std::unique_ptr surface) { user_override_resource_cache_bytes_); } compositor_context_->OnGrContextCreated(); - if (surface_->GetExternalViewEmbedder() && - surface_->GetExternalViewEmbedder()->SupportsDynamicThreadMerging() && + if (external_view_embedder_ && + external_view_embedder_->SupportsDynamicThreadMerging() && !raster_thread_merger_) { const auto platform_id = delegate_.GetTaskRunners().GetPlatformTaskRunner()->GetTaskQueueId(); @@ -192,9 +192,9 @@ void Rasterizer::Draw(fml::RefPtr> pipeline, // Merging the thread as we know the next `Draw` should be run on the platform // thread. - if (surface_ != nullptr && surface_->GetExternalViewEmbedder() != nullptr) { - surface_->GetExternalViewEmbedder()->EndFrame(should_resubmit_frame, - raster_thread_merger_); + if (external_view_embedder_) { + external_view_embedder_->EndFrame(should_resubmit_frame, + raster_thread_merger_); } // Consume as many pipeline items as possible. But yield the event loop @@ -424,14 +424,12 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) { // for instrumentation. compositor_context_->ui_time().SetLapTime(layer_tree.build_time()); - auto* external_view_embedder = surface_->GetExternalViewEmbedder(); - SkCanvas* embedder_root_canvas = nullptr; - if (external_view_embedder != nullptr) { - external_view_embedder->BeginFrame( + if (external_view_embedder_) { + external_view_embedder_->BeginFrame( layer_tree.frame_size(), surface_->GetContext(), layer_tree.device_pixel_ratio(), raster_thread_merger_); - embedder_root_canvas = external_view_embedder->GetRootCanvas(); + embedder_root_canvas = external_view_embedder_->GetRootCanvas(); } // On Android, the external view embedder deletes surfaces in `BeginFrame`. @@ -454,13 +452,13 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) { embedder_root_canvas ? embedder_root_canvas : frame->SkiaCanvas(); auto compositor_frame = compositor_context_->AcquireFrame( - surface_->GetContext(), // skia GrContext - root_surface_canvas, // root surface canvas - external_view_embedder, // external view embedder - root_surface_transformation, // root surface transformation - true, // instrumentation enabled - frame->supports_readback(), // surface supports pixel reads - raster_thread_merger_ // thread merger + surface_->GetContext(), // skia GrContext + root_surface_canvas, // root surface canvas + external_view_embedder_.get(), // external view embedder + root_surface_transformation, // root surface transformation + true, // instrumentation enabled + frame->supports_readback(), // surface supports pixel reads + raster_thread_merger_ // thread merger ); if (compositor_frame) { @@ -469,10 +467,10 @@ RasterStatus Rasterizer::DrawToSurface(flutter::LayerTree& layer_tree) { raster_status == RasterStatus::kSkipAndRetry) { return raster_status; } - if (external_view_embedder != nullptr) { + if (external_view_embedder_) { FML_DCHECK(!frame->IsSubmitted()); - external_view_embedder->SubmitFrame(surface_->GetContext(), - std::move(frame)); + external_view_embedder_->SubmitFrame(surface_->GetContext(), + std::move(frame)); } else { frame->Submit(); } @@ -653,6 +651,11 @@ void Rasterizer::SetNextFrameCallback(const fml::closure& callback) { next_frame_callback_ = callback; } +void Rasterizer::SetExternalViewEmbedder( + const std::shared_ptr& view_embedder) { + external_view_embedder_ = view_embedder; +} + void Rasterizer::FireNextFrameCallbackIfPresent() { if (!next_frame_callback_) { return; diff --git a/shell/common/rasterizer.h b/shell/common/rasterizer.h index b658f18e0674c..0637ad37ca955 100644 --- a/shell/common/rasterizer.h +++ b/shell/common/rasterizer.h @@ -8,6 +8,7 @@ #include #include +#include "flow/embedded_views.h" #include "flutter/common/settings.h" #include "flutter/common/task_runners.h" #include "flutter/flow/compositor_context.h" @@ -349,6 +350,16 @@ class Rasterizer final : public SnapshotDelegate { /// void SetNextFrameCallback(const fml::closure& callback); + //---------------------------------------------------------------------------- + /// @brief Set the External View Embedder. This is done on shell + /// initialization. This is non-null on platforms that support + /// embedding externally composited views. + /// + /// @param[in] view_embedder The external view embedder object. + /// + void SetExternalViewEmbedder( + const std::shared_ptr& view_embedder); + //---------------------------------------------------------------------------- /// @brief Returns a pointer to the compositor context used by this /// rasterizer. This pointer will never be `nullptr`. @@ -437,6 +448,7 @@ class Rasterizer final : public SnapshotDelegate { std::optional max_cache_bytes_; fml::RefPtr raster_thread_merger_; fml::TaskRunnerAffineWeakPtrFactory weak_factory_; + std::shared_ptr external_view_embedder_; // |SnapshotDelegate| sk_sp MakeRasterSnapshot(sk_sp picture, diff --git a/shell/common/rasterizer_unittests.cc b/shell/common/rasterizer_unittests.cc index 47a1f700fc843..e22aff87e7459 100644 --- a/shell/common/rasterizer_unittests.cc +++ b/shell/common/rasterizer_unittests.cc @@ -108,13 +108,13 @@ TEST(RasterizerTest, drawWithExternalViewEmbedder) { EXPECT_CALL(delegate, OnFrameRasterized(_)); auto rasterizer = std::make_unique(delegate); auto surface = std::make_unique(); - MockExternalViewEmbedder external_view_embedder; - EXPECT_CALL(*surface, GetExternalViewEmbedder()) - .WillRepeatedly(Return(&external_view_embedder)); - EXPECT_CALL(external_view_embedder, + std::shared_ptr external_view_embedder = + std::make_shared(); + rasterizer->SetExternalViewEmbedder(external_view_embedder); + EXPECT_CALL(*external_view_embedder, BeginFrame(SkISize(), nullptr, 2.0, fml::RefPtr(nullptr))); - EXPECT_CALL(external_view_embedder, + EXPECT_CALL(*external_view_embedder, EndFrame(false, fml::RefPtr(nullptr))); rasterizer->Setup(std::move(surface)); fml::AutoResetWaitableEvent latch; diff --git a/shell/common/shell.cc b/shell/common/shell.cc index 0f470cff37c6f..6fd7f83f26314 100644 --- a/shell/common/shell.cc +++ b/shell/common/shell.cc @@ -547,6 +547,10 @@ bool Shell::Setup(std::unique_ptr platform_view, rasterizer_ = std::move(rasterizer); io_manager_ = std::move(io_manager); + // Set the external view embedder for the rasterizer. + auto view_embedder = platform_view_->CreateExternalViewEmbedder(); + rasterizer_->SetExternalViewEmbedder(view_embedder); + // The weak ptr must be generated in the platform thread which owns the unique // ptr. weak_engine_ = engine_->GetWeakPtr();