未验证 提交 6a3b5feb 编写于 作者: K Kaushik Iska 提交者: GitHub

[ios] Refactor IOSSurface factory and unify surface creation (#21877)

上级 62459b3b
......@@ -1010,6 +1010,8 @@ 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
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface.mm
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_factory.h
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_factory.mm
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_gl.h
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_gl.mm
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_metal.h
......
......@@ -99,6 +99,8 @@ source_set("flutter_framework_source") {
"ios_render_target_gl.mm",
"ios_surface.h",
"ios_surface.mm",
"ios_surface_factory.h",
"ios_surface_factory.mm",
"ios_surface_gl.h",
"ios_surface_gl.mm",
"ios_surface_software.h",
......
......@@ -28,7 +28,9 @@
#import "flutter/shell/platform/darwin/ios/framework/Source/platform_message_response_darwin.h"
#import "flutter/shell/platform/darwin/ios/framework/Source/profiler_metrics_ios.h"
#import "flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h"
#import "flutter/shell/platform/darwin/ios/ios_context.h"
#import "flutter/shell/platform/darwin/ios/ios_surface.h"
#import "flutter/shell/platform/darwin/ios/ios_surface_factory.h"
#import "flutter/shell/platform/darwin/ios/platform_view_ios.h"
#import "flutter/shell/platform/darwin/ios/rendering_api_selection.h"
#include "flutter/shell/profiling/sampling_profiler.h"
......@@ -63,6 +65,7 @@ static constexpr int kNumProfilerSamplesPerSec = 5;
fml::WeakPtr<FlutterViewController> _viewController;
fml::scoped_nsobject<FlutterObservatoryPublisher> _publisher;
std::shared_ptr<flutter::IOSSurfaceFactory> _surfaceFactory;
std::unique_ptr<flutter::FlutterPlatformViewsController> _platformViewsController;
std::unique_ptr<flutter::ProfilerMetricsIOS> _profiler_metrics;
std::unique_ptr<flutter::SamplingProfiler> _profiler;
......@@ -127,7 +130,7 @@ static constexpr int kNumProfilerSamplesPerSec = 5;
_pluginPublications = [NSMutableDictionary new];
_registrars = [[NSMutableDictionary alloc] init];
_platformViewsController.reset(new flutter::FlutterPlatformViewsController());
[self ensurePlatformViewController];
_binaryMessenger = [[FlutterBinaryMessengerRelay alloc] initWithParent:self];
_connections.reset(new flutter::ConnectionCollection());
......@@ -161,6 +164,16 @@ static constexpr int kNumProfilerSamplesPerSec = 5;
return self;
}
- (void)ensurePlatformViewController {
if (!_platformViewsController) {
auto renderingApi = flutter::GetRenderingAPIForProcess(FlutterView.forceSoftwareRendering);
_surfaceFactory = flutter::IOSSurfaceFactory::Create(renderingApi);
auto pvc = new flutter::FlutterPlatformViewsController(_surfaceFactory);
_surfaceFactory->SetPlatformViewsController(pvc);
_platformViewsController.reset(pvc);
}
}
- (void)dealloc {
/// Notify plugins of dealloc. This should happen first in dealloc since the
/// plugins may be talking to things like the binaryMessenger.
......@@ -510,13 +523,13 @@ static constexpr int kNumProfilerSamplesPerSec = 5;
threadHostType};
// Lambda captures by pointers to ObjC objects are fine here because the
// create call is
// synchronous.
// create call is synchronous.
flutter::Shell::CreateCallback<flutter::PlatformView> on_create_platform_view =
[](flutter::Shell& shell) {
[self](flutter::Shell& shell) {
[self ensurePlatformViewController];
return std::make_unique<flutter::PlatformViewIOS>(
shell, flutter::GetRenderingAPIForProcess(FlutterView.forceSoftwareRendering),
shell.GetTaskRunners());
self->_surfaceFactory, shell.GetTaskRunners());
};
flutter::Shell::CreateCallback<flutter::Rasterizer> on_create_rasterizer =
......@@ -544,9 +557,6 @@ static constexpr int kNumProfilerSamplesPerSec = 5;
[self setupChannels];
[self onLocaleUpdated:nil];
[self initializeDisplays];
if (!_platformViewsController) {
_platformViewsController.reset(new flutter::FlutterPlatformViewsController());
}
_publisher.reset([[FlutterObservatoryPublisher alloc]
initWithEnableObservatoryPublication:settings.enable_observatory_publication]);
[self maybeSetupPlatformViewChannels];
......
......@@ -67,6 +67,7 @@ class MockDelegate : public PlatformView::Delegate {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id project = OCMClassMock([FlutterDartProject class]);
......
......@@ -35,8 +35,6 @@
- (instancetype)init NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithContentsScale:(CGFloat)contentsScale;
- (std::unique_ptr<flutter::IOSSurface>)createSurface:
(std::shared_ptr<flutter::IOSContext>)ios_context;
@end
......
......@@ -62,14 +62,6 @@
return [FlutterView layerClass];
}
- (std::unique_ptr<flutter::IOSSurface>)createSurface:
(std::shared_ptr<flutter::IOSContext>)ios_context {
return flutter::IOSSurface::Create(std::move(ios_context), // context
fml::scoped_nsobject<CALayer>{[self.layer retain]}, // layer
nullptr // platform views controller
);
}
// TODO(amirh): implement drawLayer to support snapshotting.
@end
......@@ -16,6 +16,7 @@
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterOverlayView.h"
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h"
#import "flutter/shell/platform/darwin/ios/ios_surface.h"
#import "flutter/shell/platform/darwin/ios/ios_surface_factory.h"
#import "flutter/shell/platform/darwin/ios/ios_surface_gl.h"
namespace flutter {
......@@ -32,8 +33,8 @@ std::shared_ptr<FlutterPlatformViewLayer> FlutterPlatformViewLayerPool::GetLayer
overlay_view.reset([[FlutterOverlayView alloc] init]);
overlay_view_wrapper.reset([[FlutterOverlayView alloc] init]);
std::unique_ptr<IOSSurface> ios_surface =
[overlay_view.get() createSurface:std::move(ios_context)];
auto ca_layer = fml::scoped_nsobject<CALayer>{[[overlay_view.get() layer] retain]};
std::unique_ptr<IOSSurface> ios_surface = ios_surface_factory_->CreateSurface(ca_layer);
std::unique_ptr<Surface> surface = ios_surface->CreateGPUSurface();
layer = std::make_shared<FlutterPlatformViewLayer>(
......@@ -44,8 +45,8 @@ std::shared_ptr<FlutterPlatformViewLayer> FlutterPlatformViewLayerPool::GetLayer
overlay_view.reset([[FlutterOverlayView alloc] initWithContentsScale:screenScale]);
overlay_view_wrapper.reset([[FlutterOverlayView alloc] initWithContentsScale:screenScale]);
std::unique_ptr<IOSSurface> ios_surface =
[overlay_view.get() createSurface:std::move(ios_context)];
auto ca_layer = fml::scoped_nsobject<CALayer>{[[overlay_view.get() layer] retain]};
std::unique_ptr<IOSSurface> ios_surface = ios_surface_factory_->CreateSurface(ca_layer);
std::unique_ptr<Surface> surface = ios_surface->CreateGPUSurface(gr_context);
layer = std::make_shared<FlutterPlatformViewLayer>(
......
......@@ -121,12 +121,16 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
/*raster=*/thread_task_runner,
/*ui=*/thread_task_runner,
/*io=*/thread_task_runner);
auto surface_factory = flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware);
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
/*ios_surface_factory=*/surface_factory,
/*task_runners=*/runners);
auto flutterPlatformViewsController = std::make_unique<flutter::FlutterPlatformViewsController>();
auto flutterPlatformViewsController =
std::make_unique<flutter::FlutterPlatformViewsController>(surface_factory);
surface_factory->SetPlatformViewsController(flutterPlatformViewsController.get());
FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
[[FlutterPlatformViewsTestMockFlutterPlatformFactory new] autorelease];
......@@ -175,12 +179,16 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
/*raster=*/thread_task_runner,
/*ui=*/thread_task_runner,
/*io=*/thread_task_runner);
auto surface_factory = flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware);
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
/*ios_surface_factory=*/surface_factory,
/*task_runners=*/runners);
auto flutterPlatformViewsController = std::make_unique<flutter::FlutterPlatformViewsController>();
auto flutterPlatformViewsController =
std::make_unique<flutter::FlutterPlatformViewsController>(surface_factory);
surface_factory->SetPlatformViewsController(flutterPlatformViewsController.get());
FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
[[FlutterPlatformViewsTestMockFlutterPlatformFactory new] autorelease];
......@@ -230,12 +238,16 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
/*raster=*/thread_task_runner,
/*ui=*/thread_task_runner,
/*io=*/thread_task_runner);
auto surface_factory = flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware);
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
/*ios_surface_factory=*/surface_factory,
/*task_runners=*/runners);
auto flutterPlatformViewsController = std::make_unique<flutter::FlutterPlatformViewsController>();
auto flutterPlatformViewsController =
std::make_unique<flutter::FlutterPlatformViewsController>(surface_factory);
surface_factory->SetPlatformViewsController(flutterPlatformViewsController.get());
FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
[[FlutterPlatformViewsTestMockFlutterPlatformFactory new] autorelease];
......@@ -301,12 +313,16 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
/*raster=*/thread_task_runner,
/*ui=*/thread_task_runner,
/*io=*/thread_task_runner);
auto surface_factory = flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware);
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
/*ios_surface_factory=*/surface_factory,
/*task_runners=*/runners);
auto flutterPlatformViewsController = std::make_unique<flutter::FlutterPlatformViewsController>();
auto flutterPlatformViewsController =
std::make_unique<flutter::FlutterPlatformViewsController>(surface_factory);
surface_factory->SetPlatformViewsController(flutterPlatformViewsController.get());
FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
[[FlutterPlatformViewsTestMockFlutterPlatformFactory new] autorelease];
......@@ -373,12 +389,16 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
/*raster=*/thread_task_runner,
/*ui=*/thread_task_runner,
/*io=*/thread_task_runner);
auto surface_factory = flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware);
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
/*ios_surface_factory=*/surface_factory,
/*task_runners=*/runners);
auto flutterPlatformViewsController = std::make_unique<flutter::FlutterPlatformViewsController>();
auto flutterPlatformViewsController =
std::make_unique<flutter::FlutterPlatformViewsController>(surface_factory);
surface_factory->SetPlatformViewsController(flutterPlatformViewsController.get());
FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
[[FlutterPlatformViewsTestMockFlutterPlatformFactory new] autorelease];
......@@ -445,12 +465,16 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
/*raster=*/thread_task_runner,
/*ui=*/thread_task_runner,
/*io=*/thread_task_runner);
auto surface_factory = flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware);
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
/*ios_surface_factory=*/surface_factory,
/*task_runners=*/runners);
auto flutterPlatformViewsController = std::make_unique<flutter::FlutterPlatformViewsController>();
auto flutterPlatformViewsController =
std::make_unique<flutter::FlutterPlatformViewsController>(surface_factory);
surface_factory->SetPlatformViewsController(flutterPlatformViewsController.get());
FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
[[FlutterPlatformViewsTestMockFlutterPlatformFactory new] autorelease];
......@@ -518,12 +542,16 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
/*raster=*/thread_task_runner,
/*ui=*/thread_task_runner,
/*io=*/thread_task_runner);
auto surface_factory = flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware);
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
/*ios_surface_factory=*/surface_factory,
/*task_runners=*/runners);
auto flutterPlatformViewsController = std::make_unique<flutter::FlutterPlatformViewsController>();
auto flutterPlatformViewsController =
std::make_unique<flutter::FlutterPlatformViewsController>(surface_factory);
surface_factory->SetPlatformViewsController(flutterPlatformViewsController.get());
FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
[[FlutterPlatformViewsTestMockFlutterPlatformFactory new] autorelease];
......
......@@ -61,6 +61,7 @@ void ResetAnchor(CALayer* layer);
class IOSContextGL;
class IOSSurface;
class IOSSurfaceFactory;
struct FlutterPlatformViewLayer {
FlutterPlatformViewLayer(fml::scoped_nsobject<UIView> overlay_view,
......@@ -87,7 +88,9 @@ struct FlutterPlatformViewLayer {
// This class isn't thread safe.
class FlutterPlatformViewLayerPool {
public:
FlutterPlatformViewLayerPool() = default;
FlutterPlatformViewLayerPool(std::shared_ptr<IOSSurfaceFactory> ios_surface_factory)
: ios_surface_factory_(ios_surface_factory) {}
~FlutterPlatformViewLayerPool() = default;
// Gets a layer from the pool if available, or allocates a new one.
......@@ -118,12 +121,14 @@ class FlutterPlatformViewLayerPool {
size_t available_layer_index_ = 0;
std::vector<std::shared_ptr<FlutterPlatformViewLayer>> layers_;
const std::shared_ptr<IOSSurfaceFactory> ios_surface_factory_;
FML_DISALLOW_COPY_AND_ASSIGN(FlutterPlatformViewLayerPool);
};
class FlutterPlatformViewsController {
public:
FlutterPlatformViewsController();
FlutterPlatformViewsController(std::shared_ptr<IOSSurfaceFactory> surface_factory);
~FlutterPlatformViewsController();
......
......@@ -23,8 +23,9 @@ FlutterPlatformViewLayer::FlutterPlatformViewLayer(
FlutterPlatformViewLayer::~FlutterPlatformViewLayer() = default;
FlutterPlatformViewsController::FlutterPlatformViewsController()
: layer_pool_(std::make_unique<FlutterPlatformViewLayerPool>()),
FlutterPlatformViewsController::FlutterPlatformViewsController(
std::shared_ptr<IOSSurfaceFactory> surface_factory)
: layer_pool_(std::make_unique<FlutterPlatformViewLayerPool>(surface_factory)),
weak_factory_(std::make_unique<fml::WeakPtrFactory<FlutterPlatformViewsController>>(this)){};
FlutterPlatformViewsController::~FlutterPlatformViewsController() = default;
......
......@@ -32,7 +32,6 @@
- (instancetype)initWithDelegate:(id<FlutterViewEngineDelegate>)delegate
opaque:(BOOL)opaque NS_DESIGNATED_INITIALIZER;
- (std::unique_ptr<flutter::IOSSurface>)createSurface:(std::shared_ptr<flutter::IOSContext>)context;
// Set by FlutterEngine or FlutterViewController to override software rendering.
@property(class, nonatomic) BOOL forceSoftwareRendering;
......
......@@ -83,15 +83,6 @@ static BOOL _forceSoftwareRendering;
flutter::GetRenderingAPIForProcess(FlutterView.forceSoftwareRendering));
}
- (std::unique_ptr<flutter::IOSSurface>)createSurface:
(std::shared_ptr<flutter::IOSContext>)ios_context {
return flutter::IOSSurface::Create(
std::move(ios_context), // context
fml::scoped_nsobject<CALayer>{[self.layer retain]}, // layer
[_delegate platformViewsController] // platform views controller
);
}
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context {
TRACE_EVENT0("flutter", "SnapshotFlutterView");
......
......@@ -137,6 +137,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
auto bridge =
std::make_unique<flutter::AccessibilityBridge>(/*view=*/nil,
......@@ -156,6 +157,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterView = OCMClassMock([FlutterView class]);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
......@@ -182,6 +184,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterView = OCMClassMock([FlutterView class]);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
......@@ -224,9 +227,12 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
/*raster=*/thread_task_runner,
/*ui=*/thread_task_runner,
/*io=*/thread_task_runner);
auto surfaceFactory = flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware);
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
/*ios_surface_factory=*/surfaceFactory,
/*task_runners=*/runners);
id mockFlutterView = OCMClassMock([FlutterView class]);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
......@@ -234,8 +240,9 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
std::string label = "some label";
auto flutterPlatformViewsController =
std::make_unique<flutter::FlutterPlatformViewsController>();
std::make_unique<flutter::FlutterPlatformViewsController>(surfaceFactory);
flutterPlatformViewsController->SetFlutterView(mockFlutterView);
surfaceFactory->SetPlatformViewsController(flutterPlatformViewsController.get());
MockFlutterPlatformFactory* factory = [[MockFlutterPlatformFactory new] autorelease];
flutterPlatformViewsController->RegisterViewFactory(
......@@ -279,6 +286,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterView = OCMClassMock([FlutterView class]);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
......@@ -344,6 +352,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterView = OCMClassMock([FlutterView class]);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
......@@ -411,6 +420,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
id mockFlutterView = OCMClassMock([FlutterView class]);
......@@ -477,6 +487,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
id mockFlutterView = OCMClassMock([FlutterView class]);
......@@ -549,6 +560,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
id mockFlutterView = OCMClassMock([FlutterView class]);
......@@ -623,6 +635,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
id mockFlutterView = OCMClassMock([FlutterView class]);
......@@ -693,6 +706,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
id mockFlutterView = OCMClassMock([FlutterView class]);
id mockFlutterViewController = OCMClassMock([FlutterViewController class]);
......@@ -760,6 +774,7 @@ fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name) {
auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
/*delegate=*/mock_delegate,
/*rendering_api=*/flutter::IOSRenderingAPI::kSoftware,
flutter::IOSSurfaceFactory::Create(flutter::IOSRenderingAPI::kSoftware),
/*task_runners=*/runners);
fml::AutoResetWaitableEvent latch;
thread_task_runner->PostTask([&] {
......
// 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__SURFACE_FACTORY_H_
#define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS__SURFACE_FACTORY_H_
#include <memory>
#import "flutter/shell/platform/darwin/ios/ios_surface.h"
#import "flutter/shell/platform/darwin/ios/rendering_api_selection.h"
namespace flutter {
class IOSSurfaceFactory {
public:
static std::shared_ptr<IOSSurfaceFactory> Create(
IOSRenderingAPI rendering_api);
explicit IOSSurfaceFactory(std::shared_ptr<IOSContext> ios_context);
~IOSSurfaceFactory();
void SetPlatformViewsController(
FlutterPlatformViewsController* platform_views_controller);
std::unique_ptr<IOSSurface> CreateSurface(
fml::scoped_nsobject<CALayer> ca_layer);
private:
FlutterPlatformViewsController* platform_views_controller_;
std::shared_ptr<IOSContext> ios_context_;
FML_DISALLOW_COPY_AND_ASSIGN(IOSSurfaceFactory);
};
} // namespace flutter
#endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_IOS__SURFACE_FACTORY_H_
// 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_surface_factory.h"
#import "flutter/shell/platform/darwin/ios/ios_context.h"
namespace flutter {
IOSSurfaceFactory::IOSSurfaceFactory(std::shared_ptr<IOSContext> ios_context)
: ios_context_(ios_context) {}
std::shared_ptr<IOSSurfaceFactory> IOSSurfaceFactory::Create(IOSRenderingAPI rendering_api) {
std::shared_ptr<IOSContext> ios_context = IOSContext::Create(rendering_api);
return std::make_shared<IOSSurfaceFactory>(ios_context);
}
IOSSurfaceFactory::~IOSSurfaceFactory() = default;
void IOSSurfaceFactory::SetPlatformViewsController(
FlutterPlatformViewsController* platform_views_controller) {
platform_views_controller_ = platform_views_controller;
}
std::unique_ptr<IOSSurface> IOSSurfaceFactory::CreateSurface(
fml::scoped_nsobject<CALayer> ca_layer) {
return flutter::IOSSurface::Create(ios_context_, ca_layer, platform_views_controller_);
}
} // namespace flutter
......@@ -19,6 +19,7 @@
#import "flutter/shell/platform/darwin/ios/framework/Source/platform_message_router.h"
#import "flutter/shell/platform/darwin/ios/ios_context.h"
#import "flutter/shell/platform/darwin/ios/ios_surface.h"
#import "flutter/shell/platform/darwin/ios/ios_surface_factory.h"
#import "flutter/shell/platform/darwin/ios/rendering_api_selection.h"
@class FlutterViewController;
......@@ -41,6 +42,7 @@ class PlatformViewIOS final : public PlatformView {
public:
explicit PlatformViewIOS(PlatformView::Delegate& delegate,
IOSRenderingAPI rendering_api,
std::shared_ptr<IOSSurfaceFactory> surface_factory,
flutter::TaskRunners task_runners);
~PlatformViewIOS() override;
......@@ -124,6 +126,7 @@ class PlatformViewIOS final : public PlatformView {
std::mutex ios_surface_mutex_;
std::unique_ptr<IOSSurface> ios_surface_;
std::shared_ptr<IOSContext> ios_context_;
std::shared_ptr<IOSSurfaceFactory> ios_surface_factory_;
PlatformMessageRouter platform_message_router_;
AccessibilityBridgePtr accessibility_bridge_;
fml::scoped_nsprotocol<FlutterTextInputPlugin*> text_input_plugin_;
......
......@@ -3,6 +3,7 @@
// found in the LICENSE file.
#import "flutter/shell/platform/darwin/ios/platform_view_ios.h"
#include <memory>
#include <utility>
......@@ -46,9 +47,11 @@ void PlatformViewIOS::AccessibilityBridgePtr::reset(AccessibilityBridge* bridge)
PlatformViewIOS::PlatformViewIOS(PlatformView::Delegate& delegate,
IOSRenderingAPI rendering_api,
std::shared_ptr<IOSSurfaceFactory> surface_factory,
flutter::TaskRunners task_runners)
: PlatformView(delegate, std::move(task_runners)),
ios_context_(IOSContext::Create(rendering_api)),
ios_surface_factory_(surface_factory),
accessibility_bridge_([this](bool enabled) { PlatformView::SetSemanticsEnabled(enabled); }) {}
PlatformViewIOS::~PlatformViewIOS() = default;
......@@ -102,8 +105,9 @@ void PlatformViewIOS::attachView() {
FML_DCHECK(owner_controller_.get().isViewLoaded)
<< "FlutterViewController's view should be loaded "
"before attaching to PlatformViewIOS.";
ios_surface_ =
[static_cast<FlutterView*>(owner_controller_.get().view) createSurface:ios_context_];
auto flutter_view = static_cast<FlutterView*>(owner_controller_.get().view);
auto ca_layer = fml::scoped_nsobject<CALayer>{[[flutter_view layer] retain]};
ios_surface_ = ios_surface_factory_->CreateSurface(ca_layer);
FML_DCHECK(ios_surface_ != nullptr);
if (accessibility_bridge_) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册