blob: 103be971d052f740a09a6c86537805972af4da1f [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;
daniel@transgaming.com2678b342012-01-18 16:29:40 +000033class Renderbuffer;
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000034class Colorbuffer;
35class DepthStencilbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000036
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000037class RenderbufferInterface
38{
39 public:
40 RenderbufferInterface();
41
42 virtual ~RenderbufferInterface() {};
43
daniel@transgaming.com2678b342012-01-18 16:29:40 +000044 virtual void addProxyRef(const Renderbuffer *proxy);
45 virtual void releaseProxy(const Renderbuffer *proxy);
46
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000047 virtual rx::RenderTarget *getRenderTarget() = 0;
48 virtual rx::RenderTarget *getDepthStencil() = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000049
50 virtual GLsizei getWidth() const = 0;
51 virtual GLsizei getHeight() const = 0;
52 virtual GLenum getInternalFormat() const = 0;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000053 virtual GLenum getActualFormat() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000054 virtual GLsizei getSamples() const = 0;
55
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000056 virtual unsigned int getSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000057
58 private:
59 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000060};
61
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000062class RenderbufferTexture2D : public RenderbufferInterface
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000063{
64 public:
Geoff Lang8040f572013-07-25 16:49:54 -040065 RenderbufferTexture2D(Texture2D *texture, GLint level);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000066
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000067 virtual ~RenderbufferTexture2D();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000068
daniel@transgaming.com2678b342012-01-18 16:29:40 +000069 void addProxyRef(const Renderbuffer *proxy);
70 void releaseProxy(const Renderbuffer *proxy);
71
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000072 rx::RenderTarget *getRenderTarget();
73 rx::RenderTarget *getDepthStencil();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000074
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000075 virtual GLsizei getWidth() const;
76 virtual GLsizei getHeight() const;
77 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000078 virtual GLenum getActualFormat() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000079 virtual GLsizei getSamples() const;
80
81 virtual unsigned int getSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000082
83 private:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000084 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000085
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000086 BindingPointer <Texture2D> mTexture2D;
Geoff Lang8040f572013-07-25 16:49:54 -040087 const GLint mLevel;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000088};
89
90class RenderbufferTextureCubeMap : public RenderbufferInterface
91{
92 public:
Geoff Lang8040f572013-07-25 16:49:54 -040093 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level);
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000094
95 virtual ~RenderbufferTextureCubeMap();
96
97 void addProxyRef(const Renderbuffer *proxy);
98 void releaseProxy(const Renderbuffer *proxy);
99
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000100 rx::RenderTarget *getRenderTarget();
101 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000102
103 virtual GLsizei getWidth() const;
104 virtual GLsizei getHeight() const;
105 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000106 virtual GLenum getActualFormat() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000107 virtual GLsizei getSamples() const;
108
109 virtual unsigned int getSerial() const;
110
111 private:
112 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
113
114 BindingPointer <TextureCubeMap> mTextureCubeMap;
Geoff Lang8040f572013-07-25 16:49:54 -0400115 const GLint mLevel;
116 const GLenum mFaceTarget;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000117};
118
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000119// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
120// is called. The specific concrete type depends on whether the internal format is
121// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000122class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000123{
124 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000125 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000126
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000127 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000128
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000129 virtual rx::RenderTarget *getRenderTarget();
130 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000131
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000132 virtual GLsizei getWidth() const;
133 virtual GLsizei getHeight() const;
134 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000135 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000136 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000137
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000138 virtual unsigned int getSerial() const;
139
Geoff Lang8040f572013-07-25 16:49:54 -0400140 static unsigned int issueSerials(GLuint count);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000141
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000143 GLsizei mWidth;
144 GLsizei mHeight;
145 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000146 GLenum mActualFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000147 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148
149 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000150 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000151
152 const unsigned int mSerial;
153
154 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000155};
156
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000157// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000158// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000159// can change whenever glRenderbufferStorage is called.
160class Renderbuffer : public RefCountObject
161{
162 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000163 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000164
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000165 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000166
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000167 // These functions from RefCountObject are overloaded here because
168 // Textures need to maintain their own count of references to them via
169 // Renderbuffers/RenderbufferTextures. These functions invoke those
170 // reference counting functions on the RenderbufferInterface.
171 void addRef() const;
172 void release() const;
173
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000174 rx::RenderTarget *getRenderTarget();
175 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000176
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000177 GLsizei getWidth() const;
178 GLsizei getHeight() const;
179 GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000180 GLenum getActualFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000181 GLuint getRedSize() const;
182 GLuint getGreenSize() const;
183 GLuint getBlueSize() const;
184 GLuint getAlphaSize() const;
185 GLuint getDepthSize() const;
186 GLuint getStencilSize() const;
187 GLsizei getSamples() const;
188
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000189 unsigned int getSerial() const;
190
191 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000192
193 private:
194 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
195
shannonwoods@chromium.orgf6fb9592013-05-30 00:09:40 +0000196 rx::Renderer const *mRenderer;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000197 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000198};
199
200class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000201{
202 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000203 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
204 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000205
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000206 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000207
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000208 virtual rx::RenderTarget *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000210 private:
211 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000212
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000213 rx::RenderTarget *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000214};
215
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000216class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000217{
218 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000219 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
220 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000221
222 ~DepthStencilbuffer();
223
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000224 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000225
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000226 protected:
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000227 rx::RenderTarget *mDepthStencil;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000228
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000229 private:
230 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000231};
232
233class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000234{
235 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000236 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000237
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000238 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000240 private:
241 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000242};
243
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000244class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000245{
246 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000247 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000248
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000249 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000250
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000251 private:
252 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253};
254}
255
256#endif // LIBGLESV2_RENDERBUFFER_H_