blob: 9dd676d1a1645fe2fd91510dd6eaf3f7c3553a23 [file] [log] [blame]
// Copyright 2017 Google Inc. 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 "base/memory/scoped_ptr.h"
#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.
scoped_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_