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