blob: e854775d929515289e5b68db3212ddcc908cfe5b [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.comf45e81d2011-11-09 17:46:02 +000025class Colorbuffer;
26class DepthStencilbuffer;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000027
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000028class RenderbufferInterface
29{
30 public:
31 RenderbufferInterface();
32
33 virtual ~RenderbufferInterface() {};
34
35 virtual IDirect3DSurface9 *getRenderTarget() = 0;
36 virtual IDirect3DSurface9 *getDepthStencil() = 0;
37
38 virtual GLsizei getWidth() const = 0;
39 virtual GLsizei getHeight() const = 0;
40 virtual GLenum getInternalFormat() const = 0;
41 virtual D3DFORMAT getD3DFormat() const = 0;
42 virtual GLsizei getSamples() const = 0;
43
44 GLuint getRedSize() const;
45 GLuint getGreenSize() const;
46 GLuint getBlueSize() const;
47 GLuint getAlphaSize() const;
48 GLuint getDepthSize() const;
49 GLuint getStencilSize() const;
50
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000051 virtual unsigned int getSerial() const = 0;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000052
53 private:
54 DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000055};
56
57class RenderbufferTexture : public RenderbufferInterface
58{
59 public:
60 RenderbufferTexture(Texture *texture, GLenum target);
61
62 virtual ~RenderbufferTexture();
63
64 IDirect3DSurface9 *getRenderTarget();
65 IDirect3DSurface9 *getDepthStencil();
66
daniel@transgaming.comfbc39522011-11-11 04:10:28 +000067 virtual GLsizei getWidth() const;
68 virtual GLsizei getHeight() const;
69 virtual GLenum getInternalFormat() const;
70 virtual D3DFORMAT getD3DFormat() const;
71 virtual GLsizei getSamples() const;
72
73 virtual unsigned int getSerial() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000074
75 private:
76 DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture);
77
78 Texture *mTexture;
79 GLenum mTarget;
80};
81
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000082// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
83// is called. The specific concrete type depends on whether the internal format is
84// colour depth, stencil or packed depth/stencil.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000085class RenderbufferStorage : public RenderbufferInterface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000086{
87 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000088 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000089
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000090 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000091
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000092 virtual IDirect3DSurface9 *getRenderTarget();
93 virtual IDirect3DSurface9 *getDepthStencil();
94
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000095 virtual GLsizei getWidth() const;
96 virtual GLsizei getHeight() const;
97 virtual GLenum getInternalFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000098 virtual D3DFORMAT getD3DFormat() const;
daniel@transgaming.comd14558a2011-11-09 17:46:18 +000099 virtual GLsizei getSamples() const;
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000100
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000101 virtual unsigned int getSerial() const;
102
103 static unsigned int issueSerial();
104 static unsigned int issueCubeSerials();
105
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000106 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000107 GLsizei mWidth;
108 GLsizei mHeight;
109 GLenum mInternalFormat;
daniel@transgaming.comca7c0082010-08-24 19:20:20 +0000110 D3DFORMAT mD3DFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000111 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000112
113 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000114 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.comfbc39522011-11-11 04:10:28 +0000115
116 const unsigned int mSerial;
117
118 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000119};
120
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000121// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000122// It's only a proxy for a RenderbufferInterface instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000123// can change whenever glRenderbufferStorage is called.
124class Renderbuffer : public RefCountObject
125{
126 public:
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000127 Renderbuffer(GLuint id, RenderbufferInterface *storage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000128
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000129 virtual ~Renderbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000130
131 IDirect3DSurface9 *getRenderTarget();
132 IDirect3DSurface9 *getDepthStencil();
133
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000134 GLsizei getWidth() const;
135 GLsizei getHeight() const;
136 GLenum getInternalFormat() const;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000137 D3DFORMAT getD3DFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000138 GLuint getRedSize() const;
139 GLuint getGreenSize() const;
140 GLuint getBlueSize() const;
141 GLuint getAlphaSize() const;
142 GLuint getDepthSize() const;
143 GLuint getStencilSize() const;
144 GLsizei getSamples() const;
145
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000146 unsigned int getSerial() const;
147
148 void setStorage(RenderbufferStorage *newStorage);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000149
150 private:
151 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
152
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000153 RenderbufferInterface *mInstance;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000154};
155
156class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000157{
158 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000159 explicit Colorbuffer(IDirect3DSurface9 *renderTarget);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000160 Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000161
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000162 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000163
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000164 virtual IDirect3DSurface9 *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000165
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000166 private:
167 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000168
169 IDirect3DSurface9 *mRenderTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000170};
171
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000172class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000173{
174 public:
175 explicit DepthStencilbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000176 DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000177
178 ~DepthStencilbuffer();
179
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000180 virtual IDirect3DSurface9 *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000181
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000182 protected:
183 IDirect3DSurface9 *mDepthStencil;
184
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000185 private:
186 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000187};
188
189class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000190{
191 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000192 explicit Depthbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000193 Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000194
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000195 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000196
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000197 private:
198 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000199};
200
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000201class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000202{
203 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000204 explicit Stencilbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000205 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000206
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000207 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000208
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209 private:
210 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000211};
212}
213
214#endif // LIBGLESV2_RENDERBUFFER_H_