blob: 5e66bb28b53fb5fd823c296110c1a5e2eb33bdb7 [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;
Jamie Madillbfcda812013-10-22 13:07:33 -040059 virtual unsigned int getTextureSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000060
61 private:
62 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000063};
64
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000065class RenderbufferTexture2D : public RenderbufferInterface
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000066{
67 public:
Geoff Lang8040f572013-07-25 16:49:54 -040068 RenderbufferTexture2D(Texture2D *texture, GLint level);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000069
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000070 virtual ~RenderbufferTexture2D();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000071
daniel@transgaming.com2678b342012-01-18 16:29:40 +000072 void addProxyRef(const Renderbuffer *proxy);
73 void releaseProxy(const Renderbuffer *proxy);
74
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000075 rx::RenderTarget *getRenderTarget();
76 rx::RenderTarget *getDepthStencil();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000077
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000078 virtual GLsizei getWidth() const;
79 virtual GLsizei getHeight() const;
80 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000081 virtual GLenum getActualFormat() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000082 virtual GLsizei getSamples() const;
83
84 virtual unsigned int getSerial() const;
Jamie Madillbfcda812013-10-22 13:07:33 -040085 virtual unsigned int getTextureSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000086
87 private:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000088 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000089
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000090 BindingPointer <Texture2D> mTexture2D;
Geoff Lang8040f572013-07-25 16:49:54 -040091 const GLint mLevel;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000092};
93
94class RenderbufferTextureCubeMap : public RenderbufferInterface
95{
96 public:
Geoff Lang8040f572013-07-25 16:49:54 -040097 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000098
99 virtual ~RenderbufferTextureCubeMap();
100
101 void addProxyRef(const Renderbuffer *proxy);
102 void releaseProxy(const Renderbuffer *proxy);
103
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000104 rx::RenderTarget *getRenderTarget();
105 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000106
107 virtual GLsizei getWidth() const;
108 virtual GLsizei getHeight() const;
109 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000110 virtual GLenum getActualFormat() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000111 virtual GLsizei getSamples() const;
112
113 virtual unsigned int getSerial() const;
Jamie Madillbfcda812013-10-22 13:07:33 -0400114 virtual unsigned int getTextureSerial() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000115
116 private:
117 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
118
119 BindingPointer <TextureCubeMap> mTextureCubeMap;
Geoff Lang8040f572013-07-25 16:49:54 -0400120 const GLint mLevel;
121 const GLenum mFaceTarget;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000122};
123
Geoff Langd5d8e392013-07-25 16:53:03 -0400124class RenderbufferTexture3DLayer : public RenderbufferInterface
125{
126public:
127 RenderbufferTexture3DLayer(Texture3D *texture, GLint level, GLint layer);
128
129 virtual ~RenderbufferTexture3DLayer();
130
131 void addProxyRef(const Renderbuffer *proxy);
132 void releaseProxy(const Renderbuffer *proxy);
133
134 rx::RenderTarget *getRenderTarget();
135 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;
Jamie Madillbfcda812013-10-22 13:07:33 -0400144 virtual unsigned int getTextureSerial() const;
Geoff Langd5d8e392013-07-25 16:53:03 -0400145
146private:
147 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture3DLayer);
148
149 BindingPointer<Texture3D> mTexture3D;
150 const GLint mLevel;
151 const GLint mLayer;
152};
153
154class RenderbufferTexture2DArrayLayer : public RenderbufferInterface
155{
156public:
157 RenderbufferTexture2DArrayLayer(Texture2DArray *texture, GLint level, GLint layer);
158
159 virtual ~RenderbufferTexture2DArrayLayer();
160
161 void addProxyRef(const Renderbuffer *proxy);
162 void releaseProxy(const Renderbuffer *proxy);
163
164 rx::RenderTarget *getRenderTarget();
165 rx::RenderTarget *getDepthStencil();
166
167 virtual GLsizei getWidth() const;
168 virtual GLsizei getHeight() const;
169 virtual GLenum getInternalFormat() const;
170 virtual GLenum getActualFormat() const;
171 virtual GLsizei getSamples() const;
172
173 virtual unsigned int getSerial() const;
Jamie Madillbfcda812013-10-22 13:07:33 -0400174 virtual unsigned int getTextureSerial() const;
Geoff Langd5d8e392013-07-25 16:53:03 -0400175
176private:
177 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2DArrayLayer);
178
179 BindingPointer<Texture2DArray> mTexture2DArray;
180 const GLint mLevel;
181 const GLint mLayer;
182};
183
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000184// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
185// is called. The specific concrete type depends on whether the internal format is
186// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000187class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000188{
189 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000190 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000191
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000192 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000193
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000194 virtual rx::RenderTarget *getRenderTarget();
195 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000196
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000197 virtual GLsizei getWidth() const;
198 virtual GLsizei getHeight() const;
199 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000200 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000201 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000202
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000203 virtual unsigned int getSerial() const;
Jamie Madillbfcda812013-10-22 13:07:33 -0400204 virtual unsigned int getTextureSerial() const { return 0; }
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000205
Geoff Lang8040f572013-07-25 16:49:54 -0400206 static unsigned int issueSerials(GLuint count);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000207
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000209 GLsizei mWidth;
210 GLsizei mHeight;
211 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000212 GLenum mActualFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000213 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000214
215 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000216 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000217
218 const unsigned int mSerial;
219
220 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000221};
222
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000223// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000224// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000225// can change whenever glRenderbufferStorage is called.
226class Renderbuffer : public RefCountObject
227{
228 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000229 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000230
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000231 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000232
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000233 // These functions from RefCountObject are overloaded here because
234 // Textures need to maintain their own count of references to them via
235 // Renderbuffers/RenderbufferTextures. These functions invoke those
236 // reference counting functions on the RenderbufferInterface.
237 void addRef() const;
238 void release() const;
239
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000240 rx::RenderTarget *getRenderTarget();
241 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000242
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000243 GLsizei getWidth() const;
244 GLsizei getHeight() const;
245 GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000246 GLenum getActualFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000247 GLuint getRedSize() const;
248 GLuint getGreenSize() const;
249 GLuint getBlueSize() const;
250 GLuint getAlphaSize() const;
251 GLuint getDepthSize() const;
252 GLuint getStencilSize() const;
Geoff Lang0a804792013-08-13 13:09:43 -0400253 GLenum getComponentType() const;
254 GLenum getColorEncoding() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000255 GLsizei getSamples() const;
256
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000257 unsigned int getSerial() const;
Jamie Madillbfcda812013-10-22 13:07:33 -0400258 unsigned int getTextureSerial() const;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000259
260 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000261
262 private:
263 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
264
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000265 rx::Renderer const *mRenderer;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000266 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000267};
268
269class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270{
271 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000272 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
273 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000274
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000275 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000276
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000277 virtual rx::RenderTarget *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000278
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000279 private:
280 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000281
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000282 rx::RenderTarget *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000283};
284
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000285class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000286{
287 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000288 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
289 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000290
291 ~DepthStencilbuffer();
292
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000293 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000294
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000295 protected:
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000296 rx::RenderTarget *mDepthStencil;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000297
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000298 private:
299 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000300};
301
302class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000303{
304 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000305 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000306
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000307 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000308
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000309 private:
310 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000311};
312
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000313class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000314{
315 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000316 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000317
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000318 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000319
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320 private:
321 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000322};
323}
324
325#endif // LIBGLESV2_RENDERBUFFER_H_