blob: 830b1d923ae7ecf814920937d4148c3e6b6a09b1 [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"
23
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024namespace gl
25{
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000026class Texture2D;
27class TextureCubeMap;
daniel@transgaming.com2678b342012-01-18 16:29:40 +000028class Renderbuffer;
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000029class Colorbuffer;
30class DepthStencilbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000031
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000032class RenderbufferInterface
33{
34 public:
35 RenderbufferInterface();
36
37 virtual ~RenderbufferInterface() {};
38
daniel@transgaming.com2678b342012-01-18 16:29:40 +000039 virtual void addProxyRef(const Renderbuffer *proxy);
40 virtual void releaseProxy(const Renderbuffer *proxy);
41
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000042 virtual IDirect3DSurface9 *getRenderTarget() = 0;
43 virtual IDirect3DSurface9 *getDepthStencil() = 0;
44
45 virtual GLsizei getWidth() const = 0;
46 virtual GLsizei getHeight() const = 0;
47 virtual GLenum getInternalFormat() const = 0;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000048 virtual GLenum getActualFormat() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000049 virtual GLsizei getSamples() const = 0;
50
51 GLuint getRedSize() const;
52 GLuint getGreenSize() const;
53 GLuint getBlueSize() const;
54 GLuint getAlphaSize() const;
55 GLuint getDepthSize() const;
56 GLuint getStencilSize() const;
57
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000058 virtual unsigned int getSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000059
60 private:
61 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000062};
63
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000064class RenderbufferTexture2D : public RenderbufferInterface
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000065{
66 public:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000067 RenderbufferTexture2D(Texture2D *texture, GLenum target);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000068
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000069 virtual ~RenderbufferTexture2D();
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000070
daniel@transgaming.com2678b342012-01-18 16:29:40 +000071 void addProxyRef(const Renderbuffer *proxy);
72 void releaseProxy(const Renderbuffer *proxy);
73
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000074 IDirect3DSurface9 *getRenderTarget();
75 IDirect3DSurface9 *getDepthStencil();
76
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000077 virtual GLsizei getWidth() const;
78 virtual GLsizei getHeight() const;
79 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +000080 virtual GLenum getActualFormat() const;
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000081 virtual GLsizei getSamples() const;
82
83 virtual unsigned int getSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000084
85 private:
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000086 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000087
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +000088 BindingPointer <Texture2D> mTexture2D;
89 GLenum mTarget;
90};
91
92class RenderbufferTextureCubeMap : public RenderbufferInterface
93{
94 public:
95 RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
96
97 virtual ~RenderbufferTextureCubeMap();
98
99 void addProxyRef(const Renderbuffer *proxy);
100 void releaseProxy(const Renderbuffer *proxy);
101
102 IDirect3DSurface9 *getRenderTarget();
103 IDirect3DSurface9 *getDepthStencil();
104
105 virtual GLsizei getWidth() const;
106 virtual GLsizei getHeight() const;
107 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000108 virtual GLenum getActualFormat() const;
daniel@transgaming.com46f2d0a2012-05-09 15:49:06 +0000109 virtual GLsizei getSamples() const;
110
111 virtual unsigned int getSerial() const;
112
113 private:
114 DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
115
116 BindingPointer <TextureCubeMap> mTextureCubeMap;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000117 GLenum mTarget;
118};
119
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000120// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
121// is called. The specific concrete type depends on whether the internal format is
122// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000123class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000124{
125 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000126 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000127
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000128 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000129
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000130 virtual IDirect3DSurface9 *getRenderTarget();
131 virtual IDirect3DSurface9 *getDepthStencil();
132
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000133 virtual GLsizei getWidth() const;
134 virtual GLsizei getHeight() const;
135 virtual GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000136 virtual GLenum getActualFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000137 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000138
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000139 virtual unsigned int getSerial() const;
140
141 static unsigned int issueSerial();
142 static unsigned int issueCubeSerials();
143
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000144 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000145 GLsizei mWidth;
146 GLsizei mHeight;
147 GLenum mInternalFormat;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000148 GLenum mActualFormat;
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000149 D3DFORMAT mD3DFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000150 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000151
152 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000153 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000154
155 const unsigned int mSerial;
156
157 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000158};
159
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000160// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000161// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000162// can change whenever glRenderbufferStorage is called.
163class Renderbuffer : public RefCountObject
164{
165 public:
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000166 Renderbuffer(GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000167
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000168 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000169
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000170 // These functions from RefCountObject are overloaded here because
171 // Textures need to maintain their own count of references to them via
172 // Renderbuffers/RenderbufferTextures. These functions invoke those
173 // reference counting functions on the RenderbufferInterface.
174 void addRef() const;
175 void release() const;
176
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000177 IDirect3DSurface9 *getRenderTarget();
178 IDirect3DSurface9 *getDepthStencil();
179
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000180 GLsizei getWidth() const;
181 GLsizei getHeight() const;
182 GLenum getInternalFormat() const;
daniel@transgaming.com20d36662012-10-31 19:51:43 +0000183 GLenum getActualFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000184 GLuint getRedSize() const;
185 GLuint getGreenSize() const;
186 GLuint getBlueSize() const;
187 GLuint getAlphaSize() const;
188 GLuint getDepthSize() const;
189 GLuint getStencilSize() const;
190 GLsizei getSamples() const;
191
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000192 unsigned int getSerial() const;
193
194 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000195
196 private:
197 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
198
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000199 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000200};
201
202class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000203{
204 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000205 explicit Colorbuffer(rx::SwapChain *swapChain);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000206 Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000207
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000208 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000210 virtual IDirect3DSurface9 *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000212 private:
213 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000214
215 IDirect3DSurface9 *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000216};
217
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000218class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000219{
220 public:
daniel@transgaming.com76d3e6e2012-10-31 19:55:33 +0000221 explicit DepthStencilbuffer(rx::SwapChain *swapChain);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000222 DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000223
224 ~DepthStencilbuffer();
225
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000226 virtual IDirect3DSurface9 *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000227
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000228 protected:
229 IDirect3DSurface9 *mDepthStencil;
230
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000231 private:
232 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000233};
234
235class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000236{
237 public:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000238 Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000240 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000241
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000242 private:
243 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000244};
245
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000246class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000247{
248 public:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000249 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000250
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000251 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000252
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000253 private:
254 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000255};
256}
257
258#endif // LIBGLESV2_RENDERBUFFER_H_