// // Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // FramebufferAttachment.h: Defines the wrapper class gl::FramebufferAttachment, as well as the // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. #ifndef LIBGLESV2_FRAMEBUFFERATTACHMENT_H_ #define LIBGLESV2_FRAMEBUFFERATTACHMENT_H_ #include "angle_gl.h" #include "common/angleutils.h" #include "common/RefCountObject.h" namespace rx { class Renderer; class RenderTarget; class TextureStorage; } namespace gl { class Texture2D; class TextureCubeMap; class Texture3D; class Texture2DArray; class Renderbuffer; // FramebufferAttachment implements a GL framebuffer attachment. // Attachments are "light" containers, which store pointers to ref-counted GL objects. // We support GL texture (2D/3D/Cube/2D array) and renderbuffer object attachments. // Note: Our old naming scheme used the term "Renderbuffer" for both GL renderbuffers and for // framebuffer attachments, which confused their usage. class FramebufferAttachment { public: FramebufferAttachment(); virtual ~FramebufferAttachment(); // Helper methods GLuint getRedSize() const; GLuint getGreenSize() const; GLuint getBlueSize() const; GLuint getAlphaSize() const; GLuint getDepthSize() const; GLuint getStencilSize() const; GLenum getComponentType() const; GLenum getColorEncoding() const; bool isTexture() const; bool isTextureWithId(GLuint textureId) const { return isTexture() && id() == textureId; } bool isRenderbufferWithId(GLuint renderbufferId) const { return !isTexture() && id() == renderbufferId; } // Child class interface virtual rx::RenderTarget *getRenderTarget() = 0; virtual rx::RenderTarget *getDepthStencil() = 0; virtual rx::TextureStorage *getTextureStorage() = 0; virtual GLsizei getWidth() const = 0; virtual GLsizei getHeight() const = 0; virtual GLenum getInternalFormat() const = 0; virtual GLenum getActualFormat() const = 0; virtual GLsizei getSamples() const = 0; virtual unsigned int getSerial() const = 0; virtual GLuint id() const = 0; virtual GLenum type() const = 0; virtual GLint mipLevel() const = 0; virtual GLint layer() const = 0; virtual unsigned int getTextureSerial() const = 0; private: DISALLOW_COPY_AND_ASSIGN(FramebufferAttachment); }; class Texture2DAttachment : public FramebufferAttachment { public: Texture2DAttachment(Texture2D *texture, GLint level); virtual ~Texture2DAttachment(); rx::RenderTarget *getRenderTarget(); rx::RenderTarget *getDepthStencil(); rx::TextureStorage *getTextureStorage(); virtual GLsizei getWidth() const; virtual GLsizei getHeight() const; virtual GLenum getInternalFormat() const; virtual GLenum getActualFormat() const; virtual GLsizei getSamples() const; virtual unsigned int getSerial() const; virtual GLuint id() const; virtual GLenum type() const; virtual GLint mipLevel() const; virtual GLint layer() const; virtual unsigned int getTextureSerial() const; private: DISALLOW_COPY_AND_ASSIGN(Texture2DAttachment); BindingPointer mTexture2D; const GLint mLevel; }; class TextureCubeMapAttachment : public FramebufferAttachment { public: TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level); virtual ~TextureCubeMapAttachment(); rx::RenderTarget *getRenderTarget(); rx::RenderTarget *getDepthStencil(); rx::TextureStorage *getTextureStorage(); virtual GLsizei getWidth() const; virtual GLsizei getHeight() const; virtual GLenum getInternalFormat() const; virtual GLenum getActualFormat() const; virtual GLsizei getSamples() const; virtual unsigned int getSerial() const; virtual GLuint id() const; virtual GLenum type() const; virtual GLint mipLevel() const; virtual GLint layer() const; virtual unsigned int getTextureSerial() const; private: DISALLOW_COPY_AND_ASSIGN(TextureCubeMapAttachment); BindingPointer mTextureCubeMap; const GLint mLevel; const GLenum mFaceTarget; }; class Texture3DAttachment : public FramebufferAttachment { public: Texture3DAttachment(Texture3D *texture, GLint level, GLint layer); virtual ~Texture3DAttachment(); rx::RenderTarget *getRenderTarget(); rx::RenderTarget *getDepthStencil(); rx::TextureStorage *getTextureStorage(); virtual GLsizei getWidth() const; virtual GLsizei getHeight() const; virtual GLenum getInternalFormat() const; virtual GLenum getActualFormat() const; virtual GLsizei getSamples() const; virtual unsigned int getSerial() const; virtual GLuint id() const; virtual GLenum type() const; virtual GLint mipLevel() const; virtual GLint layer() const; virtual unsigned int getTextureSerial() const; private: DISALLOW_COPY_AND_ASSIGN(Texture3DAttachment); BindingPointer mTexture3D; const GLint mLevel; const GLint mLayer; }; class Texture2DArrayAttachment : public FramebufferAttachment { public: Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer); virtual ~Texture2DArrayAttachment(); rx::RenderTarget *getRenderTarget(); rx::RenderTarget *getDepthStencil(); rx::TextureStorage *getTextureStorage(); virtual GLsizei getWidth() const; virtual GLsizei getHeight() const; virtual GLenum getInternalFormat() const; virtual GLenum getActualFormat() const; virtual GLsizei getSamples() const; virtual unsigned int getSerial() const; virtual GLuint id() const; virtual GLenum type() const; virtual GLint mipLevel() const; virtual GLint layer() const; virtual unsigned int getTextureSerial() const; private: DISALLOW_COPY_AND_ASSIGN(Texture2DArrayAttachment); BindingPointer mTexture2DArray; const GLint mLevel; const GLint mLayer; }; class RenderbufferAttachment : public FramebufferAttachment { public: RenderbufferAttachment(Renderbuffer *renderbuffer); virtual ~RenderbufferAttachment(); rx::RenderTarget *getRenderTarget(); rx::RenderTarget *getDepthStencil(); rx::TextureStorage *getTextureStorage(); virtual GLsizei getWidth() const; virtual GLsizei getHeight() const; virtual GLenum getInternalFormat() const; virtual GLenum getActualFormat() const; virtual GLsizei getSamples() const; virtual unsigned int getSerial() const; virtual GLuint id() const; virtual GLenum type() const; virtual GLint mipLevel() const; virtual GLint layer() const; virtual unsigned int getTextureSerial() const; private: DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment); BindingPointer mRenderbuffer; }; } #endif // LIBGLESV2_FRAMEBUFFERATTACHMENT_H_