blob: 4e0db27936866c7a310622bcc89fb233b7a7f0f6 [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.com96c38932012-10-31 18:42:52 +000021#include "renderer/SwapChain.h"
daniel@transgaming.com042d1b42012-11-28 19:37:09 +000022#include "renderer/RenderTarget.h"
daniel@transgaming.com96c38932012-10-31 18:42:52 +000023
daniel@transgaming.com70062c92012-11-28 19:32:30 +000024namespace rx
25{
26class Renderer;
27}
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
56 GLuint getRedSize() const;
57 GLuint getGreenSize() const;
58 GLuint getBlueSize() const;
59 GLuint getAlphaSize() const;
60 GLuint getDepthSize() const;
61 GLuint getStencilSize() const;
62
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000063 virtual unsigned int getSerial() 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:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000072 RenderbufferTexture2D(Texture2D *texture, GLenum target);
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();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000081
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000082 virtual GLsizei getWidth() const;
83 virtual GLsizei getHeight() const;
84 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000085 virtual GLenum getActualFormat() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000086 virtual GLsizei getSamples() const;
87
88 virtual unsigned int getSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000089
90 private:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000091 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000092
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000093 BindingPointer <Texture2D> mTexture2D;
94 GLenum mTarget;
95};
96
97class RenderbufferTextureCubeMap : public RenderbufferInterface
98{
99 public:
100 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
101
102 virtual ~RenderbufferTextureCubeMap();
103
104 void addProxyRef(const Renderbuffer *proxy);
105 void releaseProxy(const Renderbuffer *proxy);
106
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000107 rx::RenderTarget *getRenderTarget();
108 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000109
110 virtual GLsizei getWidth() const;
111 virtual GLsizei getHeight() const;
112 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000113 virtual GLenum getActualFormat() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000114 virtual GLsizei getSamples() const;
115
116 virtual unsigned int getSerial() const;
117
118 private:
119 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
120
121 BindingPointer <TextureCubeMap> mTextureCubeMap;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000122 GLenum mTarget;
123};
124
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000125// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
126// is called. The specific concrete type depends on whether the internal format is
127// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000128class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000129{
130 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000131 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000132
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000133 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000134
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000135 virtual rx::RenderTarget *getRenderTarget();
136 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000138 virtual GLsizei getWidth() const;
139 virtual GLsizei getHeight() const;
140 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000141 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000142 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000143
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000144 virtual unsigned int getSerial() const;
145
146 static unsigned int issueSerial();
147 static unsigned int issueCubeSerials();
148
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000149 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000150 GLsizei mWidth;
151 GLsizei mHeight;
152 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000153 GLenum mActualFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000154 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000155
156 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000157 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000158
159 const unsigned int mSerial;
160
161 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000162};
163
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000164// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000165// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000166// can change whenever glRenderbufferStorage is called.
167class Renderbuffer : public RefCountObject
168{
169 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000170 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000171
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000172 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000173
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000174 // These functions from RefCountObject are overloaded here because
175 // Textures need to maintain their own count of references to them via
176 // Renderbuffers/RenderbufferTextures. These functions invoke those
177 // reference counting functions on the RenderbufferInterface.
178 void addRef() const;
179 void release() const;
180
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000181 rx::RenderTarget *getRenderTarget();
182 rx::RenderTarget *getDepthStencil();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000183
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000184 GLsizei getWidth() const;
185 GLsizei getHeight() const;
186 GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000187 GLenum getActualFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000188 GLuint getRedSize() const;
189 GLuint getGreenSize() const;
190 GLuint getBlueSize() const;
191 GLuint getAlphaSize() const;
192 GLuint getDepthSize() const;
193 GLuint getStencilSize() const;
194 GLsizei getSamples() const;
195
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000196 unsigned int getSerial() const;
197
198 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000199
200 private:
201 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
202
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000203 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000204};
205
206class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000207{
208 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000209 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
210 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000212 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000213
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000214 virtual rx::RenderTarget *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000215
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000216 private:
217 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000218
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000219 rx::RenderTarget *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220};
221
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000222class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000223{
224 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000225 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
226 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000227
228 ~DepthStencilbuffer();
229
daniel@transgaming.comd186dc72012-11-28 19:40:16 +0000230 virtual rx::RenderTarget *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000231
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000232 protected:
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000233 rx::RenderTarget *mDepthStencil;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000234
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000235 private:
236 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000237};
238
239class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000240{
241 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000242 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000243
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000244 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000245
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246 private:
247 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000248};
249
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000250class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000251{
252 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000253 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000254
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000255 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000256
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257 private:
258 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000259};
260}
261
262#endif // LIBGLESV2_RENDERBUFFER_H_