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