blob: 0220638c8831a144b19e25a37961ec93c0f9850c [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
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
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +00007// 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
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000010// 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
shannon.woods%transgaming.com@gtempaccount.comf26ddae2013-04-13 03:29:13 +000016#include <GLES3/gl3.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017#include <GLES2/gl2.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000018
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000019#include "common/angleutils.h"
apatrick@chromium.orgb66a7012012-01-23 20:04:48 +000020#include "common/RefCountObject.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021
daniel@transgaming.com70062c92012-11-28 19:32:30 +000022namespace rx
23{
24class Renderer;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000025class SwapChain;
26class RenderTarget;
Geoff Lang391c8c52013-09-17 17:05:51 -040027class TextureStorage;
daniel@transgaming.com70062c92012-11-28 19:32:30 +000028}
29
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000030namespace gl
31{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000032class Texture2D;
33class TextureCubeMap;
Geoff Langd5d8e392013-07-25 16:53:03 -040034class Texture3D;
35class Texture2DArray;
daniel@transgaming.com2678b342012-01-18 16:29:40 +000036class Renderbuffer;
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000037class Colorbuffer;
38class DepthStencilbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000039
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000040class RenderbufferInterface
41{
42 public:
43 RenderbufferInterface();
44
45 virtual ~RenderbufferInterface() {};
46
daniel@transgaming.com2678b342012-01-18 16:29:40 +000047 virtual void addProxyRef(const Renderbuffer *proxy);
48 virtual void releaseProxy(const Renderbuffer *proxy);
49
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000050 virtual rx::RenderTarget *getRenderTarget() = 0;
51 virtual rx::RenderTarget *getDepthStencil() = 0;
Geoff Lang391c8c52013-09-17 17:05:51 -040052 virtual rx::TextureStorage *getTextureStorage() = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000053
54 virtual GLsizei getWidth() const = 0;
55 virtual GLsizei getHeight() const = 0;
56 virtual GLenum getInternalFormat() const = 0;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000057 virtual GLenum getActualFormat() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000058 virtual GLsizei getSamples() const = 0;
59
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000060 virtual unsigned int getSerial() const = 0;
Geoff Lang784371d2014-05-16 12:39:04 -040061
62 virtual bool isTexture() const = 0;
Jamie Madillbfcda812013-10-22 13:07:33 -040063 virtual unsigned int getTextureSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000064
65 private:
66 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000067};
68
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000069class RenderbufferTexture2D : public RenderbufferInterface
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000070{
71 public:
Geoff Lang8040f572013-07-25 16:49:54 -040072 RenderbufferTexture2D(Texture2D *texture, GLint level);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000073
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000074 virtual ~RenderbufferTexture2D();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000075
daniel@transgaming.com2678b342012-01-18 16:29:40 +000076 void addProxyRef(const Renderbuffer *proxy);
77 void releaseProxy(const Renderbuffer *proxy);
78
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000079 rx::RenderTarget *getRenderTarget();
80 rx::RenderTarget *getDepthStencil();
Geoff Lang391c8c52013-09-17 17:05:51 -040081 rx::TextureStorage *getTextureStorage();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000082
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000083 virtual GLsizei getWidth() const;
84 virtual GLsizei getHeight() const;
85 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000086 virtual GLenum getActualFormat() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000087 virtual GLsizei getSamples() const;
88
89 virtual unsigned int getSerial() const;
Geoff Lang784371d2014-05-16 12:39:04 -040090
91 virtual bool isTexture() const;
Jamie Madillbfcda812013-10-22 13:07:33 -040092 virtual unsigned int getTextureSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000093
94 private:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000095 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000096
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000097 BindingPointer <Texture2D> mTexture2D;
Geoff Lang8040f572013-07-25 16:49:54 -040098 const GLint mLevel;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000099};
100
101class RenderbufferTextureCubeMap : public RenderbufferInterface
102{
103 public:
Geoff Lang8040f572013-07-25 16:49:54 -0400104 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000105
106 virtual ~RenderbufferTextureCubeMap();
107
108 void addProxyRef(const Renderbuffer *proxy);
109 void releaseProxy(const Renderbuffer *proxy);
110
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000111 rx::RenderTarget *getRenderTarget();
112 rx::RenderTarget *getDepthStencil();
Geoff Lang391c8c52013-09-17 17:05:51 -0400113 rx::TextureStorage *getTextureStorage();
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000114
115 virtual GLsizei getWidth() const;
116 virtual GLsizei getHeight() const;
117 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000118 virtual GLenum getActualFormat() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000119 virtual GLsizei getSamples() const;
120
121 virtual unsigned int getSerial() const;
Geoff Lang784371d2014-05-16 12:39:04 -0400122
123 virtual bool isTexture() const;
Jamie Madillbfcda812013-10-22 13:07:33 -0400124 virtual unsigned int getTextureSerial() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000125
126 private:
127 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
128
129 BindingPointer <TextureCubeMap> mTextureCubeMap;
Geoff Lang8040f572013-07-25 16:49:54 -0400130 const GLint mLevel;
131 const GLenum mFaceTarget;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000132};
133
Geoff Langd5d8e392013-07-25 16:53:03 -0400134class RenderbufferTexture3DLayer : public RenderbufferInterface
135{
136public:
137 RenderbufferTexture3DLayer(Texture3D *texture, GLint level, GLint layer);
138
139 virtual ~RenderbufferTexture3DLayer();
140
141 void addProxyRef(const Renderbuffer *proxy);
142 void releaseProxy(const Renderbuffer *proxy);
143
144 rx::RenderTarget *getRenderTarget();
145 rx::RenderTarget *getDepthStencil();
Geoff Lang391c8c52013-09-17 17:05:51 -0400146 rx::TextureStorage *getTextureStorage();
Geoff Langd5d8e392013-07-25 16:53:03 -0400147
148 virtual GLsizei getWidth() const;
149 virtual GLsizei getHeight() const;
150 virtual GLenum getInternalFormat() const;
151 virtual GLenum getActualFormat() const;
152 virtual GLsizei getSamples() const;
153
154 virtual unsigned int getSerial() const;
Geoff Lang784371d2014-05-16 12:39:04 -0400155
156 virtual bool isTexture() const;
Jamie Madillbfcda812013-10-22 13:07:33 -0400157 virtual unsigned int getTextureSerial() const;
Geoff Langd5d8e392013-07-25 16:53:03 -0400158
159private:
160 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture3DLayer);
161
162 BindingPointer<Texture3D> mTexture3D;
163 const GLint mLevel;
164 const GLint mLayer;
165};
166
167class RenderbufferTexture2DArrayLayer : public RenderbufferInterface
168{
169public:
170 RenderbufferTexture2DArrayLayer(Texture2DArray *texture, GLint level, GLint layer);
171
172 virtual ~RenderbufferTexture2DArrayLayer();
173
174 void addProxyRef(const Renderbuffer *proxy);
175 void releaseProxy(const Renderbuffer *proxy);
176
177 rx::RenderTarget *getRenderTarget();
178 rx::RenderTarget *getDepthStencil();
Geoff Lang391c8c52013-09-17 17:05:51 -0400179 rx::TextureStorage *getTextureStorage();
Geoff Langd5d8e392013-07-25 16:53:03 -0400180
181 virtual GLsizei getWidth() const;
182 virtual GLsizei getHeight() const;
183 virtual GLenum getInternalFormat() const;
184 virtual GLenum getActualFormat() const;
185 virtual GLsizei getSamples() const;
186
187 virtual unsigned int getSerial() const;
Geoff Lang784371d2014-05-16 12:39:04 -0400188
189 virtual bool isTexture() const;
Jamie Madillbfcda812013-10-22 13:07:33 -0400190 virtual unsigned int getTextureSerial() const;
Geoff Langd5d8e392013-07-25 16:53:03 -0400191
192private:
193 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2DArrayLayer);
194
195 BindingPointer<Texture2DArray> mTexture2DArray;
196 const GLint mLevel;
197 const GLint mLayer;
198};
199
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000200// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
201// is called. The specific concrete type depends on whether the internal format is
202// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000203class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000204{
205 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000206 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000207
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000208 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000210 virtual rx::RenderTarget *getRenderTarget();
211 virtual rx::RenderTarget *getDepthStencil();
Geoff Lang391c8c52013-09-17 17:05:51 -0400212 virtual rx::TextureStorage *getTextureStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000213
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000214 virtual GLsizei getWidth() const;
215 virtual GLsizei getHeight() const;
216 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000217 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000218 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000219
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000220 virtual unsigned int getSerial() const;
Geoff Lang784371d2014-05-16 12:39:04 -0400221
222 virtual bool isTexture() const;
223 virtual unsigned int getTextureSerial() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000224
Geoff Lang8040f572013-07-25 16:49:54 -0400225 static unsigned int issueSerials(GLuint count);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000226
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000227 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000228 GLsizei mWidth;
229 GLsizei mHeight;
230 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000231 GLenum mActualFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000232 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233
234 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000235 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000236
237 const unsigned int mSerial;
238
239 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000240};
241
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000242// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000243// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000244// can change whenever glRenderbufferStorage is called.
245class Renderbuffer : public RefCountObject
246{
247 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000248 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000249
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000250 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000251
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000252 // These functions from RefCountObject are overloaded here because
253 // Textures need to maintain their own count of references to them via
254 // Renderbuffers/RenderbufferTextures. These functions invoke those
255 // reference counting functions on the RenderbufferInterface.
256 void addRef() const;
257 void release() const;
258
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000259 rx::RenderTarget *getRenderTarget();
260 rx::RenderTarget *getDepthStencil();
Geoff Lang391c8c52013-09-17 17:05:51 -0400261 rx::TextureStorage *getTextureStorage();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000262
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000263 GLsizei getWidth() const;
264 GLsizei getHeight() const;
265 GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000266 GLenum getActualFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000267 GLuint getRedSize() const;
268 GLuint getGreenSize() const;
269 GLuint getBlueSize() const;
270 GLuint getAlphaSize() const;
271 GLuint getDepthSize() const;
272 GLuint getStencilSize() const;
Geoff Lang0a804792013-08-13 13:09:43 -0400273 GLenum getComponentType() const;
274 GLenum getColorEncoding() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000275 GLsizei getSamples() const;
276
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000277 unsigned int getSerial() const;
Geoff Lang784371d2014-05-16 12:39:04 -0400278
279 bool isTexture() const;
Jamie Madillbfcda812013-10-22 13:07:33 -0400280 unsigned int getTextureSerial() const;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000281
282 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000283
284 private:
285 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
286
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000287 rx::Renderer const *mRenderer;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000288 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000289};
290
291class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000292{
293 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000294 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
295 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000296
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000297 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000298
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000299 virtual rx::RenderTarget *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000300
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000301 private:
302 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000303
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000304 rx::RenderTarget *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000305};
306
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000307class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000308{
309 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000310 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
311 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000312
313 ~DepthStencilbuffer();
314
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000315 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000316
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000317 protected:
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000318 rx::RenderTarget *mDepthStencil;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000319
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000320 private:
321 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000322};
323
324class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325{
326 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000327 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000328
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000329 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000330
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000331 private:
332 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000333};
334
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000335class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000336{
337 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000338 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000339
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000340 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000341
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000342 private:
343 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344};
345}
346
347#endif // LIBGLESV2_RENDERBUFFER_H_