// 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_COMMON_GRAPHICS_GL_CONTEXT_SWITCH_H_
#define FLUTTER_COMMON_GRAPHICS_GL_CONTEXT_SWITCH_H_

#include <functional>
#include <memory>
#include <vector>

#include "flutter/fml/logging.h"
#include "flutter/fml/macros.h"

namespace flutter {

// This interface represents a gl context that can be switched by
// |GLContextSwitch|.
//
// The implementation should wrap a "Context" object inside this class. For
// example, in iOS while using a GL rendering surface, the implementation should
// wrap an |EAGLContext|.
class SwitchableGLContext {
 public:
  SwitchableGLContext();

  virtual ~SwitchableGLContext();

  // Implement this to set the context wrapped by this |SwitchableGLContext|
  // object to the current context.
  virtual bool SetCurrent() = 0;

  // Implement this to remove the context wrapped by this |SwitchableGLContext|
  // object from current context;
  virtual bool RemoveCurrent() = 0;

  FML_DISALLOW_COPY_AND_ASSIGN(SwitchableGLContext);
};

// Represents the result of setting a gl context.
//
// This class exists because context results are used in places applies to all
// the platforms. On certain platforms(for example lower end iOS devices that
// uses gl), a |GLContextSwitch| is required to protect flutter's gl contect
// from being polluted by other programs(embedded platform views). A
// |GLContextSwitch| is a subclass of |GLContextResult|, which can be returned
// on platforms that requires context switching. A |GLContextDefaultResult| is
// also a subclass of |GLContextResult|, which can be returned on platforms
// that doesn't require context switching.
class GLContextResult {
 public:
  GLContextResult();
  virtual ~GLContextResult();

  //----------------------------------------------------------------------------
  // Returns true if the gl context is set successfully.
  bool GetResult();

 protected:
  GLContextResult(bool static_result);
  bool result_;

  FML_DISALLOW_COPY_AND_ASSIGN(GLContextResult);
};

//------------------------------------------------------------------------------
/// The default implementation of |GLContextResult|.
///
/// Use this class on platforms that doesn't require gl context switching.
/// * See also |GLContextSwitch| if the platform requires gl context switching.
class GLContextDefaultResult : public GLContextResult {
 public:
  //----------------------------------------------------------------------------
  /// Constructs a |GLContextDefaultResult| with a static result.
  ///
  /// Used this on platforms that doesn't require gl context switching. (For
  /// example, metal on iOS)
  ///
  /// @param  static_result a static value that will be returned from
  /// |GetResult|
  GLContextDefaultResult(bool static_result);

  ~GLContextDefaultResult() override;

  FML_DISALLOW_COPY_AND_ASSIGN(GLContextDefaultResult);
};

//------------------------------------------------------------------------------
/// Switches the gl context to the a context that is passed in the
/// constructor.
///
/// In destruction, it should restore the current context to what was
/// before the construction of this switch.
class GLContextSwitch final : public GLContextResult {
 public:
  //----------------------------------------------------------------------------
  /// Constructs a |GLContextSwitch|.
  ///
  /// @param  context The context that is going to be set as the current
  /// context. The |GLContextSwitch| should not outlive the owner of the gl
  /// context wrapped inside the `context`.
  GLContextSwitch(std::unique_ptr<SwitchableGLContext> context);

  ~GLContextSwitch() override;

 private:
  std::unique_ptr<SwitchableGLContext> context_;

  FML_DISALLOW_COPY_AND_ASSIGN(GLContextSwitch);
};

}  // namespace flutter

#endif  // FLUTTER_COMMON_GRAPHICS_GL_CONTEXT_SWITCH_H_
