blob: eca2f3a780adca73aa5b4adeb03e0cc1fd3c84f2 [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
16#include <GLES2/gl2.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000017
alokp@chromium.orgea0e1af2010-03-22 19:33:14 +000018#include "common/angleutils.h"
apatrick@chromium.orgb66a7012012-01-23 20:04:48 +000019#include "common/RefCountObject.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000020
daniel@transgaming.com70062c92012-11-28 19:32:30 +000021namespace rx
22{
23class Renderer;
shannon.woods@transgaming.comd2811d62013-02-28 23:11:19 +000024class SwapChain;
25class RenderTarget;
daniel@transgaming.com70062c92012-11-28 19:32:30 +000026}
27
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028namespace gl
29{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000030class Texture2D;
31class TextureCubeMap;
daniel@transgaming.com2678b342012-01-18 16:29:40 +000032class Renderbuffer;
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000033class Colorbuffer;
34class DepthStencilbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000035
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000036class RenderbufferInterface
37{
38 public:
39 RenderbufferInterface();
40
41 virtual ~RenderbufferInterface() {};
42
daniel@transgaming.com2678b342012-01-18 16:29:40 +000043 virtual void addProxyRef(const Renderbuffer *proxy);
44 virtual void releaseProxy(const Renderbuffer *proxy);
45
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000046 virtual rx::RenderTarget *getRenderTarget() = 0;
47 virtual rx::RenderTarget *getDepthStencil() = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000048
49 virtual GLsizei getWidth() const = 0;
50 virtual GLsizei getHeight() const = 0;
51 virtual GLenum getInternalFormat() const = 0;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000052 virtual GLenum getActualFormat() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000053 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
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000062 virtual unsigned int getSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000063
64 private:
65 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000066};
67
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000068class RenderbufferTexture2D : public RenderbufferInterface
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000069{
70 public:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000071 RenderbufferTexture2D(Texture2D *texture, GLenum target);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000072
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000073 virtual ~RenderbufferTexture2D();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000074
daniel@transgaming.com2678b342012-01-18 16:29:40 +000075 void addProxyRef(const Renderbuffer *proxy);
76 void releaseProxy(const Renderbuffer *proxy);
77
daniel@transgaming.comd186dc72012-11-28 19:40:16 +000078 rx::RenderTarget *getRenderTarget();
79 rx::RenderTarget *getDepthStencil();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000080
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000081 virtual GLsizei getWidth() const;
82 virtual GLsizei getHeight() const;
83 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000084 virtual GLenum getActualFormat() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000085 virtual GLsizei getSamples() const;
86
87 virtual unsigned int getSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000088
89 private:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000090 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000091
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000092 BindingPointer <Texture2D> mTexture2D;
93 GLenum mTarget;
94};
95
96class 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
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000106 rx::RenderTarget *getRenderTarget();
107 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000108
109 virtual GLsizei getWidth() const;
110 virtual GLsizei getHeight() const;
111 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000112 virtual GLenum getActualFormat() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000113 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;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000121 GLenum mTarget;
122};
123
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000124// 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.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000127class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000128{
129 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000130 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000131
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000132 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000133
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000134 virtual rx::RenderTarget *getRenderTarget();
135 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000137 virtual GLsizei getWidth() const;
138 virtual GLsizei getHeight() const;
139 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000140 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000141 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000142
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000143 virtual unsigned int getSerial() const;
144
145 static unsigned int issueSerial();
146 static unsigned int issueCubeSerials();
147
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000148 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000149 GLsizei mWidth;
150 GLsizei mHeight;
151 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000152 GLenum mActualFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000153 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154
155 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000156 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000157
158 const unsigned int mSerial;
159
160 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000161};
162
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000163// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000164// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000165// can change whenever glRenderbufferStorage is called.
166class Renderbuffer : public RefCountObject
167{
168 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000169 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000170
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000171 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000172
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000173 // 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
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000180 rx::RenderTarget *getRenderTarget();
181 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000182
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000183 GLsizei getWidth() const;
184 GLsizei getHeight() const;
185 GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000186 GLenum getActualFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000187 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
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000195 unsigned int getSerial() const;
196
197 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000198
199 private:
200 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
201
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000202 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000203};
204
205class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000206{
207 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000208 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
209 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000210
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000211 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000213 virtual rx::RenderTarget *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000214
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000215 private:
216 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000217
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000218 rx::RenderTarget *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000219};
220
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000221class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000222{
223 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000224 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
225 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000226
227 ~DepthStencilbuffer();
228
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000229 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000230
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000231 protected:
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000232 rx::RenderTarget *mDepthStencil;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000233
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000234 private:
235 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000236};
237
238class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239{
240 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000241 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000242
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000243 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000244
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000245 private:
246 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000247};
248
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000249class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000250{
251 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000252 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000254 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000255
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256 private:
257 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258};
259}
260
261#endif // LIBGLESV2_RENDERBUFFER_H_