michael@0: // michael@0: // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: // michael@0: michael@0: // Renderbuffer.h: Defines the wrapper class gl::Renderbuffer, as well as the michael@0: // class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, michael@0: // DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer michael@0: // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. michael@0: michael@0: #ifndef LIBGLESV2_RENDERBUFFER_H_ michael@0: #define LIBGLESV2_RENDERBUFFER_H_ michael@0: michael@0: #define GL_APICALL michael@0: #include michael@0: michael@0: #include "common/angleutils.h" michael@0: #include "common/RefCountObject.h" michael@0: michael@0: namespace rx michael@0: { michael@0: class Renderer; michael@0: class SwapChain; michael@0: class RenderTarget; michael@0: } michael@0: michael@0: namespace gl michael@0: { michael@0: class Texture2D; michael@0: class TextureCubeMap; michael@0: class Renderbuffer; michael@0: class Colorbuffer; michael@0: class DepthStencilbuffer; michael@0: michael@0: class RenderbufferInterface michael@0: { michael@0: public: michael@0: RenderbufferInterface(); michael@0: michael@0: virtual ~RenderbufferInterface() {}; michael@0: michael@0: virtual void addProxyRef(const Renderbuffer *proxy); michael@0: virtual void releaseProxy(const Renderbuffer *proxy); michael@0: michael@0: virtual rx::RenderTarget *getRenderTarget() = 0; michael@0: virtual rx::RenderTarget *getDepthStencil() = 0; michael@0: michael@0: virtual GLsizei getWidth() const = 0; michael@0: virtual GLsizei getHeight() const = 0; michael@0: virtual GLenum getInternalFormat() const = 0; michael@0: virtual GLenum getActualFormat() const = 0; michael@0: virtual GLsizei getSamples() const = 0; michael@0: michael@0: GLuint getRedSize() const; michael@0: GLuint getGreenSize() const; michael@0: GLuint getBlueSize() const; michael@0: GLuint getAlphaSize() const; michael@0: GLuint getDepthSize() const; michael@0: GLuint getStencilSize() const; michael@0: michael@0: virtual unsigned int getSerial() const = 0; michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface); michael@0: }; michael@0: michael@0: class RenderbufferTexture2D : public RenderbufferInterface michael@0: { michael@0: public: michael@0: RenderbufferTexture2D(Texture2D *texture, GLenum target); michael@0: michael@0: virtual ~RenderbufferTexture2D(); michael@0: michael@0: void addProxyRef(const Renderbuffer *proxy); michael@0: void releaseProxy(const Renderbuffer *proxy); michael@0: michael@0: rx::RenderTarget *getRenderTarget(); michael@0: rx::RenderTarget *getDepthStencil(); michael@0: michael@0: virtual GLsizei getWidth() const; michael@0: virtual GLsizei getHeight() const; michael@0: virtual GLenum getInternalFormat() const; michael@0: virtual GLenum getActualFormat() const; michael@0: virtual GLsizei getSamples() const; michael@0: michael@0: virtual unsigned int getSerial() const; michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D); michael@0: michael@0: BindingPointer mTexture2D; michael@0: GLenum mTarget; michael@0: }; michael@0: michael@0: class RenderbufferTextureCubeMap : public RenderbufferInterface michael@0: { michael@0: public: michael@0: RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target); michael@0: michael@0: virtual ~RenderbufferTextureCubeMap(); michael@0: michael@0: void addProxyRef(const Renderbuffer *proxy); michael@0: void releaseProxy(const Renderbuffer *proxy); michael@0: michael@0: rx::RenderTarget *getRenderTarget(); michael@0: rx::RenderTarget *getDepthStencil(); michael@0: michael@0: virtual GLsizei getWidth() const; michael@0: virtual GLsizei getHeight() const; michael@0: virtual GLenum getInternalFormat() const; michael@0: virtual GLenum getActualFormat() const; michael@0: virtual GLsizei getSamples() const; michael@0: michael@0: virtual unsigned int getSerial() const; michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap); michael@0: michael@0: BindingPointer mTextureCubeMap; michael@0: GLenum mTarget; michael@0: }; michael@0: michael@0: // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage michael@0: // is called. The specific concrete type depends on whether the internal format is michael@0: // colour depth, stencil or packed depth/stencil. michael@0: class RenderbufferStorage : public RenderbufferInterface michael@0: { michael@0: public: michael@0: RenderbufferStorage(); michael@0: michael@0: virtual ~RenderbufferStorage() = 0; michael@0: michael@0: virtual rx::RenderTarget *getRenderTarget(); michael@0: virtual rx::RenderTarget *getDepthStencil(); michael@0: michael@0: virtual GLsizei getWidth() const; michael@0: virtual GLsizei getHeight() const; michael@0: virtual GLenum getInternalFormat() const; michael@0: virtual GLenum getActualFormat() const; michael@0: virtual GLsizei getSamples() const; michael@0: michael@0: virtual unsigned int getSerial() const; michael@0: michael@0: static unsigned int issueSerial(); michael@0: static unsigned int issueCubeSerials(); michael@0: michael@0: protected: michael@0: GLsizei mWidth; michael@0: GLsizei mHeight; michael@0: GLenum mInternalFormat; michael@0: GLenum mActualFormat; michael@0: GLsizei mSamples; michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage); michael@0: michael@0: const unsigned int mSerial; michael@0: michael@0: static unsigned int mCurrentSerial; michael@0: }; michael@0: michael@0: // Renderbuffer implements the GL renderbuffer object. michael@0: // It's only a proxy for a RenderbufferInterface instance; the internal object michael@0: // can change whenever glRenderbufferStorage is called. michael@0: class Renderbuffer : public RefCountObject michael@0: { michael@0: public: michael@0: Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage); michael@0: michael@0: virtual ~Renderbuffer(); michael@0: michael@0: // These functions from RefCountObject are overloaded here because michael@0: // Textures need to maintain their own count of references to them via michael@0: // Renderbuffers/RenderbufferTextures. These functions invoke those michael@0: // reference counting functions on the RenderbufferInterface. michael@0: void addRef() const; michael@0: void release() const; michael@0: michael@0: rx::RenderTarget *getRenderTarget(); michael@0: rx::RenderTarget *getDepthStencil(); michael@0: michael@0: GLsizei getWidth() const; michael@0: GLsizei getHeight() const; michael@0: GLenum getInternalFormat() const; michael@0: GLenum getActualFormat() const; michael@0: GLuint getRedSize() const; michael@0: GLuint getGreenSize() const; michael@0: GLuint getBlueSize() const; michael@0: GLuint getAlphaSize() const; michael@0: GLuint getDepthSize() const; michael@0: GLuint getStencilSize() const; michael@0: GLsizei getSamples() const; michael@0: michael@0: unsigned int getSerial() const; michael@0: michael@0: void setStorage(RenderbufferStorage *newStorage); michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(Renderbuffer); michael@0: michael@0: RenderbufferInterface *mInstance; michael@0: }; michael@0: michael@0: class Colorbuffer : public RenderbufferStorage michael@0: { michael@0: public: michael@0: Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); michael@0: Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples); michael@0: michael@0: virtual ~Colorbuffer(); michael@0: michael@0: virtual rx::RenderTarget *getRenderTarget(); michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(Colorbuffer); michael@0: michael@0: rx::RenderTarget *mRenderTarget; michael@0: }; michael@0: michael@0: class DepthStencilbuffer : public RenderbufferStorage michael@0: { michael@0: public: michael@0: DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); michael@0: DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); michael@0: michael@0: ~DepthStencilbuffer(); michael@0: michael@0: virtual rx::RenderTarget *getDepthStencil(); michael@0: michael@0: protected: michael@0: rx::RenderTarget *mDepthStencil; michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer); michael@0: }; michael@0: michael@0: class Depthbuffer : public DepthStencilbuffer michael@0: { michael@0: public: michael@0: Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); michael@0: michael@0: virtual ~Depthbuffer(); michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(Depthbuffer); michael@0: }; michael@0: michael@0: class Stencilbuffer : public DepthStencilbuffer michael@0: { michael@0: public: michael@0: Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); michael@0: michael@0: virtual ~Stencilbuffer(); michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(Stencilbuffer); michael@0: }; michael@0: } michael@0: michael@0: #endif // LIBGLESV2_RENDERBUFFER_H_