blob: 4a932774a4be4973bfdcf5ca37eeeb8c137ee23c [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>
17#include <d3d9.h>
18
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.com96c38932012-10-31 18:42:52 +000022#include "renderer/SwapChain.h"
daniel@transgaming.com042d1b42012-11-28 19:37:09 +000023#include "renderer/RenderTarget.h"
daniel@transgaming.com96c38932012-10-31 18:42:52 +000024
daniel@transgaming.com70062c92012-11-28 19:32:30 +000025namespace rx
26{
27class Renderer;
28}
29
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000030namespace gl
31{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000032class Texture2D;
33class TextureCubeMap;
daniel@transgaming.com2678b342012-01-18 16:29:40 +000034class Renderbuffer;
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000035class Colorbuffer;
36class DepthStencilbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000037
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000038class RenderbufferInterface
39{
40 public:
41 RenderbufferInterface();
42
43 virtual ~RenderbufferInterface() {};
44
daniel@transgaming.com2678b342012-01-18 16:29:40 +000045 virtual void addProxyRef(const Renderbuffer *proxy);
46 virtual void releaseProxy(const Renderbuffer *proxy);
47
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000048 virtual IDirect3DSurface9 *getRenderTarget() = 0;
49 virtual IDirect3DSurface9 *getDepthStencil() = 0;
50
51 virtual GLsizei getWidth() const = 0;
52 virtual GLsizei getHeight() const = 0;
53 virtual GLenum getInternalFormat() const = 0;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000054 virtual GLenum getActualFormat() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000055 virtual GLsizei getSamples() const = 0;
56
57 GLuint getRedSize() const;
58 GLuint getGreenSize() const;
59 GLuint getBlueSize() const;
60 GLuint getAlphaSize() const;
61 GLuint getDepthSize() const;
62 GLuint getStencilSize() const;
63
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000064 virtual unsigned int getSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000065
66 private:
67 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000068};
69
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000070class RenderbufferTexture2D : public RenderbufferInterface
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000071{
72 public:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000073 RenderbufferTexture2D(Texture2D *texture, GLenum target);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000074
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000075 virtual ~RenderbufferTexture2D();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000076
daniel@transgaming.com2678b342012-01-18 16:29:40 +000077 void addProxyRef(const Renderbuffer *proxy);
78 void releaseProxy(const Renderbuffer *proxy);
79
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000080 IDirect3DSurface9 *getRenderTarget();
81 IDirect3DSurface9 *getDepthStencil();
82
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000083 virtual GLsizei getWidth() const;
84 virtual GLsizei getHeight() const;
85 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000086 virtual GLenum getActualFormat() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000087 virtual GLsizei getSamples() const;
88
89 virtual unsigned int getSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000090
91 private:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000092 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000093
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000094 BindingPointer <Texture2D> mTexture2D;
95 GLenum mTarget;
96};
97
98class RenderbufferTextureCubeMap : public RenderbufferInterface
99{
100 public:
101 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
102
103 virtual ~RenderbufferTextureCubeMap();
104
105 void addProxyRef(const Renderbuffer *proxy);
106 void releaseProxy(const Renderbuffer *proxy);
107
108 IDirect3DSurface9 *getRenderTarget();
109 IDirect3DSurface9 *getDepthStencil();
110
111 virtual GLsizei getWidth() const;
112 virtual GLsizei getHeight() const;
113 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000114 virtual GLenum getActualFormat() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000115 virtual GLsizei getSamples() const;
116
117 virtual unsigned int getSerial() const;
118
119 private:
120 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
121
122 BindingPointer <TextureCubeMap> mTextureCubeMap;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000123 GLenum mTarget;
124};
125
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000126// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
127// is called. The specific concrete type depends on whether the internal format is
128// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000129class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000130{
131 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000132 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000133
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000134 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000135
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000136 virtual IDirect3DSurface9 *getRenderTarget();
137 virtual IDirect3DSurface9 *getDepthStencil();
138
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000139 virtual GLsizei getWidth() const;
140 virtual GLsizei getHeight() const;
141 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000142 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000143 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000144
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000145 virtual unsigned int getSerial() const;
146
147 static unsigned int issueSerial();
148 static unsigned int issueCubeSerials();
149
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000150 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000151 GLsizei mWidth;
152 GLsizei mHeight;
153 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000154 GLenum mActualFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000155 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156
157 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000158 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000159
160 const unsigned int mSerial;
161
162 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000163};
164
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000165// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000166// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000167// can change whenever glRenderbufferStorage is called.
168class Renderbuffer : public RefCountObject
169{
170 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000171 Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000172
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000173 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000174
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000175 // These functions from RefCountObject are overloaded here because
176 // Textures need to maintain their own count of references to them via
177 // Renderbuffers/RenderbufferTextures. These functions invoke those
178 // reference counting functions on the RenderbufferInterface.
179 void addRef() const;
180 void release() const;
181
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000182 IDirect3DSurface9 *getRenderTarget();
183 IDirect3DSurface9 *getDepthStencil();
184
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000185 GLsizei getWidth() const;
186 GLsizei getHeight() const;
187 GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000188 GLenum getActualFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000189 GLuint getRedSize() const;
190 GLuint getGreenSize() const;
191 GLuint getBlueSize() const;
192 GLuint getAlphaSize() const;
193 GLuint getDepthSize() const;
194 GLuint getStencilSize() const;
195 GLsizei getSamples() const;
196
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000197 unsigned int getSerial() const;
198
199 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000200
201 private:
202 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
203
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000204 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000205};
206
207class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208{
209 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000210 Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
211 Colorbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000213 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000214
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000215 virtual IDirect3DSurface9 *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000216
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000217 private:
218 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000219
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000220 rx::RenderTarget *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000221};
222
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000223class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000224{
225 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000226 DepthStencilbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain);
227 DepthStencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000228
229 ~DepthStencilbuffer();
230
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000231 virtual IDirect3DSurface9 *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000232
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000233 protected:
daniel@transgaming.com042d1b42012-11-28 19:37:09 +0000234 rx::RenderTarget *mDepthStencil;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000235
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000236 private:
237 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000238};
239
240class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241{
242 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000243 Depthbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000244
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000245 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000247 private:
248 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000249};
250
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000251class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000252{
253 public:
daniel@transgaming.com70062c92012-11-28 19:32:30 +0000254 Stencilbuffer(rx::Renderer *renderer, GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000255
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000256 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 private:
259 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260};
261}
262
263#endif // LIBGLESV2_RENDERBUFFER_H_