diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 2553764df42c2638bf193da49a99488e0c8f6a94..db2650aba010a26dcb13c7d2600f45fe42039e6f 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1003,6 +1003,8 @@ FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_texture_gl.h FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_texture_gl.mm FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_texture_metal.h FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_texture_metal.mm +FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_view_embedder.h +FILE: ../../../flutter/shell/platform/darwin/ios/ios_external_view_embedder.mm FILE: ../../../flutter/shell/platform/darwin/ios/ios_render_target_gl.h FILE: ../../../flutter/shell/platform/darwin/ios/ios_render_target_gl.mm FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface.h diff --git a/shell/platform/darwin/ios/BUILD.gn b/shell/platform/darwin/ios/BUILD.gn index fb0a845654d96c219c7d3457d8c87e3a69761101..793c97be93701b03bcd5634a5cebe89559f398f7 100644 --- a/shell/platform/darwin/ios/BUILD.gn +++ b/shell/platform/darwin/ios/BUILD.gn @@ -93,6 +93,8 @@ source_set("flutter_framework_source") { "ios_context_software.mm", "ios_external_texture_gl.h", "ios_external_texture_gl.mm", + "ios_external_view_embedder.h", + "ios_external_view_embedder.mm", "ios_render_target_gl.h", "ios_render_target_gl.mm", "ios_surface.h", diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.h b/shell/platform/darwin/ios/ios_external_view_embedder.h new file mode 100644 index 0000000000000000000000000000000000000000..e717c2ef2a1673173db27ca395b735fd262ff5e7 --- /dev/null +++ b/shell/platform/darwin/ios/ios_external_view_embedder.h @@ -0,0 +1,71 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS_EXTERNAL_VIEW_EMBEDDER_H_ +#define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS_EXTERNAL_VIEW_EMBEDDER_H_ + +#include "flutter/flow/embedded_views.h" +#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h" + +namespace flutter { + +class IOSExternalViewEmbedder : public ExternalViewEmbedder { + public: + IOSExternalViewEmbedder( + FlutterPlatformViewsController* platform_views_controller, + std::shared_ptr context); + + // |ExternalViewEmbedder| + virtual ~IOSExternalViewEmbedder() override; + + private: + FlutterPlatformViewsController* platform_views_controller_; + std::shared_ptr ios_context_; + + // |ExternalViewEmbedder| + SkCanvas* GetRootCanvas() override; + + // |ExternalViewEmbedder| + void CancelFrame() override; + + // |ExternalViewEmbedder| + void BeginFrame( + SkISize frame_size, + GrDirectContext* context, + double device_pixel_ratio, + fml::RefPtr raster_thread_merger) override; + + // |ExternalViewEmbedder| + void PrerollCompositeEmbeddedView( + int view_id, + std::unique_ptr params) override; + + // |ExternalViewEmbedder| + PostPrerollResult PostPrerollAction( + fml::RefPtr raster_thread_merger) override; + + // |ExternalViewEmbedder| + std::vector GetCurrentCanvases() override; + + // |ExternalViewEmbedder| + SkCanvas* CompositeEmbeddedView(int view_id) override; + + // |ExternalViewEmbedder| + void SubmitFrame(GrDirectContext* context, + std::unique_ptr frame) override; + + // |ExternalViewEmbedder| + void EndFrame( + bool should_resubmit_frame, + fml::RefPtr raster_thread_merger) override; + + // |ExternalViewEmbedder| + bool SupportsDynamicThreadMerging() override; + + FML_DISALLOW_COPY_AND_ASSIGN(IOSExternalViewEmbedder); +}; + +} // namespace flutter + +#endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS_EXTERNAL_VIEW_EMBEDDER_H_ diff --git a/shell/platform/darwin/ios/ios_external_view_embedder.mm b/shell/platform/darwin/ios/ios_external_view_embedder.mm new file mode 100644 index 0000000000000000000000000000000000000000..8939b49116cbd6f8c289fbb3d25c162dd94c222f --- /dev/null +++ b/shell/platform/darwin/ios/ios_external_view_embedder.mm @@ -0,0 +1,96 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "flutter/shell/platform/darwin/ios/ios_external_view_embedder.h" + +namespace flutter { + +IOSExternalViewEmbedder::IOSExternalViewEmbedder( + FlutterPlatformViewsController* platform_views_controller, + std::shared_ptr context) + : platform_views_controller_(platform_views_controller), ios_context_(context) { + FML_CHECK(ios_context_); +} + +IOSExternalViewEmbedder::~IOSExternalViewEmbedder() = default; + +// |ExternalViewEmbedder| +SkCanvas* IOSExternalViewEmbedder::GetRootCanvas() { + // On iOS, the root surface is created from the on-screen render target. Only the surfaces for the + // various overlays are controlled by this class. + return nullptr; +} + +// |ExternalViewEmbedder| +void IOSExternalViewEmbedder::CancelFrame() { + TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CancelFrame"); + FML_CHECK(platform_views_controller_); + platform_views_controller_->CancelFrame(); +} + +// |ExternalViewEmbedder| +void IOSExternalViewEmbedder::BeginFrame( + SkISize frame_size, + GrDirectContext* context, + double device_pixel_ratio, + fml::RefPtr raster_thread_merger) { + TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::BeginFrame"); + FML_CHECK(platform_views_controller_); + platform_views_controller_->SetFrameSize(frame_size); +} + +// |ExternalViewEmbedder| +void IOSExternalViewEmbedder::PrerollCompositeEmbeddedView( + int view_id, + std::unique_ptr params) { + TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::PrerollCompositeEmbeddedView"); + FML_CHECK(platform_views_controller_); + platform_views_controller_->PrerollCompositeEmbeddedView(view_id, std::move(params)); +} + +// |ExternalViewEmbedder| +PostPrerollResult IOSExternalViewEmbedder::PostPrerollAction( + fml::RefPtr raster_thread_merger) { + TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::PostPrerollAction"); + FML_CHECK(platform_views_controller_); + PostPrerollResult result = platform_views_controller_->PostPrerollAction(raster_thread_merger); + return result; +} + +// |ExternalViewEmbedder| +std::vector IOSExternalViewEmbedder::GetCurrentCanvases() { + FML_CHECK(platform_views_controller_); + return platform_views_controller_->GetCurrentCanvases(); +} + +// |ExternalViewEmbedder| +SkCanvas* IOSExternalViewEmbedder::CompositeEmbeddedView(int view_id) { + TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CompositeEmbeddedView"); + FML_CHECK(platform_views_controller_); + return platform_views_controller_->CompositeEmbeddedView(view_id); +} + +// |ExternalViewEmbedder| +void IOSExternalViewEmbedder::SubmitFrame(GrDirectContext* context, + std::unique_ptr frame) { + TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::SubmitFrame"); + FML_CHECK(platform_views_controller_); + platform_views_controller_->SubmitFrame(std::move(context), ios_context_, std::move(frame)); + TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::DidSubmitFrame"); +} + +// |ExternalViewEmbedder| +void IOSExternalViewEmbedder::EndFrame(bool should_resubmit_frame, + fml::RefPtr raster_thread_merger) { + TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::EndFrame"); + FML_CHECK(platform_views_controller_); + return platform_views_controller_->EndFrame(should_resubmit_frame, raster_thread_merger); +} + +// |ExternalViewEmbedder| +bool IOSExternalViewEmbedder::SupportsDynamicThreadMerging() { + return true; +} + +} // namespace flutter diff --git a/shell/platform/darwin/ios/ios_surface.h b/shell/platform/darwin/ios/ios_surface.h index a01f9f15caeeddef5afebf393f5cbbeb91026276..8935b7537bdaefbb43836f161d8f6ff5914c2072 100644 --- a/shell/platform/darwin/ios/ios_surface.h +++ b/shell/platform/darwin/ios/ios_surface.h @@ -6,6 +6,7 @@ #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS_SURFACE_H_ #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h" +#import "flutter/shell/platform/darwin/ios/ios_external_view_embedder.h" #include @@ -22,18 +23,19 @@ namespace flutter { // mechanism which is still in a release preview. bool IsIosEmbeddedViewsPreviewEnabled(); -class IOSSurface : public ExternalViewEmbedder { +class IOSSurface { public: static std::unique_ptr Create( std::shared_ptr context, fml::scoped_nsobject layer, FlutterPlatformViewsController* platform_views_controller); - // |ExternalViewEmbedder| - virtual ~IOSSurface(); - std::shared_ptr GetContext() const; + std::shared_ptr GetSurfaceExternalViewEmbedder() const; + + virtual ~IOSSurface(); + virtual bool IsValid() const = 0; virtual void UpdateStorageSizeIfNecessary() = 0; @@ -51,45 +53,8 @@ class IOSSurface : public ExternalViewEmbedder { private: std::shared_ptr ios_context_; - FlutterPlatformViewsController* platform_views_controller_; - - // |ExternalViewEmbedder| - SkCanvas* GetRootCanvas() override; - - // |ExternalViewEmbedder| - void CancelFrame() override; - - // |ExternalViewEmbedder| - void BeginFrame(SkISize frame_size, - GrDirectContext* context, - double device_pixel_ratio, - fml::RefPtr raster_thread_merger) override; + std::shared_ptr external_view_embedder_; - // |ExternalViewEmbedder| - void PrerollCompositeEmbeddedView(int view_id, - std::unique_ptr params) override; - - // |ExternalViewEmbedder| - PostPrerollResult PostPrerollAction( - fml::RefPtr raster_thread_merger) override; - - // |ExternalViewEmbedder| - std::vector GetCurrentCanvases() override; - - // |ExternalViewEmbedder| - SkCanvas* CompositeEmbeddedView(int view_id) override; - - // |ExternalViewEmbedder| - void SubmitFrame(GrDirectContext* context, std::unique_ptr frame) override; - - // |ExternalViewEmbedder| - void EndFrame(bool should_resubmit_frame, - fml::RefPtr raster_thread_merger) override; - - // |ExternalViewEmbedder| - bool SupportsDynamicThreadMerging() override; - - public: FML_DISALLOW_COPY_AND_ASSIGN(IOSSurface); }; diff --git a/shell/platform/darwin/ios/ios_surface.mm b/shell/platform/darwin/ios/ios_surface.mm index 331cbeb8ac77e1a958ad7aab248da5d39d79f887..49b418a94390d44992b4fdf014c86d6a45fdf7cb 100644 --- a/shell/platform/darwin/ios/ios_surface.mm +++ b/shell/platform/darwin/ios/ios_surface.mm @@ -53,8 +53,10 @@ std::unique_ptr IOSSurface::Create( IOSSurface::IOSSurface(std::shared_ptr ios_context, FlutterPlatformViewsController* platform_views_controller) - : ios_context_(std::move(ios_context)), platform_views_controller_(platform_views_controller) { + : ios_context_(std::move(ios_context)) { FML_DCHECK(ios_context_); + external_view_embedder_ = + std::make_shared(platform_views_controller, ios_context_); } IOSSurface::~IOSSurface() = default; @@ -63,80 +65,8 @@ std::shared_ptr IOSSurface::GetContext() const { return ios_context_; } -// |ExternalViewEmbedder| -SkCanvas* IOSSurface::GetRootCanvas() { - // On iOS, the root surface is created from the on-screen render target. Only the surfaces for the - // various overlays are controlled by this class. - return nullptr; -} - -// |ExternalViewEmbedder| -void IOSSurface::CancelFrame() { - TRACE_EVENT0("flutter", "IOSSurface::CancelFrame"); - FML_CHECK(platform_views_controller_ != nullptr); - platform_views_controller_->CancelFrame(); -} - -// |ExternalViewEmbedder| -void IOSSurface::BeginFrame(SkISize frame_size, - GrDirectContext* context, - double device_pixel_ratio, - fml::RefPtr raster_thread_merger) { - TRACE_EVENT0("flutter", "IOSSurface::BeginFrame"); - FML_CHECK(platform_views_controller_ != nullptr); - platform_views_controller_->SetFrameSize(frame_size); -} - -// |ExternalViewEmbedder| -void IOSSurface::PrerollCompositeEmbeddedView(int view_id, - std::unique_ptr params) { - TRACE_EVENT0("flutter", "IOSSurface::PrerollCompositeEmbeddedView"); - - FML_CHECK(platform_views_controller_ != nullptr); - platform_views_controller_->PrerollCompositeEmbeddedView(view_id, std::move(params)); -} - -// |ExternalViewEmbedder| -PostPrerollResult IOSSurface::PostPrerollAction( - fml::RefPtr raster_thread_merger) { - TRACE_EVENT0("flutter", "IOSSurface::PostPrerollAction"); - FML_CHECK(platform_views_controller_ != nullptr); - PostPrerollResult result = platform_views_controller_->PostPrerollAction(raster_thread_merger); - return result; -} - -// |ExternalViewEmbedder| -std::vector IOSSurface::GetCurrentCanvases() { - FML_CHECK(platform_views_controller_ != nullptr); - return platform_views_controller_->GetCurrentCanvases(); -} - -// |ExternalViewEmbedder| -SkCanvas* IOSSurface::CompositeEmbeddedView(int view_id) { - TRACE_EVENT0("flutter", "IOSSurface::CompositeEmbeddedView"); - FML_CHECK(platform_views_controller_ != nullptr); - return platform_views_controller_->CompositeEmbeddedView(view_id); -} - -// |ExternalViewEmbedder| -void IOSSurface::SubmitFrame(GrDirectContext* context, std::unique_ptr frame) { - TRACE_EVENT0("flutter", "IOSSurface::SubmitFrame"); - FML_CHECK(platform_views_controller_ != nullptr); - platform_views_controller_->SubmitFrame(std::move(context), ios_context_, std::move(frame)); - TRACE_EVENT0("flutter", "IOSSurface::DidSubmitFrame"); -} - -// |ExternalViewEmbedder| -void IOSSurface::EndFrame(bool should_resubmit_frame, - fml::RefPtr raster_thread_merger) { - TRACE_EVENT0("flutter", "IOSSurface::EndFrame"); - FML_CHECK(platform_views_controller_ != nullptr); - return platform_views_controller_->EndFrame(should_resubmit_frame, raster_thread_merger); -} - -// |ExternalViewEmbedder| -bool IOSSurface::SupportsDynamicThreadMerging() { - return true; +std::shared_ptr IOSSurface::GetSurfaceExternalViewEmbedder() const { + return external_view_embedder_; } } // namespace flutter diff --git a/shell/platform/darwin/ios/ios_surface_gl.mm b/shell/platform/darwin/ios/ios_surface_gl.mm index 3565365f73e7ac27eb53c680fdc7c3728d3937c9..e114d5efee4a8681a5f733570018698fb3ac1e3d 100644 --- a/shell/platform/darwin/ios/ios_surface_gl.mm +++ b/shell/platform/darwin/ios/ios_surface_gl.mm @@ -84,7 +84,7 @@ bool IOSSurfaceGL::GLContextPresent(uint32_t fbo_id) { // |GPUSurfaceGLDelegate| ExternalViewEmbedder* IOSSurfaceGL::GetExternalViewEmbedder() { - return this; + return GetSurfaceExternalViewEmbedder().get(); } } // namespace flutter diff --git a/shell/platform/darwin/ios/ios_surface_metal.mm b/shell/platform/darwin/ios/ios_surface_metal.mm index e7e4d12fcbfc8a2e5d337085c1b13000d0d78667..ee240bd96a29bcd699723b9f5f123ab4915b73b2 100644 --- a/shell/platform/darwin/ios/ios_surface_metal.mm +++ b/shell/platform/darwin/ios/ios_surface_metal.mm @@ -55,7 +55,7 @@ std::unique_ptr IOSSurfaceMetal::CreateGPUSurface(GrDirectContext* /* u // |GPUSurfaceDelegate| ExternalViewEmbedder* IOSSurfaceMetal::GetExternalViewEmbedder() { - return this; + return GetSurfaceExternalViewEmbedder().get(); } } // namespace flutter diff --git a/shell/platform/darwin/ios/ios_surface_software.mm b/shell/platform/darwin/ios/ios_surface_software.mm index 1363bfea99fc26dedd3651c1c4a2f572118ef608..7b5c2ee8ad723a8005f69f27e783356c0cb25e7f 100644 --- a/shell/platform/darwin/ios/ios_surface_software.mm +++ b/shell/platform/darwin/ios/ios_surface_software.mm @@ -124,7 +124,7 @@ bool IOSSurfaceSoftware::PresentBackingStore(sk_sp backing_store) { // |GPUSurfaceSoftwareDelegate| ExternalViewEmbedder* IOSSurfaceSoftware::GetExternalViewEmbedder() { - return this; + return GetSurfaceExternalViewEmbedder().get(); } } // namespace flutter