// 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_PLATFORM_WINDOWS_EXTERNAL_TEXTURE_GL_H_
#define FLUTTER_SHELL_PLATFORM_WINDOWS_EXTERNAL_TEXTURE_GL_H_

#include <stdint.h>

#include <memory>

#include "flutter/shell/platform/common/public/flutter_texture_registrar.h"
#include "flutter/shell/platform/embedder/embedder.h"

#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

namespace flutter {

typedef struct ExternalTextureGLState ExternalTextureGLState;

typedef void (*glGenTexturesProc)(GLsizei n, GLuint* textures);
typedef void (*glDeleteTexturesProc)(GLsizei n, const GLuint* textures);
typedef void (*glBindTextureProc)(GLenum target, GLuint texture);
typedef void (*glTexParameteriProc)(GLenum target, GLenum pname, GLint param);
typedef void (*glTexImage2DProc)(GLenum target,
                                 GLint level,
                                 GLint internalformat,
                                 GLsizei width,
                                 GLsizei height,
                                 GLint border,
                                 GLenum format,
                                 GLenum type,
                                 const void* data);

// A struct containing pointers to resolved gl* functions.
struct GlProcs {
  glGenTexturesProc glGenTextures;
  glDeleteTexturesProc glDeleteTextures;
  glBindTextureProc glBindTexture;
  glTexParameteriProc glTexParameteri;
  glTexImage2DProc glTexImage2D;
  bool valid;
};

// An abstraction of an OpenGL texture.
class ExternalTextureGL {
 public:
  ExternalTextureGL(FlutterDesktopPixelBufferTextureCallback texture_callback,
                    void* user_data,
                    const GlProcs& gl_procs);

  virtual ~ExternalTextureGL();

  // Returns the unique id of this texture.
  int64_t texture_id() { return reinterpret_cast<int64_t>(this); }

  void MarkFrameAvailable();

  // Attempts to populate the specified |opengl_texture| with texture details
  // such as the name, width, height and the pixel format upon successfully
  // copying the buffer provided by |texture_callback_|. See |CopyPixelBuffer|.
  // Returns true on success or false if the pixel buffer could not be copied.
  bool PopulateTexture(size_t width,
                       size_t height,
                       FlutterOpenGLTexture* opengl_texture);

 private:
  // Attempts to copy the pixel buffer returned by |texture_callback_| to
  // OpenGL.
  // The |width| and |height| will be set to the actual bounds of the copied
  // pixel buffer.
  // Returns true on success or false if the pixel buffer returned
  // by |texture_callback_| was invalid.
  bool CopyPixelBuffer(size_t& width, size_t& height);

  std::unique_ptr<ExternalTextureGLState> state_;
  FlutterDesktopPixelBufferTextureCallback texture_callback_ = nullptr;
  void* user_data_ = nullptr;
  const GlProcs& gl_;
};

}  // namespace flutter

#endif  // FLUTTER_SHELL_PLATFORM_WINDOWS_EXTERNAL_TEXTURE_GL_H_
