11 #include "flutter/shell/platform/embedder/embedder.h"
13 #pragma mark - Static callbacks that require the engine.
16 NSCAssert(NO,
@"The renderer config should not be used to get the next drawable.");
17 return FlutterMetalTexture{};
21 NSCAssert(NO,
@"The renderer config should not be used to present drawable.");
26 int64_t textureIdentifier,
29 FlutterMetalExternalTexture* metalTexture) {
31 return [engine.renderer populateTextureWithIdentifier:textureIdentifier
32 metalTexture:metalTexture];
35 #pragma mark - FlutterRenderer implementation
38 FlutterDarwinContextMetalSkia* _darwinMetalContext;
46 id<MTLDevice> SelectMetalDevice() {
47 NSArray<id<MTLDevice>>* devices = MTLCopyAllDevices();
48 for (id<MTLDevice> device in devices) {
49 if (@available(macOS 10.15, *)) {
50 if (device.hasUnifiedMemory) {
55 return MTLCreateSystemDefaultDevice();
59 - (instancetype)initWithFlutterEngine:(nonnull
FlutterEngine*)flutterEngine {
60 self = [
super initWithDelegate:self engine:flutterEngine];
62 _device = SelectMetalDevice();
64 NSLog(
@"Could not acquire Metal device.");
68 _commandQueue = [_device newCommandQueue];
70 NSLog(
@"Could not create Metal command queue.");
74 _darwinMetalContext = [[FlutterDarwinContextMetalSkia alloc] initWithMTLDevice:_device
75 commandQueue:_commandQueue];
80 - (FlutterRendererConfig)createRendererConfig {
81 FlutterRendererConfig config = {
82 .type = FlutterRendererType::kMetal,
84 .struct_size =
sizeof(FlutterMetalRendererConfig),
85 .device = (__bridge FlutterMetalDeviceHandle)_device,
86 .present_command_queue = (__bridge FlutterMetalCommandQueueHandle)_commandQueue,
87 .get_next_drawable_callback =
89 .present_drawable_callback =
91 .external_texture_frame_callback =
97 #pragma mark - Embedder callback implementations.
99 - (BOOL)populateTextureWithIdentifier:(int64_t)textureID
100 metalTexture:(FlutterMetalExternalTexture*)textureOut {
105 #pragma mark - FlutterTextureRegistrar methods.
109 darwinMetalContext:_darwinMetalContext];
static bool OnAcquireExternalTexture(void *user_data, int64_t textureIdentifier, size_t width, size_t height, FlutterMetalExternalTexture *metalTexture)
static FlutterMetalTexture OnGetNextDrawable(void *user_data, const FlutterFrameInfo *frameInfo)
static bool OnPresentDrawable(void *user_data, const FlutterMetalTexture *texture)
BOOL populateTexture:(nonnull FlutterMetalExternalTexture *metalTexture)