| // 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.h" |
| |
| #import "flutter/shell/platform/darwin/ios/ios_surface_software.h" |
| |
| #include "flutter/shell/platform/darwin/ios/rendering_api_selection.h" |
| |
| #if SHELL_ENABLE_METAL |
| #import "flutter/shell/platform/darwin/ios/ios_surface_metal_impeller.h" |
| #import "flutter/shell/platform/darwin/ios/ios_surface_metal_skia.h" |
| #endif // SHELL_ENABLE_METAL |
| |
| namespace flutter { |
| |
| std::unique_ptr<IOSSurface> IOSSurface::Create(std::shared_ptr<IOSContext> context, |
| const fml::scoped_nsobject<CALayer>& layer) { |
| FML_DCHECK(layer); |
| FML_DCHECK(context); |
| |
| #if SHELL_ENABLE_METAL |
| if (@available(iOS METAL_IOS_VERSION_BASELINE, *)) { |
| if ([layer.get() isKindOfClass:[CAMetalLayer class]]) { |
| switch (context->GetBackend()) { |
| case IOSRenderingBackend::kSkia: |
| return std::make_unique<IOSSurfaceMetalSkia>( |
| fml::scoped_nsobject<CAMetalLayer>( |
| reinterpret_cast<CAMetalLayer*>([layer.get() retain])), // Metal layer |
| std::move(context) // context |
| ); |
| break; |
| case IOSRenderingBackend::kImpeller: |
| return std::make_unique<IOSSurfaceMetalImpeller>( |
| fml::scoped_nsobject<CAMetalLayer>( |
| reinterpret_cast<CAMetalLayer*>([layer.get() retain])), // Metal layer |
| std::move(context) // context |
| ); |
| } |
| } |
| } |
| #endif // SHELL_ENABLE_METAL |
| |
| return std::make_unique<IOSSurfaceSoftware>(layer, // layer |
| std::move(context) // context |
| ); |
| } |
| |
| IOSSurface::IOSSurface(std::shared_ptr<IOSContext> ios_context) |
| : ios_context_(std::move(ios_context)) { |
| FML_DCHECK(ios_context_); |
| } |
| |
| IOSSurface::~IOSSurface() = default; |
| |
| std::shared_ptr<IOSContext> IOSSurface::GetContext() const { |
| return ios_context_; |
| } |
| |
| } // namespace flutter |