// // Copyright (c) 2002-2010 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. // // Renderbuffer.h: Defines the wrapper class gl::Renderbuffer, as well as the // class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, // DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. #ifndef LIBGLESV2_RENDERBUFFER_H_ #define LIBGLESV2_RENDERBUFFER_H_ #include "angle_gl.h" #include "common/angleutils.h" #include "common/RefCountObject.h" namespace rx { class Renderer; class SwapChain; class RenderTarget; class TextureStorage; } namespace gl { class RenderbufferStorage; class FramebufferAttachment; // A GL renderbuffer object is usually used as a depth or stencil buffer attachment // for a framebuffer object. The renderbuffer itself is a distinct GL object, see // FramebufferAttachment and Framebuffer for how they are applied to an FBO via an // attachment point. class Renderbuffer : public RefCountObject { public: Renderbuffer(GLuint id, RenderbufferStorage *newStorage); virtual ~Renderbuffer(); void setStorage(RenderbufferStorage *newStorage); RenderbufferStorage *getStorage(); GLsizei getWidth() const; GLsizei getHeight() const; GLenum getInternalFormat() const; GLenum getActualFormat() const; GLsizei getSamples() const; GLuint getRedSize() const; GLuint getGreenSize() const; GLuint getBlueSize() const; GLuint getAlphaSize() const; GLuint getDepthSize() const; GLuint getStencilSize() const; private: RenderbufferStorage *mStorage; }; // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage // is called. The specific concrete type depends on whether the internal format is // colour depth, stencil or packed depth/stencil. class RenderbufferStorage { public: RenderbufferStorage(); virtual ~RenderbufferStorage() = 0; virtual rx::RenderTarget *getRenderTarget(); 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 bool isTexture() const; virtual unsigned int getTextureSerial() const; static unsigned int issueSerials(unsigned int count); protected: GLsizei mWidth; GLsizei mHeight; GLenum mInternalFormat; GLenum mActualFormat; GLsizei mSamples; private: DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage); const unsigned int mSerial; static unsigned int mCurrentSerial; }; class Colorbuffer : public RenderbufferStorage { public: Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples); virtual ~Colorbuffer(); virtual rx::RenderTarget *getRenderTarget(); private: DISALLOW_COPY_AND_ASSIGN(Colorbuffer); rx::RenderTarget *mRenderTarget; }; class DepthStencilbuffer : public RenderbufferStorage { public: DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); ~DepthStencilbuffer(); virtual rx::RenderTarget *getRenderTarget(); protected: rx::RenderTarget *mDepthStencil; private: DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer); }; class Depthbuffer : public DepthStencilbuffer { public: Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); virtual ~Depthbuffer(); private: DISALLOW_COPY_AND_ASSIGN(Depthbuffer); }; class Stencilbuffer : public DepthStencilbuffer { public: Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); virtual ~Stencilbuffer(); private: DISALLOW_COPY_AND_ASSIGN(Stencilbuffer); }; } #endif // LIBGLESV2_RENDERBUFFER_H_