blob: 0ea841b7d6e6f0a6c4d6a6d4077165975d8f9b73 [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"
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000020#include "libGLESv2/RefCountObject.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021
22namespace gl
23{
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000024class Texture;
daniel@transgaming.com2678b342012-01-18 16:29:40 +000025class Renderbuffer;
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000026class Colorbuffer;
27class DepthStencilbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000028
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000029class RenderbufferInterface
30{
31 public:
32 RenderbufferInterface();
33
34 virtual ~RenderbufferInterface() {};
35
daniel@transgaming.com2678b342012-01-18 16:29:40 +000036 virtual void addProxyRef(const Renderbuffer *proxy);
37 virtual void releaseProxy(const Renderbuffer *proxy);
38
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000039 virtual IDirect3DSurface9 *getRenderTarget() = 0;
40 virtual IDirect3DSurface9 *getDepthStencil() = 0;
41
42 virtual GLsizei getWidth() const = 0;
43 virtual GLsizei getHeight() const = 0;
44 virtual GLenum getInternalFormat() const = 0;
45 virtual D3DFORMAT getD3DFormat() const = 0;
46 virtual GLsizei getSamples() const = 0;
47
48 GLuint getRedSize() const;
49 GLuint getGreenSize() const;
50 GLuint getBlueSize() const;
51 GLuint getAlphaSize() const;
52 GLuint getDepthSize() const;
53 GLuint getStencilSize() const;
54
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000055 virtual unsigned int getSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000056
57 private:
58 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000059};
60
61class RenderbufferTexture : public RenderbufferInterface
62{
63 public:
64 RenderbufferTexture(Texture *texture, GLenum target);
65
66 virtual ~RenderbufferTexture();
67
daniel@transgaming.com2678b342012-01-18 16:29:40 +000068 void addProxyRef(const Renderbuffer *proxy);
69 void releaseProxy(const Renderbuffer *proxy);
70
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000071 IDirect3DSurface9 *getRenderTarget();
72 IDirect3DSurface9 *getDepthStencil();
73
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000074 virtual GLsizei getWidth() const;
75 virtual GLsizei getHeight() const;
76 virtual GLenum getInternalFormat() const;
77 virtual D3DFORMAT getD3DFormat() const;
78 virtual GLsizei getSamples() const;
79
80 virtual unsigned int getSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000081
82 private:
83 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture);
84
daniel@transgaming.com0dc8a5e2012-01-18 16:29:34 +000085 BindingPointer <Texture> mTexture;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000086 GLenum mTarget;
87};
88
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000089// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
90// is called. The specific concrete type depends on whether the internal format is
91// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000092class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000093{
94 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000095 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000097 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000098
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000099 virtual IDirect3DSurface9 *getRenderTarget();
100 virtual IDirect3DSurface9 *getDepthStencil();
101
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000102 virtual GLsizei getWidth() const;
103 virtual GLsizei getHeight() const;
104 virtual GLenum getInternalFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000105 virtual D3DFORMAT getD3DFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000106 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000107
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000108 virtual unsigned int getSerial() const;
109
110 static unsigned int issueSerial();
111 static unsigned int issueCubeSerials();
112
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000113 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000114 GLsizei mWidth;
115 GLsizei mHeight;
116 GLenum mInternalFormat;
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000117 D3DFORMAT mD3DFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000118 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000119
120 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000121 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000122
123 const unsigned int mSerial;
124
125 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000126};
127
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000128// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000129// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000130// can change whenever glRenderbufferStorage is called.
131class Renderbuffer : public RefCountObject
132{
133 public:
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000134 Renderbuffer(GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000135
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000136 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000137
daniel@transgaming.com2678b342012-01-18 16:29:40 +0000138 // These functions from RefCountObject are overloaded here because
139 // Textures need to maintain their own count of references to them via
140 // Renderbuffers/RenderbufferTextures. These functions invoke those
141 // reference counting functions on the RenderbufferInterface.
142 void addRef() const;
143 void release() const;
144
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000145 IDirect3DSurface9 *getRenderTarget();
146 IDirect3DSurface9 *getDepthStencil();
147
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000148 GLsizei getWidth() const;
149 GLsizei getHeight() const;
150 GLenum getInternalFormat() const;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000151 D3DFORMAT getD3DFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000152 GLuint getRedSize() const;
153 GLuint getGreenSize() const;
154 GLuint getBlueSize() const;
155 GLuint getAlphaSize() const;
156 GLuint getDepthSize() const;
157 GLuint getStencilSize() const;
158 GLsizei getSamples() const;
159
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000160 unsigned int getSerial() const;
161
162 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000163
164 private:
165 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
166
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000167 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000168};
169
170class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000171{
172 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000173 explicit Colorbuffer(IDirect3DSurface9 *renderTarget);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000174 Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000175
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000176 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000177
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000178 virtual IDirect3DSurface9 *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000180 private:
181 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000182
183 IDirect3DSurface9 *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000184};
185
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000186class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000187{
188 public:
189 explicit DepthStencilbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000190 DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000191
192 ~DepthStencilbuffer();
193
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000194 virtual IDirect3DSurface9 *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000195
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000196 protected:
197 IDirect3DSurface9 *mDepthStencil;
198
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000199 private:
200 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000201};
202
203class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000204{
205 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000206 explicit Depthbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000207 Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000209 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000210
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211 private:
212 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000213};
214
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000215class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000216{
217 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000218 explicit Stencilbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000219 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000221 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000222
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000223 private:
224 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000225};
226}
227
228#endif // LIBGLESV2_RENDERBUFFER_H_