// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDERER_BACKEND_EGL_FRAMEBUFFER_H_
#define COBALT_RENDERER_BACKEND_EGL_FRAMEBUFFER_H_

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

#include "cobalt/math/size.h"

namespace cobalt {
namespace renderer {
namespace backend {

class GraphicsContextEGL;
class TextureEGL;

// Framebuffer object that can be rendered to or used as a source texture.
class FramebufferEGL {
 public:
  // Create a framebuffer object with the given |color_format| and
  // |depth_format|. If |depth_format| is GL_NONE, then no depth buffer
  // will be used.
  FramebufferEGL(GraphicsContextEGL* graphics_context, const math::Size& size,
                 GLenum color_format, GLenum depth_format);
  ~FramebufferEGL();

  const math::Size& GetSize() const { return size_; }

  // Ensure the framebuffer has a depth buffer. If not, then create and
  // attach one with the specified format.
  void EnsureDepthBufferAttached(GLenum depth_format);

  // Return the color attachment for the framebuffer as a texture.
  TextureEGL* GetColorTexture() const { return color_texture_.get(); }

  // Return the framebuffer object's ID.
  GLuint gl_handle() const { return framebuffer_handle_; }

  // Returns true if an error occurred during construction of this framebuffer
  // (indicating that this object is invalid).
  bool CreationError() const { return error_; }

 private:
  bool CreateDepthAttachment(GLenum depth_format);

  GraphicsContextEGL* graphics_context_;
  math::Size size_;

  // The handle to the framebuffer that can be passed into OpenGL functions.
  GLuint framebuffer_handle_;

  // The handle for the depth buffer. Only used internally.
  GLuint depthbuffer_handle_;

  // The color component of the framebuffer object as a texture.
  std::unique_ptr<TextureEGL> color_texture_;

  // Did an error occur during construction?
  bool error_;
};

}  // namespace backend
}  // namespace renderer
}  // namespace cobalt

#endif  // COBALT_RENDERER_BACKEND_EGL_FRAMEBUFFER_H_
