blob: 1d359a8555bcb2ab8e7b4dff8dfb0e19744352dd [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;
daniel@transgaming.com70062c92012-11-28 19:32:30 +000027}
28
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000029namespace gl
30{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000031class Texture2D;
32class TextureCubeMap;
Geoff Langd5d8e392013-07-25 16:53:03 -040033class Texture3D;
34class Texture2DArray;
daniel@transgaming.com2678b342012-01-18 16:29:40 +000035class Renderbuffer;
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000036class Colorbuffer;
37class DepthStencilbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000038
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000039class RenderbufferInterface
40{
41 public:
42 RenderbufferInterface();
43
44 virtual ~RenderbufferInterface() {};
45
daniel@transgaming.com2678b342012-01-18 16:29:40 +000046 virtual void addProxyRef(const Renderbuffer *proxy);
47 virtual void releaseProxy(const Renderbuffer *proxy);
48
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000049 virtual rx::RenderTarget *getRenderTarget() = 0;
50 virtual rx::RenderTarget *getDepthStencil() = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000051
52 virtual GLsizei getWidth() const = 0;
53 virtual GLsizei getHeight() const = 0;
54 virtual GLenum getInternalFormat() const = 0;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000055 virtual GLenum getActualFormat() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000056 virtual GLsizei getSamples() const = 0;
57
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000058 virtual unsigned int getSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000059
60 private:
61 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000062};
63
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000064class RenderbufferTexture2D : public RenderbufferInterface
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000065{
66 public:
Geoff Lang8040f572013-07-25 16:49:54 -040067 RenderbufferTexture2D(Texture2D *texture, GLint level);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000068
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000069 virtual ~RenderbufferTexture2D();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000070
daniel@transgaming.com2678b342012-01-18 16:29:40 +000071 void addProxyRef(const Renderbuffer *proxy);
72 void releaseProxy(const Renderbuffer *proxy);
73
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000074 rx::RenderTarget *getRenderTarget();
75 rx::RenderTarget *getDepthStencil();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000076
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000077 virtual GLsizei getWidth() const;
78 virtual GLsizei getHeight() const;
79 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000080 virtual GLenum getActualFormat() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000081 virtual GLsizei getSamples() const;
82
83 virtual unsigned int getSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000084
85 private:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000086 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000087
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000088 BindingPointer <Texture2D> mTexture2D;
Geoff Lang8040f572013-07-25 16:49:54 -040089 const GLint mLevel;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000090};
91
92class RenderbufferTextureCubeMap : public RenderbufferInterface
93{
94 public:
Geoff Lang8040f572013-07-25 16:49:54 -040095 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000096
97 virtual ~RenderbufferTextureCubeMap();
98
99 void addProxyRef(const Renderbuffer *proxy);
100 void releaseProxy(const Renderbuffer *proxy);
101
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000102 rx::RenderTarget *getRenderTarget();
103 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000104
105 virtual GLsizei getWidth() const;
106 virtual GLsizei getHeight() const;
107 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000108 virtual GLenum getActualFormat() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000109 virtual GLsizei getSamples() const;
110
111 virtual unsigned int getSerial() const;
112
113 private:
114 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
115
116 BindingPointer <TextureCubeMap> mTextureCubeMap;
Geoff Lang8040f572013-07-25 16:49:54 -0400117 const GLint mLevel;
118 const GLenum mFaceTarget;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000119};
120
Geoff Langd5d8e392013-07-25 16:53:03 -0400121class RenderbufferTexture3DLayer : public RenderbufferInterface
122{
123public:
124 RenderbufferTexture3DLayer(Texture3D *texture, GLint level, GLint layer);
125
126 virtual ~RenderbufferTexture3DLayer();
127
128 void addProxyRef(const Renderbuffer *proxy);
129 void releaseProxy(const Renderbuffer *proxy);
130
131 rx::RenderTarget *getRenderTarget();
132 rx::RenderTarget *getDepthStencil();
133
134 virtual GLsizei getWidth() const;
135 virtual GLsizei getHeight() const;
136 virtual GLenum getInternalFormat() const;
137 virtual GLenum getActualFormat() const;
138 virtual GLsizei getSamples() const;
139
140 virtual unsigned int getSerial() const;
141
142private:
143 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture3DLayer);
144
145 BindingPointer<Texture3D> mTexture3D;
146 const GLint mLevel;
147 const GLint mLayer;
148};
149
150class RenderbufferTexture2DArrayLayer : public RenderbufferInterface
151{
152public:
153 RenderbufferTexture2DArrayLayer(Texture2DArray *texture, GLint level, GLint layer);
154
155 virtual ~RenderbufferTexture2DArrayLayer();
156
157 void addProxyRef(const Renderbuffer *proxy);
158 void releaseProxy(const Renderbuffer *proxy);
159
160 rx::RenderTarget *getRenderTarget();
161 rx::RenderTarget *getDepthStencil();
162
163 virtual GLsizei getWidth() const;
164 virtual GLsizei getHeight() const;
165 virtual GLenum getInternalFormat() const;
166 virtual GLenum getActualFormat() const;
167 virtual GLsizei getSamples() const;
168
169 virtual unsigned int getSerial() const;
170
171private:
172 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2DArrayLayer);
173
174 BindingPointer<Texture2DArray> mTexture2DArray;
175 const GLint mLevel;
176 const GLint mLayer;
177};
178
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000179// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
180// is called. The specific concrete type depends on whether the internal format is
181// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000182class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000183{
184 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000185 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000186
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000187 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000188
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000189 virtual rx::RenderTarget *getRenderTarget();
190 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000191
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000192 virtual GLsizei getWidth() const;
193 virtual GLsizei getHeight() const;
194 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000195 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000196 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000197
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000198 virtual unsigned int getSerial() const;
199
Geoff Lang8040f572013-07-25 16:49:54 -0400200 static unsigned int issueSerials(GLuint count);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000201
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000202 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000203 GLsizei mWidth;
204 GLsizei mHeight;
205 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000206 GLenum mActualFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000207 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208
209 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000210 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000211
212 const unsigned int mSerial;
213
214 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000215};
216
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000217// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000218// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000219// can change whenever glRenderbufferStorage is called.
220class Renderbuffer : public RefCountObject
221{
222 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000223 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000224
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000225 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000226
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000227 // These functions from RefCountObject are overloaded here because
228 // Textures need to maintain their own count of references to them via
229 // Renderbuffers/RenderbufferTextures. These functions invoke those
230 // reference counting functions on the RenderbufferInterface.
231 void addRef() const;
232 void release() const;
233
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000234 rx::RenderTarget *getRenderTarget();
235 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000236
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000237 GLsizei getWidth() const;
238 GLsizei getHeight() const;
239 GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000240 GLenum getActualFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000241 GLuint getRedSize() const;
242 GLuint getGreenSize() const;
243 GLuint getBlueSize() const;
244 GLuint getAlphaSize() const;
245 GLuint getDepthSize() const;
246 GLuint getStencilSize() const;
247 GLsizei getSamples() const;
248
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000249 unsigned int getSerial() const;
250
251 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000252
253 private:
254 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
255
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000256 rx::Renderer const *mRenderer;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000257 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000258};
259
260class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261{
262 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000263 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
264 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000265
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000266 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000267
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000268 virtual rx::RenderTarget *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000269
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270 private:
271 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000272
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000273 rx::RenderTarget *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000274};
275
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000276class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000277{
278 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000279 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
280 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000281
282 ~DepthStencilbuffer();
283
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000284 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000285
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000286 protected:
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000287 rx::RenderTarget *mDepthStencil;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000288
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000289 private:
290 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000291};
292
293class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000294{
295 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000296 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000297
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000298 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000299
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000300 private:
301 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000302};
303
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000304class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000305{
306 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000307 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000308
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000309 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000310
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000311 private:
312 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000313};
314}
315
316#endif // LIBGLESV2_RENDERBUFFER_H_