Renderbuffer.h revision 074c64176645063a8c0113e2acc2d3fac3469d5c
1// SwiftShader Software Renderer
2//
3// Copyright(c) 2005-2013 TransGaming Inc.
4//
5// All rights reserved. No part of this software may be copied, distributed, transmitted,
6// transcribed, stored in a retrieval system, translated into any human or computer
7// language by any means, or disclosed to third parties without the explicit written
8// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
9// or implied, including but not limited to any patent rights, are granted to you.
10//
11
12// Renderbuffer.h: Defines the wrapper class Renderbuffer, as well as the
13// class hierarchy used to store its contents: RenderbufferStorage, Colorbuffer,
14// DepthStencilbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
15// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
16
17#ifndef LIBGLESV2_RENDERBUFFER_H_
18#define LIBGLESV2_RENDERBUFFER_H_
19
20#include "common/Object.hpp"
21#include "common/Image.hpp"
22
23#include <GLES2/gl2.h>
24
25namespace es2
26{
27class Texture2D;
28class Texture3D;
29class TextureCubeMap;
30class Renderbuffer;
31class Colorbuffer;
32class DepthStencilbuffer;
33
34class RenderbufferInterface
35{
36public:
37	RenderbufferInterface();
38
39	virtual ~RenderbufferInterface() {};
40
41	virtual void addProxyRef(const Renderbuffer *proxy);
42    virtual void releaseProxy(const Renderbuffer *proxy);
43
44	virtual egl::Image *getRenderTarget() = 0;
45    virtual egl::Image *createSharedImage() = 0;
46    virtual bool isShared() const = 0;
47
48	virtual GLsizei getWidth() const = 0;
49	virtual GLsizei getHeight() const = 0;
50	virtual GLint getLayer() const { return 0; }
51	virtual GLenum getFormat() const = 0;
52	virtual sw::Format getInternalFormat() const = 0;
53	virtual GLsizei getSamples() const = 0;
54
55	GLuint getRedSize() const;
56	GLuint getGreenSize() const;
57	GLuint getBlueSize() const;
58	GLuint getAlphaSize() const;
59	GLuint getDepthSize() const;
60	GLuint getStencilSize() const;
61};
62
63class RenderbufferTexture2D : public RenderbufferInterface
64{
65public:
66	RenderbufferTexture2D(Texture2D *texture, GLint level);
67
68	virtual ~RenderbufferTexture2D();
69
70	virtual void addProxyRef(const Renderbuffer *proxy);
71    virtual void releaseProxy(const Renderbuffer *proxy);
72
73	virtual egl::Image *getRenderTarget();
74    virtual egl::Image *createSharedImage();
75    virtual bool isShared() const;
76
77	virtual GLsizei getWidth() const;
78	virtual GLsizei getHeight() const;
79	virtual GLenum getFormat() const;
80	virtual sw::Format getInternalFormat() const;
81	virtual GLsizei getSamples() const;
82
83private:
84	gl::BindingPointer<Texture2D> mTexture2D;
85	GLint mLevel;
86};
87
88class RenderbufferTexture3D : public RenderbufferInterface
89{
90public:
91	RenderbufferTexture3D(Texture3D *texture, GLint level, GLint layer);
92
93	virtual ~RenderbufferTexture3D();
94
95	virtual void addProxyRef(const Renderbuffer *proxy);
96	virtual void releaseProxy(const Renderbuffer *proxy);
97
98	virtual egl::Image *getRenderTarget();
99	virtual egl::Image *createSharedImage();
100	virtual bool isShared() const;
101
102	virtual GLsizei getWidth() const;
103	virtual GLsizei getHeight() const;
104	virtual GLint getLayer() const { return mLayer; }
105	virtual GLenum getFormat() const;
106	virtual sw::Format getInternalFormat() const;
107	virtual GLsizei getSamples() const;
108
109private:
110	gl::BindingPointer<Texture3D> mTexture3D;
111	GLint mLevel;
112	GLint mLayer;
113};
114
115class RenderbufferTextureCubeMap : public RenderbufferInterface
116{
117public:
118	RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target, GLint level);
119
120	virtual ~RenderbufferTextureCubeMap();
121
122	virtual void addProxyRef(const Renderbuffer *proxy);
123    virtual void releaseProxy(const Renderbuffer *proxy);
124
125	virtual egl::Image *getRenderTarget();
126    virtual egl::Image *createSharedImage();
127    virtual bool isShared() const;
128
129	virtual GLsizei getWidth() const;
130	virtual GLsizei getHeight() const;
131	virtual GLenum getFormat() const;
132	virtual sw::Format getInternalFormat() const;
133	virtual GLsizei getSamples() const;
134
135private:
136	gl::BindingPointer<TextureCubeMap> mTextureCubeMap;
137	GLenum mTarget;
138	GLint mLevel;
139};
140
141// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
142// is called. The specific concrete type depends on whether the internal format is
143// colour depth, stencil or packed depth/stencil.
144class RenderbufferStorage : public RenderbufferInterface
145{
146public:
147	RenderbufferStorage();
148
149	virtual ~RenderbufferStorage() = 0;
150
151	virtual egl::Image *getRenderTarget() = 0;
152    virtual egl::Image *createSharedImage() = 0;
153    virtual bool isShared() const = 0;
154
155	virtual GLsizei getWidth() const;
156	virtual GLsizei getHeight() const;
157	virtual GLenum getFormat() const;
158	virtual sw::Format getInternalFormat() const;
159	virtual GLsizei getSamples() const;
160
161protected:
162	GLsizei mWidth;
163	GLsizei mHeight;
164	GLenum format;
165	sw::Format internalFormat;
166	GLsizei mSamples;
167};
168
169// Renderbuffer implements the GL renderbuffer object.
170// It's only a proxy for a RenderbufferInterface instance; the internal object
171// can change whenever glRenderbufferStorage is called.
172class Renderbuffer : public gl::NamedObject
173{
174public:
175	Renderbuffer(GLuint name, RenderbufferInterface *storage);
176
177	virtual ~Renderbuffer();
178
179	// These functions from Object are overloaded here because
180    // Textures need to maintain their own count of references to them via
181    // Renderbuffers/RenderbufferTextures. These functions invoke those
182    // reference counting functions on the RenderbufferInterface.
183    virtual void addRef();
184    virtual void release();
185
186	egl::Image *getRenderTarget();
187    virtual egl::Image *createSharedImage();
188    virtual bool isShared() const;
189
190	GLsizei getWidth() const;
191	GLsizei getHeight() const;
192	GLint getLayer() const;
193	GLenum getFormat() const;
194	sw::Format getInternalFormat() const;
195	GLuint getRedSize() const;
196	GLuint getGreenSize() const;
197	GLuint getBlueSize() const;
198	GLuint getAlphaSize() const;
199	GLuint getDepthSize() const;
200	GLuint getStencilSize() const;
201	GLsizei getSamples() const;
202
203	void setStorage(RenderbufferStorage *newStorage);
204
205private:
206	RenderbufferInterface *mInstance;
207};
208
209class Colorbuffer : public RenderbufferStorage
210{
211public:
212	explicit Colorbuffer(egl::Image *renderTarget);
213	Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
214
215	virtual ~Colorbuffer();
216
217	virtual egl::Image *getRenderTarget();
218    virtual egl::Image *createSharedImage();
219    virtual bool isShared() const;
220
221private:
222	egl::Image *mRenderTarget;
223};
224
225class DepthStencilbuffer : public RenderbufferStorage
226{
227public:
228	explicit DepthStencilbuffer(egl::Image *depthStencil);
229	DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
230
231	~DepthStencilbuffer();
232
233	virtual egl::Image *getRenderTarget();
234    virtual egl::Image *createSharedImage();
235    virtual bool isShared() const;
236
237protected:
238	egl::Image *mDepthStencil;
239};
240
241class Depthbuffer : public DepthStencilbuffer
242{
243public:
244	explicit Depthbuffer(egl::Image *depthStencil);
245	Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
246
247	virtual ~Depthbuffer();
248};
249
250class Stencilbuffer : public DepthStencilbuffer
251{
252public:
253	explicit Stencilbuffer(egl::Image *depthStencil);
254	Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
255
256	virtual ~Stencilbuffer();
257};
258}
259
260#endif   // LIBGLESV2_RENDERBUFFER_H_
261