// 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 <Cocoa/Cocoa.h>
#import <QuartzCore/CAMetalLayer.h>

#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterBackingStore.h"
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterIOSurfaceHolder.h"

/**
 * Manages the render surfaces and their corresponding backing stores.
 */
@protocol FlutterSurfaceManager

/**
 * Updates the backing store size of the managed IOSurfaces to `size`. If the surfaces are already
 * of the same size, this is a no-op.
 */
- (void)ensureSurfaceSize:(CGSize)size;

/**
 * Swaps the front and the back buffer.
 */
- (void)swapBuffers;

/**
 * Returns the backing store for the back buffer.
 */
- (nonnull FlutterRenderBackingStore*)renderBuffer;

@end

/**
 * Methods for managing the IOSurfaces held by FlutterIOSurfaceManager.
 */
@protocol FlutterIOSurfaceManagerDelegate

/**
 * Tells the delegate that the front and back IOSurfaces are swapped.
 */
- (void)onSwapBuffers;

/**
 * Tells the delegate that the IOSurfaces have been resized. `bufferIndex` is to indicate the front
 * vs back buffer. `size` is the new size of the IOSurface.
 */
- (void)onUpdateSurface:(nonnull FlutterIOSurfaceHolder*)surface
            bufferIndex:(size_t)index
                   size:(CGSize)size;

/**
 * Tells the delegate that IOSurface with given index has been released. Delegate should free
 * all resources associated with the surface
 */
- (void)onSurfaceReleased:(size_t)index;

@end

/**
 * Manages IOSurfaces for the FlutterEngine to render to.
 *
 * The backing store when rendering with on Metal its a Metal texture. There are two IOSurfaces
 * created during initialization, FlutterSurfaceManager manages the lifecycle of these.
 */
@interface FlutterIOSurfaceManager : NSObject <FlutterSurfaceManager>

/**
 * The object that acts as the delegate for the FlutterIOSurfaceManager. See:
 * FlutterIOSurfaceManagerDelegate.
 */
@property(nullable, nonatomic, weak) id<FlutterIOSurfaceManagerDelegate> delegate;

/**
 * Initializes and returns an IOSurface manager that renders to a child layer (referred to as the
 * content layer) of the containing layer and applies the transform to the contents of the content
 * layer.
 */
- (nullable instancetype)initWithLayer:(nonnull CALayer*)containingLayer
                      contentTransform:(CATransform3D)transform;

@end

/**
 * FlutterSurfaceManager implementation where the IOSurfaces managed are backed by a Metal textures.
 */
@interface FlutterMetalSurfaceManager : FlutterIOSurfaceManager <FlutterIOSurfaceManagerDelegate>

/**
 * Creates two IOSurfaces backed by Metal textures.
 */
- (nullable instancetype)initWithDevice:(nonnull id<MTLDevice>)device
                           commandQueue:(nonnull id<MTLCommandQueue>)commandQueue
                                  layer:(nonnull CALayer*)containingLayer;

@end
