1 // 2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // Renderbuffer.h: Defines the wrapper class gl::Renderbuffer, as well as the 8 // class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer, 9 // DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer 10 // objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108. 11 12 #ifndef LIBGLESV2_RENDERBUFFER_H_ 13 #define LIBGLESV2_RENDERBUFFER_H_ 14 15 #define GL_APICALL 16 #include <GLES2/gl2.h> 17 18 #include "common/angleutils.h" 19 #include "common/RefCountObject.h" 20 21 namespace rx 22 { 23 class Renderer; 24 class SwapChain; 25 class RenderTarget; 26 } 27 28 namespace gl 29 { 30 class Texture2D; 31 class TextureCubeMap; 32 class Renderbuffer; 33 class Colorbuffer; 34 class DepthStencilbuffer; 35 36 class RenderbufferInterface 37 { 38 public: 39 RenderbufferInterface(); 40 41 virtual ~RenderbufferInterface() {}; 42 43 virtual void addProxyRef(const Renderbuffer *proxy); 44 virtual void releaseProxy(const Renderbuffer *proxy); 45 46 virtual rx::RenderTarget *getRenderTarget() = 0; 47 virtual rx::RenderTarget *getDepthStencil() = 0; 48 49 virtual GLsizei getWidth() const = 0; 50 virtual GLsizei getHeight() const = 0; 51 virtual GLenum getInternalFormat() const = 0; 52 virtual GLenum getActualFormat() const = 0; 53 virtual GLsizei getSamples() const = 0; 54 55 GLuint getRedSize() const; 56 GLuint getGreenSize() const; 57 GLuint getBlueSize() const; 58 GLuint getAlphaSize() const; 59 GLuint getDepthSize() const; 60 GLuint getStencilSize() const; 61 62 virtual unsigned int getSerial() const = 0; 63 64 private: 65 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface); 66 }; 67 68 class RenderbufferTexture2D : public RenderbufferInterface 69 { 70 public: 71 RenderbufferTexture2D(Texture2D *texture, GLenum target); 72 73 virtual ~RenderbufferTexture2D(); 74 75 void addProxyRef(const Renderbuffer *proxy); 76 void releaseProxy(const Renderbuffer *proxy); 77 78 rx::RenderTarget *getRenderTarget(); 79 rx::RenderTarget *getDepthStencil(); 80 81 virtual GLsizei getWidth() const; 82 virtual GLsizei getHeight() const; 83 virtual GLenum getInternalFormat() const; 84 virtual GLenum getActualFormat() const; 85 virtual GLsizei getSamples() const; 86 87 virtual unsigned int getSerial() const; 88 89 private: 90 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D); 91 92 BindingPointer <Texture2D> mTexture2D; 93 GLenum mTarget; 94 }; 95 96 class RenderbufferTextureCubeMap : public RenderbufferInterface 97 { 98 public: 99 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target); 100 101 virtual ~RenderbufferTextureCubeMap(); 102 103 void addProxyRef(const Renderbuffer *proxy); 104 void releaseProxy(const Renderbuffer *proxy); 105 106 rx::RenderTarget *getRenderTarget(); 107 rx::RenderTarget *getDepthStencil(); 108 109 virtual GLsizei getWidth() const; 110 virtual GLsizei getHeight() const; 111 virtual GLenum getInternalFormat() const; 112 virtual GLenum getActualFormat() const; 113 virtual GLsizei getSamples() const; 114 115 virtual unsigned int getSerial() const; 116 117 private: 118 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap); 119 120 BindingPointer <TextureCubeMap> mTextureCubeMap; 121 GLenum mTarget; 122 }; 123 124 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage 125 // is called. The specific concrete type depends on whether the internal format is 126 // colour depth, stencil or packed depth/stencil. 127 class RenderbufferStorage : public RenderbufferInterface 128 { 129 public: 130 RenderbufferStorage(); 131 132 virtual ~RenderbufferStorage() = 0; 133 134 virtual rx::RenderTarget *getRenderTarget(); 135 virtual rx::RenderTarget *getDepthStencil(); 136 137 virtual GLsizei getWidth() const; 138 virtual GLsizei getHeight() const; 139 virtual GLenum getInternalFormat() const; 140 virtual GLenum getActualFormat() const; 141 virtual GLsizei getSamples() const; 142 143 virtual unsigned int getSerial() const; 144 145 static unsigned int issueSerial(); 146 static unsigned int issueCubeSerials(); 147 148 protected: 149 GLsizei mWidth; 150 GLsizei mHeight; 151 GLenum mInternalFormat; 152 GLenum mActualFormat; 153 GLsizei mSamples; 154 155 private: 156 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage); 157 158 const unsigned int mSerial; 159 160 static unsigned int mCurrentSerial; 161 }; 162 163 // Renderbuffer implements the GL renderbuffer object. 164 // It's only a proxy for a RenderbufferInterface instance; the internal object 165 // can change whenever glRenderbufferStorage is called. 166 class Renderbuffer : public RefCountObject 167 { 168 public: 169 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage); 170 171 virtual ~Renderbuffer(); 172 173 // These functions from RefCountObject are overloaded here because 174 // Textures need to maintain their own count of references to them via 175 // Renderbuffers/RenderbufferTextures. These functions invoke those 176 // reference counting functions on the RenderbufferInterface. 177 void addRef() const; 178 void release() const; 179 180 rx::RenderTarget *getRenderTarget(); 181 rx::RenderTarget *getDepthStencil(); 182 183 GLsizei getWidth() const; 184 GLsizei getHeight() const; 185 GLenum getInternalFormat() const; 186 GLenum getActualFormat() const; 187 GLuint getRedSize() const; 188 GLuint getGreenSize() const; 189 GLuint getBlueSize() const; 190 GLuint getAlphaSize() const; 191 GLuint getDepthSize() const; 192 GLuint getStencilSize() const; 193 GLsizei getSamples() const; 194 195 unsigned int getSerial() const; 196 197 void setStorage(RenderbufferStorage *newStorage); 198 199 private: 200 DISALLOW_COPY_AND_ASSIGN(Renderbuffer); 201 202 RenderbufferInterface *mInstance; 203 }; 204 205 class Colorbuffer : public RenderbufferStorage 206 { 207 public: 208 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); 209 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples); 210 211 virtual ~Colorbuffer(); 212 213 virtual rx::RenderTarget *getRenderTarget(); 214 215 private: 216 DISALLOW_COPY_AND_ASSIGN(Colorbuffer); 217 218 rx::RenderTarget *mRenderTarget; 219 }; 220 221 class DepthStencilbuffer : public RenderbufferStorage 222 { 223 public: 224 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain); 225 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); 226 227 ~DepthStencilbuffer(); 228 229 virtual rx::RenderTarget *getDepthStencil(); 230 231 protected: 232 rx::RenderTarget *mDepthStencil; 233 234 private: 235 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer); 236 }; 237 238 class Depthbuffer : public DepthStencilbuffer 239 { 240 public: 241 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); 242 243 virtual ~Depthbuffer(); 244 245 private: 246 DISALLOW_COPY_AND_ASSIGN(Depthbuffer); 247 }; 248 249 class Stencilbuffer : public DepthStencilbuffer 250 { 251 public: 252 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples); 253 254 virtual ~Stencilbuffer(); 255 256 private: 257 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer); 258 }; 259 } 260 261 #endif // LIBGLESV2_RENDERBUFFER_H_ 262