Renderbuffer.h revision 0273322c0bc5c89b5f006334ab7db6a62c922970
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 GLenum getFormat() const = 0;
51	virtual sw::Format getInternalFormat() const = 0;
52	virtual GLsizei getSamples() const = 0;
53
54	GLuint getRedSize() const;
55	GLuint getGreenSize() const;
56	GLuint getBlueSize() const;
57	GLuint getAlphaSize() const;
58	GLuint getDepthSize() const;
59	GLuint getStencilSize() const;
60};
61
62class RenderbufferTexture2D : public RenderbufferInterface
63{
64public:
65	RenderbufferTexture2D(Texture2D *texture);
66
67	virtual ~RenderbufferTexture2D();
68
69	virtual void addProxyRef(const Renderbuffer *proxy);
70    virtual void releaseProxy(const Renderbuffer *proxy);
71
72	virtual egl::Image *getRenderTarget();
73    virtual egl::Image *createSharedImage();
74    virtual bool isShared() const;
75
76	virtual GLsizei getWidth() const;
77	virtual GLsizei getHeight() const;
78	virtual GLenum getFormat() const;
79	virtual sw::Format getInternalFormat() const;
80	virtual GLsizei getSamples() const;
81
82private:
83	gl::BindingPointer<Texture2D> mTexture2D;
84};
85
86class RenderbufferTexture3D : public RenderbufferInterface
87{
88public:
89	RenderbufferTexture3D(Texture3D *texture);
90
91	virtual ~RenderbufferTexture3D();
92
93	virtual void addProxyRef(const Renderbuffer *proxy);
94	virtual void releaseProxy(const Renderbuffer *proxy);
95
96	virtual egl::Image *getRenderTarget();
97	virtual egl::Image *createSharedImage();
98	virtual bool isShared() const;
99
100	virtual GLsizei getWidth() const;
101	virtual GLsizei getHeight() const;
102	virtual GLenum getFormat() const;
103	virtual sw::Format getInternalFormat() const;
104	virtual GLsizei getSamples() const;
105
106private:
107	gl::BindingPointer<Texture3D> mTexture3D;
108};
109
110class RenderbufferTextureCubeMap : public RenderbufferInterface
111{
112public:
113	RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum target);
114
115	virtual ~RenderbufferTextureCubeMap();
116
117	virtual void addProxyRef(const Renderbuffer *proxy);
118    virtual void releaseProxy(const Renderbuffer *proxy);
119
120	virtual egl::Image *getRenderTarget();
121    virtual egl::Image *createSharedImage();
122    virtual bool isShared() const;
123
124	virtual GLsizei getWidth() const;
125	virtual GLsizei getHeight() const;
126	virtual GLenum getFormat() const;
127	virtual sw::Format getInternalFormat() const;
128	virtual GLsizei getSamples() const;
129
130private:
131	gl::BindingPointer<TextureCubeMap> mTextureCubeMap;
132	GLenum mTarget;
133};
134
135// A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
136// is called. The specific concrete type depends on whether the internal format is
137// colour depth, stencil or packed depth/stencil.
138class RenderbufferStorage : public RenderbufferInterface
139{
140public:
141	RenderbufferStorage();
142
143	virtual ~RenderbufferStorage() = 0;
144
145	virtual egl::Image *getRenderTarget() = 0;
146    virtual egl::Image *createSharedImage() = 0;
147    virtual bool isShared() const = 0;
148
149	virtual GLsizei getWidth() const;
150	virtual GLsizei getHeight() const;
151	virtual GLenum getFormat() const;
152	virtual sw::Format getInternalFormat() const;
153	virtual GLsizei getSamples() const;
154
155protected:
156	GLsizei mWidth;
157	GLsizei mHeight;
158	GLenum format;
159	sw::Format internalFormat;
160	GLsizei mSamples;
161};
162
163// Renderbuffer implements the GL renderbuffer object.
164// It's only a proxy for a RenderbufferInterface instance; the internal object
165// can change whenever glRenderbufferStorage is called.
166class Renderbuffer : public gl::NamedObject
167{
168public:
169	Renderbuffer(GLuint name, RenderbufferInterface *storage);
170
171	virtual ~Renderbuffer();
172
173	// These functions from Object are overloaded here because
174    // Textures need to maintain their own count of references to them via
175    // Renderbuffers/RenderbufferTextures. These functions invoke those
176    // reference counting functions on the RenderbufferInterface.
177    virtual void addRef();
178    virtual void release();
179
180	egl::Image *getRenderTarget();
181    virtual egl::Image *createSharedImage();
182    virtual bool isShared() const;
183
184	GLsizei getWidth() const;
185	GLsizei getHeight() const;
186	GLenum getFormat() const;
187	sw::Format getInternalFormat() const;
188	GLuint getRedSize() const;
189	GLuint getGreenSize() const;
190	GLuint getBlueSize() const;
191	GLuint getAlphaSize() const;
192	GLuint getDepthSize() const;
193	GLuint getStencilSize() const;
194	GLsizei getSamples() const;
195
196	void setStorage(RenderbufferStorage *newStorage);
197
198private:
199	RenderbufferInterface *mInstance;
200};
201
202class Colorbuffer : public RenderbufferStorage
203{
204public:
205	explicit Colorbuffer(egl::Image *renderTarget);
206	Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
207
208	virtual ~Colorbuffer();
209
210	virtual egl::Image *getRenderTarget();
211    virtual egl::Image *createSharedImage();
212    virtual bool isShared() const;
213
214private:
215	egl::Image *mRenderTarget;
216};
217
218class DepthStencilbuffer : public RenderbufferStorage
219{
220public:
221	explicit DepthStencilbuffer(egl::Image *depthStencil);
222	DepthStencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
223
224	~DepthStencilbuffer();
225
226	virtual egl::Image *getRenderTarget();
227    virtual egl::Image *createSharedImage();
228    virtual bool isShared() const;
229
230protected:
231	egl::Image *mDepthStencil;
232};
233
234class Depthbuffer : public DepthStencilbuffer
235{
236public:
237	explicit Depthbuffer(egl::Image *depthStencil);
238	Depthbuffer(GLsizei width, GLsizei height, GLsizei samples);
239
240	virtual ~Depthbuffer();
241};
242
243class Stencilbuffer : public DepthStencilbuffer
244{
245public:
246	explicit Stencilbuffer(egl::Image *depthStencil);
247	Stencilbuffer(GLsizei width, GLsizei height, GLsizei samples);
248
249	virtual ~Stencilbuffer();
250};
251}
252
253#endif   // LIBGLESV2_RENDERBUFFER_H_
254