• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
28 namespace es2
29 {
30 class Texture2D;
31 class Texture3D;
32 class TextureCubeMap;
33 class Renderbuffer;
34 class Colorbuffer;
35 class DepthStencilbuffer;
36 
37 class RenderbufferInterface
38 {
39 public:
40 	RenderbufferInterface();
41 
~RenderbufferInterface()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;
getDepth()53 	virtual GLsizei getDepth() const { return 1; }
getLayer()54 	virtual GLint getLayer() const { return 0; }
getLevel()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 
setLayer(GLint)60 	virtual void setLayer(GLint) {}
setLevel(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 
71 class RenderbufferTexture2D : public RenderbufferInterface
72 {
73 public:
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;
getLevel()87 	virtual GLint getLevel() const { return mLevel; }
88 	virtual GLenum getFormat() const;
89 	virtual sw::Format getInternalFormat() const;
90 	virtual GLsizei getSamples() const;
91 
setLevel(GLint level)92 	virtual void setLevel(GLint level) { mLevel = level; }
93 
94 private:
95 	gl::BindingPointer<Texture2D> mTexture2D;
96 	GLint mLevel;
97 };
98 
99 class RenderbufferTexture3D : public RenderbufferInterface
100 {
101 public:
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;
getLayer()116 	virtual GLint getLayer() const { return mLayer; }
getLevel()117 	virtual GLint getLevel() const { return mLevel; }
118 	virtual GLenum getFormat() const;
119 	virtual sw::Format getInternalFormat() const;
120 	virtual GLsizei getSamples() const;
121 
setLayer(GLint layer)122 	virtual void setLayer(GLint layer) { mLayer = layer; }
setLevel(GLint level)123 	virtual void setLevel(GLint level) { mLevel = level; }
124 
125 private:
126 	gl::BindingPointer<Texture3D> mTexture3D;
127 	GLint mLevel;
128 	GLint mLayer;
129 };
130 
131 class RenderbufferTextureCubeMap : public RenderbufferInterface
132 {
133 public:
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;
getLevel()147 	virtual GLint getLevel() const { return mLevel; }
148 	virtual GLenum getFormat() const;
149 	virtual sw::Format getInternalFormat() const;
150 	virtual GLsizei getSamples() const;
151 
setLevel(GLint level)152 	virtual void setLevel(GLint level) { mLevel = level; }
153 
154 private:
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.
163 class RenderbufferStorage : public RenderbufferInterface
164 {
165 public:
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 
180 protected:
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.
191 class Renderbuffer : public gl::NamedObject
192 {
193 public:
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 
228 private:
229 	RenderbufferInterface *mInstance;
230 };
231 
232 class Colorbuffer : public RenderbufferStorage
233 {
234 public:
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 
244 private:
245 	egl::Image *mRenderTarget;
246 };
247 
248 class DepthStencilbuffer : public RenderbufferStorage
249 {
250 public:
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 
260 protected:
261 	egl::Image *mDepthStencil;
262 };
263 
264 class Depthbuffer : public DepthStencilbuffer
265 {
266 public:
267 	explicit Depthbuffer(egl::Image *depthStencil);
268 	Depthbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
269 
270 	virtual ~Depthbuffer();
271 };
272 
273 class Stencilbuffer : public DepthStencilbuffer
274 {
275 public:
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