// 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>

@class FlutterResizeSynchronizer;

/**
 * Implemented by FlutterView.
 */
@protocol FlutterResizeSynchronizerDelegate

/**
 * Invoked on raster thread; Delegate should flush the OpenGL context.
 */
- (void)resizeSynchronizerFlush:(nonnull FlutterResizeSynchronizer*)synchronizer;

/**
 * Invoked on platform thread; Delegate should flip the surfaces.
 */
- (void)resizeSynchronizerCommit:(nonnull FlutterResizeSynchronizer*)synchronizer;

@end

/**
 * Encapsulates the logic for blocking platform thread during window resize as
 * well as synchronizing the raster and platform thread during commit (presenting frame).
 *
 * Flow during window resize
 *
 * 1. Platform thread calls [synchronizer beginResize:notify:]
 *    This will hold the platform thread until the raster thread is ready to display contents.
 * 2. Raster thread calls [synchronizer shouldEnsureSurfaceForSize:] with target size
 *    This will return false for any size other than target size
 * 3. Raster thread calls [synchronizer requestCommit]
 *    Any commit calls before shouldEnsureSurfaceForSize: is called with the right
 *    size are simply ignored; There's no point rasterizing and displaying frames
 *    with wrong size.
 * Both delegate methods (flush/commit) will be invoked before beginResize returns
 *
 * Flow during regular operation (no resizing)
 *
 * 1. Raster thread calls [synchronizer requestCommit]
 *    This will invoke [delegate flush:] on raster thread and
 *    [delegate commit:] on platform thread. The requestCommit call will be blocked
 *    until this is done. This is necessary to ensure that rasterizer won't start
 *    rasterizing next frame before the FlutterSurfaceManager flipped the surface,
 *    which must be performed on platform thread.
 */
@interface FlutterResizeSynchronizer : NSObject

- (nullable instancetype)initWithDelegate:(nonnull id<FlutterResizeSynchronizerDelegate>)delegate;

/**
 * Blocks the platform thread until
 * - shouldEnsureSurfaceForSize is called with proper size and
 * - requestCommit is called
 * All requestCommit calls before `shouldEnsureSurfaceForSize` is called with
 * expected size are ignored;
 * The notify block is invoked immediately after synchronizer mutex is acquired.
 */
- (void)beginResize:(CGSize)size notify:(nonnull dispatch_block_t)notify;

/**
 * Returns whether the view should ensure surfaces with given size;
 * This will be false during resizing for any size other than size specified
 * during beginResize.
 */
- (BOOL)shouldEnsureSurfaceForSize:(CGSize)size;

/**
 * Called from rasterizer thread, will block until delegate resizeSynchronizerCommit:
 * method is called (on platform thread).
 */
- (void)requestCommit;

/**
 * Called when shutting down. Unblocks everything and prevents any further synchronization.
 */
- (void)shutdown;

@end
