1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libGLESv2/Renderbuffer.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,261 @@ 1.4 +// 1.5 +// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 1.6 +// Use of this source code is governed by a BSD-style license that can be 1.7 +// found in the LICENSE file. 1.8 +// 1.9 + 1.10 +// Renderbuffer.h: Defines the wrapper class gl::Renderbuffer, as well as the 1.11 +// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, 1.12 +// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 1.13 +// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 1.14 + 1.15 +#ifndef LIBGLESV2_RENDERBUFFER_H_ 1.16 +#define LIBGLESV2_RENDERBUFFER_H_ 1.17 + 1.18 +#define GL_APICALL 1.19 +#include <GLES2/gl2.h> 1.20 + 1.21 +#include "common/angleutils.h" 1.22 +#include "common/RefCountObject.h" 1.23 + 1.24 +namespace rx 1.25 +{ 1.26 +class Renderer; 1.27 +class SwapChain; 1.28 +class RenderTarget; 1.29 +} 1.30 + 1.31 +namespace gl 1.32 +{ 1.33 +class Texture2D; 1.34 +class TextureCubeMap; 1.35 +class Renderbuffer; 1.36 +class Colorbuffer; 1.37 +class DepthStencilbuffer; 1.38 + 1.39 +class RenderbufferInterface 1.40 +{ 1.41 + public: 1.42 + RenderbufferInterface(); 1.43 + 1.44 + virtual ~RenderbufferInterface() {}; 1.45 + 1.46 + virtual void addProxyRef(const Renderbuffer *proxy); 1.47 + virtual void releaseProxy(const Renderbuffer *proxy); 1.48 + 1.49 + virtual rx::RenderTarget *getRenderTarget() = 0; 1.50 + virtual rx::RenderTarget *getDepthStencil() = 0; 1.51 + 1.52 + virtual GLsizei getWidth() const = 0; 1.53 + virtual GLsizei getHeight() const = 0; 1.54 + virtual GLenum getInternalFormat() const = 0; 1.55 + virtual GLenum getActualFormat() const = 0; 1.56 + virtual GLsizei getSamples() const = 0; 1.57 + 1.58 + GLuint getRedSize() const; 1.59 + GLuint getGreenSize() const; 1.60 + GLuint getBlueSize() const; 1.61 + GLuint getAlphaSize() const; 1.62 + GLuint getDepthSize() const; 1.63 + GLuint getStencilSize() const; 1.64 + 1.65 + virtual unsigned int getSerial() const = 0; 1.66 + 1.67 + private: 1.68 + DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface); 1.69 +}; 1.70 + 1.71 +class RenderbufferTexture2D : public RenderbufferInterface 1.72 +{ 1.73 + public: 1.74 + RenderbufferTexture2D(Texture2D *texture, GLenum target); 1.75 + 1.76 + virtual ~RenderbufferTexture2D(); 1.77 + 1.78 + void addProxyRef(const Renderbuffer *proxy); 1.79 + void releaseProxy(const Renderbuffer *proxy); 1.80 + 1.81 + rx::RenderTarget *getRenderTarget(); 1.82 + rx::RenderTarget *getDepthStencil(); 1.83 + 1.84 + virtual GLsizei getWidth() const; 1.85 + virtual GLsizei getHeight() const; 1.86 + virtual GLenum getInternalFormat() const; 1.87 + virtual GLenum getActualFormat() const; 1.88 + virtual GLsizei getSamples() const; 1.89 + 1.90 + virtual unsigned int getSerial() const; 1.91 + 1.92 + private: 1.93 + DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D); 1.94 + 1.95 + BindingPointer <Texture2D> mTexture2D; 1.96 + GLenum mTarget; 1.97 +}; 1.98 + 1.99 +class RenderbufferTextureCubeMap : public RenderbufferInterface 1.100 +{ 1.101 + public: 1.102 + RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target); 1.103 + 1.104 + virtual ~RenderbufferTextureCubeMap(); 1.105 + 1.106 + void addProxyRef(const Renderbuffer *proxy); 1.107 + void releaseProxy(const Renderbuffer *proxy); 1.108 + 1.109 + rx::RenderTarget *getRenderTarget(); 1.110 + rx::RenderTarget *getDepthStencil(); 1.111 + 1.112 + virtual GLsizei getWidth() const; 1.113 + virtual GLsizei getHeight() const; 1.114 + virtual GLenum getInternalFormat() const; 1.115 + virtual GLenum getActualFormat() const; 1.116 + virtual GLsizei getSamples() const; 1.117 + 1.118 + virtual unsigned int getSerial() const; 1.119 + 1.120 + private: 1.121 + DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap); 1.122 + 1.123 + BindingPointer <TextureCubeMap> mTextureCubeMap; 1.124 + GLenum mTarget; 1.125 +}; 1.126 + 1.127 +// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 1.128 +// is called. The specific concrete type depends on whether the internal format is 1.129 +// colour depth, stencil or packed depth/stencil. 1.130 +class RenderbufferStorage : public RenderbufferInterface 1.131 +{ 1.132 + public: 1.133 + RenderbufferStorage(); 1.134 + 1.135 + virtual ~RenderbufferStorage() = 0; 1.136 + 1.137 + virtual rx::RenderTarget *getRenderTarget(); 1.138 + virtual rx::RenderTarget *getDepthStencil(); 1.139 + 1.140 + virtual GLsizei getWidth() const; 1.141 + virtual GLsizei getHeight() const; 1.142 + virtual GLenum getInternalFormat() const; 1.143 + virtual GLenum getActualFormat() const; 1.144 + virtual GLsizei getSamples() const; 1.145 + 1.146 + virtual unsigned int getSerial() const; 1.147 + 1.148 + static unsigned int issueSerial(); 1.149 + static unsigned int issueCubeSerials(); 1.150 + 1.151 + protected: 1.152 + GLsizei mWidth; 1.153 + GLsizei mHeight; 1.154 + GLenum mInternalFormat; 1.155 + GLenum mActualFormat; 1.156 + GLsizei mSamples; 1.157 + 1.158 + private: 1.159 + DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage); 1.160 + 1.161 + const unsigned int mSerial; 1.162 + 1.163 + static unsigned int mCurrentSerial; 1.164 +}; 1.165 + 1.166 +// Renderbuffer implements the GL renderbuffer object. 1.167 +// It's only a proxy for a RenderbufferInterface instance; the internal object 1.168 +// can change whenever glRenderbufferStorage is called. 1.169 +class Renderbuffer : public RefCountObject 1.170 +{ 1.171 + public: 1.172 + Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage); 1.173 + 1.174 + virtual ~Renderbuffer(); 1.175 + 1.176 + // These functions from RefCountObject are overloaded here because 1.177 + // Textures need to maintain their own count of references to them via 1.178 + // Renderbuffers/RenderbufferTextures. These functions invoke those 1.179 + // reference counting functions on the RenderbufferInterface. 1.180 + void addRef() const; 1.181 + void release() const; 1.182 + 1.183 + rx::RenderTarget *getRenderTarget(); 1.184 + rx::RenderTarget *getDepthStencil(); 1.185 + 1.186 + GLsizei getWidth() const; 1.187 + GLsizei getHeight() const; 1.188 + GLenum getInternalFormat() const; 1.189 + GLenum getActualFormat() const; 1.190 + GLuint getRedSize() const; 1.191 + GLuint getGreenSize() const; 1.192 + GLuint getBlueSize() const; 1.193 + GLuint getAlphaSize() const; 1.194 + GLuint getDepthSize() const; 1.195 + GLuint getStencilSize() const; 1.196 + GLsizei getSamples() const; 1.197 + 1.198 + unsigned int getSerial() const; 1.199 + 1.200 + void setStorage(RenderbufferStorage *newStorage); 1.201 + 1.202 + private: 1.203 + DISALLOW_COPY_AND_ASSIGN(Renderbuffer); 1.204 + 1.205 + RenderbufferInterface *mInstance; 1.206 +}; 1.207 + 1.208 +class Colorbuffer : public RenderbufferStorage 1.209 +{ 1.210 + public: 1.211 + Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); 1.212 + Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples); 1.213 + 1.214 + virtual ~Colorbuffer(); 1.215 + 1.216 + virtual rx::RenderTarget *getRenderTarget(); 1.217 + 1.218 + private: 1.219 + DISALLOW_COPY_AND_ASSIGN(Colorbuffer); 1.220 + 1.221 + rx::RenderTarget *mRenderTarget; 1.222 +}; 1.223 + 1.224 +class DepthStencilbuffer : public RenderbufferStorage 1.225 +{ 1.226 + public: 1.227 + DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); 1.228 + DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); 1.229 + 1.230 + ~DepthStencilbuffer(); 1.231 + 1.232 + virtual rx::RenderTarget *getDepthStencil(); 1.233 + 1.234 + protected: 1.235 + rx::RenderTarget *mDepthStencil; 1.236 + 1.237 + private: 1.238 + DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer); 1.239 +}; 1.240 + 1.241 +class Depthbuffer : public DepthStencilbuffer 1.242 +{ 1.243 + public: 1.244 + Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); 1.245 + 1.246 + virtual ~Depthbuffer(); 1.247 + 1.248 + private: 1.249 + DISALLOW_COPY_AND_ASSIGN(Depthbuffer); 1.250 +}; 1.251 + 1.252 +class Stencilbuffer : public DepthStencilbuffer 1.253 +{ 1.254 + public: 1.255 + Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); 1.256 + 1.257 + virtual ~Stencilbuffer(); 1.258 + 1.259 + private: 1.260 + DISALLOW_COPY_AND_ASSIGN(Stencilbuffer); 1.261 +}; 1.262 +} 1.263 + 1.264 +#endif // LIBGLESV2_RENDERBUFFER_H_