// 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_SHELL_GPU_GPU_SURFACE_GL_DELEGATE_H_
#define FLUTTER_SHELL_GPU_GPU_SURFACE_GL_DELEGATE_H_

#include <optional>

#include "flutter/common/graphics/gl_context_switch.h"
#include "flutter/flow/embedded_views.h"
#include "flutter/fml/macros.h"
#include "third_party/skia/include/core/SkMatrix.h"
#include "third_party/skia/include/gpu/gl/GrGLInterface.h"

namespace flutter {

// A structure to represent the frame information which is passed to the
// embedder when requesting a frame buffer object.
struct GLFrameInfo {
  uint32_t width;
  uint32_t height;
};

// A structure to represent the frame buffer information which is returned to
// the rendering backend after requesting a frame buffer object.
struct GLFBOInfo {
  // The frame buffer's ID.
  uint32_t fbo_id;
  // This boolean flags whether the returned FBO supports partial repaint.
  const bool partial_repaint_enabled;
  // The frame buffer's existing damage (i.e. damage since it was last used).
  const SkIRect existing_damage;
};

// Information passed during presentation of a frame.
struct GLPresentInfo {
  uint32_t fbo_id;

  // The frame damage is a hint to compositor telling it which parts of front
  // buffer need to be updated.
  const std::optional<SkIRect>& frame_damage;

  // Time at which this frame is scheduled to be presented. This is a hint
  // that can be passed to the platform to drop queued frames.
  std::optional<fml::TimePoint> presentation_time = std::nullopt;

  // The buffer damage refers to the region that needs to be set as damaged
  // within the frame buffer.
  const std::optional<SkIRect>& buffer_damage;
};

class GPUSurfaceGLDelegate {
 public:
  ~GPUSurfaceGLDelegate();

  // Called to make the main GL context current on the current thread.
  virtual std::unique_ptr<GLContextResult> GLContextMakeCurrent() = 0;

  // Called to clear the current GL context on the thread. This may be called on
  // either the GPU or IO threads.
  virtual bool GLContextClearCurrent() = 0;

  // Inform the GL Context that there's going to be no writing beyond
  // the specified region
  virtual void GLContextSetDamageRegion(const std::optional<SkIRect>& region) {}

  // Called to present the main GL surface. This is only called for the main GL
  // context and not any of the contexts dedicated for IO.
  virtual bool GLContextPresent(const GLPresentInfo& present_info) = 0;

  // The information about the main window bound framebuffer. ID is Typically
  // FBO0.
  virtual GLFBOInfo GLContextFBO(GLFrameInfo frame_info) const = 0;

  // The rendering subsystem assumes that the ID of the main window bound
  // framebuffer remains constant throughout. If this assumption in incorrect,
  // embedders are required to return true from this method. In such cases,
  // GLContextFBO(frame_info) will be called again to acquire the new FBO ID for
  // rendering subsequent frames.
  virtual bool GLContextFBOResetAfterPresent() const;

  // Returns framebuffer info for current backbuffer
  virtual SurfaceFrame::FramebufferInfo GLContextFramebufferInfo() const;

  // A transformation applied to the onscreen surface before the canvas is
  // flushed.
  virtual SkMatrix GLContextSurfaceTransformation() const;

  virtual sk_sp<const GrGLInterface> GetGLInterface() const;

  // TODO(chinmaygarde): The presence of this method is to work around the fact
  // that not all platforms can accept a custom GL proc table. Migrate all
  // platforms to move GL proc resolution to the embedder and remove this
  // method.
  static sk_sp<const GrGLInterface> GetDefaultPlatformGLInterface();

  using GLProcResolver =
      std::function<void* /* proc name */ (const char* /* proc address */)>;
  // Provide a custom GL proc resolver. If no such resolver is present, Skia
  // will attempt to do GL proc address resolution on its own. Embedders that
  // have specific opinions on GL API selection or need to add their own
  // instrumentation to specific GL calls can specify custom GL functions
  // here.
  virtual GLProcResolver GetGLProcResolver() const;

  // Whether to allow drawing to the surface when the GPU is disabled
  virtual bool AllowsDrawingWhenGpuDisabled() const;
};

}  // namespace flutter

#endif  // FLUTTER_SHELL_GPU_GPU_SURFACE_GL_DELEGATE_H_
