blob: 493f98a8c3dadb72123398b2af0a6127b34e1333 [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
28// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
29// is called. The specific concrete type depends on whether the internal format is
30// colour depth, stencil or packed depth/stencil.
31class RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000032{
33 public:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000034 RenderbufferStorage();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000035
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000036 virtual ~RenderbufferStorage() = 0;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000037
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000038 virtual Colorbuffer *getColorbuffer();
39 virtual DepthStencilbuffer *getDepthbuffer();
40 virtual DepthStencilbuffer *getStencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000041
42 virtual IDirect3DSurface9 *getRenderTarget();
43 virtual IDirect3DSurface9 *getDepthStencil();
44
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000045 virtual GLsizei getWidth() const;
46 virtual GLsizei getHeight() const;
47 virtual GLenum getInternalFormat() const;
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 virtual GLsizei getSamples() const;
55
56 virtual D3DFORMAT getD3DFormat() const;
57
daniel@transgaming.com092bd482010-05-12 03:39:36 +000058 unsigned int getSerial() const;
59
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000060 protected:
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000061 GLsizei mWidth;
62 GLsizei mHeight;
63 GLenum mInternalFormat;
daniel@transgaming.comca7c0082010-08-24 19:20:20 +000064 D3DFORMAT mD3DFormat;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +000065 GLsizei mSamples;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000066
67 private:
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000068 DISALLOW_COPY_AND_ASSIGN(RenderbufferStorage);
daniel@transgaming.com092bd482010-05-12 03:39:36 +000069
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000070 static unsigned int issueSerial();
daniel@transgaming.com866f3182010-05-20 19:28:22 +000071
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000072 const unsigned int mSerial;
73
74 static unsigned int mCurrentSerial;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075};
76
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000077// Renderbuffer implements the GL renderbuffer object.
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000078// It's only a proxy for a RenderbufferStorage instance; the internal object
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000079// can change whenever glRenderbufferStorage is called.
80class Renderbuffer : public RefCountObject
81{
82 public:
83 Renderbuffer(GLuint id, RenderbufferStorage *storage);
84
85 ~Renderbuffer();
86
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +000087 Colorbuffer *getColorbuffer();
88 DepthStencilbuffer *getDepthbuffer();
89 DepthStencilbuffer *getStencilbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000090
91 IDirect3DSurface9 *getRenderTarget();
92 IDirect3DSurface9 *getDepthStencil();
93
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000094 GLsizei getWidth() const;
95 GLsizei getHeight() const;
96 GLenum getInternalFormat() const;
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +000097 D3DFORMAT getD3DFormat() const;
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000098 GLuint getRedSize() const;
99 GLuint getGreenSize() const;
100 GLuint getBlueSize() const;
101 GLuint getAlphaSize() const;
102 GLuint getDepthSize() const;
103 GLuint getStencilSize() const;
104 GLsizei getSamples() const;
105
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000106 unsigned int getSerial() const;
107
108 void setStorage(RenderbufferStorage *newStorage);
109 RenderbufferStorage *getStorage() { return mStorage; }
110
111 private:
112 DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
113
114 RenderbufferStorage *mStorage;
115};
116
117class Colorbuffer : public RenderbufferStorage
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000118{
119 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000120 explicit Colorbuffer(IDirect3DSurface9 *renderTarget);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000121 Colorbuffer(Texture *texture, GLenum target);
122 Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000123
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000124 virtual ~Colorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000125
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +0000126 virtual Colorbuffer *getColorbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000127
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000128 virtual IDirect3DSurface9 *getRenderTarget();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000129
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000130 virtual GLsizei getWidth() const;
131 virtual GLsizei getHeight() const;
132 virtual GLenum getInternalFormat() const;
daniel@transgaming.com51887312011-03-21 16:39:03 +0000133 virtual GLenum getType() const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000134
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000135 virtual D3DFORMAT getD3DFormat() const;
136
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137 private:
138 DISALLOW_COPY_AND_ASSIGN(Colorbuffer);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000139
140 IDirect3DSurface9 *mRenderTarget;
141 Texture *mTexture;
142 GLenum mTarget;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000143};
144
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000145class DepthStencilbuffer : public RenderbufferStorage
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000146{
147 public:
148 explicit DepthStencilbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000149 DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000150
151 ~DepthStencilbuffer();
152
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +0000153 virtual DepthStencilbuffer *getDepthbuffer();
154 virtual DepthStencilbuffer *getStencilbuffer();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000155
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000156 virtual IDirect3DSurface9 *getDepthStencil();
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000157
158 private:
159 DISALLOW_COPY_AND_ASSIGN(DepthStencilbuffer);
160 IDirect3DSurface9 *mDepthStencil;
161};
162
163class Depthbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000164{
165 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000166 explicit Depthbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000167 Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000168
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000169 virtual ~Depthbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000170
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +0000171 virtual DepthStencilbuffer *getDepthbuffer();
172 virtual DepthStencilbuffer *getStencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000173
174 private:
175 DISALLOW_COPY_AND_ASSIGN(Depthbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000176};
177
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000178class Stencilbuffer : public DepthStencilbuffer
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000179{
180 public:
daniel@transgaming.com70d312a2010-04-20 18:52:38 +0000181 explicit Stencilbuffer(IDirect3DSurface9 *depthStencil);
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000182 Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000183
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000184 virtual ~Stencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000185
daniel@transgaming.comf45e81d2011-11-09 17:46:02 +0000186 virtual DepthStencilbuffer *getDepthbuffer();
187 virtual DepthStencilbuffer *getStencilbuffer();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000188
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000189 private:
190 DISALLOW_COPY_AND_ASSIGN(Stencilbuffer);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000191};
192}
193
194#endif // LIBGLESV2_RENDERBUFFER_H_