blob: 62d9aad1bca3bc02914e305ae96bad8bd6b47a20 [file] [log] [blame]
Jamie Madillafc21c02014-06-04 15:29:47 -04001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// FramebufferAttachment.h: Defines the wrapper class gl::FramebufferAttachment, as well as the
8// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
9
10#ifndef LIBGLESV2_FRAMEBUFFERATTACHMENT_H_
11#define LIBGLESV2_FRAMEBUFFERATTACHMENT_H_
12
13#include <GLES3/gl3.h>
14#include <GLES2/gl2.h>
15
16#include "common/angleutils.h"
17#include "common/RefCountObject.h"
18
19namespace rx
20{
21class Renderer;
22class RenderTarget;
23class TextureStorage;
24}
25
26namespace gl
27{
28class Texture2D;
29class TextureCubeMap;
30class Texture3D;
31class Texture2DArray;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040032class FramebufferAttachmentImpl;
33class Renderbuffer;
Jamie Madillafc21c02014-06-04 15:29:47 -040034
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040035// FramebufferAttachment implements a GL framebuffer attachment.
36// Attachments are "light" containers, which store pointers to ref-counted GL objects.
37// We support GL texture (2D/3D/Cube/2D array) and renderbuffer object attachments.
38// Note: Renderbuffers are specialized storage for depth and stencil buffes. Our old
39// naming scheme used the term "Renderbuffer" for both GL renderbuffers and for
40// framebuffer attachments, which confused their usage.
41
Jamie Madillafc21c02014-06-04 15:29:47 -040042class FramebufferAttachment : public RefCountObject
43{
44 public:
Jamie Madill1e3fa742014-06-16 10:34:00 -040045 FramebufferAttachment(GLuint id, FramebufferAttachmentImpl *storage);
Jamie Madillafc21c02014-06-04 15:29:47 -040046
47 virtual ~FramebufferAttachment();
48
49 // These functions from RefCountObject are overloaded here because
50 // Textures need to maintain their own count of references to them via
51 // Renderbuffers/RenderbufferTextures. These functions invoke those
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040052 // reference counting functions on the FramebufferAttachmentImpl.
Jamie Madillafc21c02014-06-04 15:29:47 -040053 void addRef() const;
54 void release() const;
55
56 rx::RenderTarget *getRenderTarget();
57 rx::RenderTarget *getDepthStencil();
58 rx::TextureStorage *getTextureStorage();
59
60 GLsizei getWidth() const;
61 GLsizei getHeight() const;
62 GLenum getInternalFormat() const;
63 GLenum getActualFormat() const;
Jamie Madill1e3fa742014-06-16 10:34:00 -040064 GLuint getRedSize(int clientVersion) const;
65 GLuint getGreenSize(int clientVersion) const;
66 GLuint getBlueSize(int clientVersion) const;
67 GLuint getAlphaSize(int clientVersion) const;
68 GLuint getDepthSize(int clientVersion) const;
69 GLuint getStencilSize(int clientVersion) const;
70 GLenum getComponentType(int clientVersion) const;
71 GLenum getColorEncoding(int clientVersion) const;
Jamie Madillafc21c02014-06-04 15:29:47 -040072 GLsizei getSamples() const;
Jamie Madill218b6ed2014-06-16 10:34:01 -040073 bool isTexture() const;
Jamie Madillafc21c02014-06-04 15:29:47 -040074
75 unsigned int getSerial() const;
76
Jamie Madill218b6ed2014-06-16 10:34:01 -040077 GLuint id() const;
78 GLenum type() const;
Jamie Madill9c074a32014-06-16 10:34:02 -040079 GLint mipLevel() const;
80 GLint layer() const;
Jamie Madillafc21c02014-06-04 15:29:47 -040081 unsigned int getTextureSerial() const;
82
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040083 void setImplementation(FramebufferAttachmentImpl *newImpl);
Jamie Madillafc21c02014-06-04 15:29:47 -040084
85 private:
86 DISALLOW_COPY_AND_ASSIGN(FramebufferAttachment);
87
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040088 FramebufferAttachmentImpl *mImpl;
Jamie Madillafc21c02014-06-04 15:29:47 -040089};
90
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040091class FramebufferAttachmentImpl
Jamie Madillafc21c02014-06-04 15:29:47 -040092{
93 public:
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040094 FramebufferAttachmentImpl();
Jamie Madillafc21c02014-06-04 15:29:47 -040095
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040096 virtual ~FramebufferAttachmentImpl() {};
Jamie Madillafc21c02014-06-04 15:29:47 -040097
98 virtual void addProxyRef(const FramebufferAttachment *proxy);
99 virtual void releaseProxy(const FramebufferAttachment *proxy);
100
101 virtual rx::RenderTarget *getRenderTarget() = 0;
102 virtual rx::RenderTarget *getDepthStencil() = 0;
103 virtual rx::TextureStorage *getTextureStorage() = 0;
104
105 virtual GLsizei getWidth() const = 0;
106 virtual GLsizei getHeight() const = 0;
107 virtual GLenum getInternalFormat() const = 0;
108 virtual GLenum getActualFormat() const = 0;
109 virtual GLsizei getSamples() const = 0;
110
111 virtual unsigned int getSerial() const = 0;
112
Jamie Madill218b6ed2014-06-16 10:34:01 -0400113 virtual GLuint id() const = 0;
114 virtual GLenum type() const = 0;
Jamie Madill9c074a32014-06-16 10:34:02 -0400115 virtual GLint mipLevel() const = 0;
116 virtual GLint layer() const = 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400117 virtual unsigned int getTextureSerial() const = 0;
118
119 private:
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400120 DISALLOW_COPY_AND_ASSIGN(FramebufferAttachmentImpl);
Jamie Madillafc21c02014-06-04 15:29:47 -0400121};
122
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400123class Texture2DAttachment : public FramebufferAttachmentImpl
Jamie Madillafc21c02014-06-04 15:29:47 -0400124{
125 public:
126 Texture2DAttachment(Texture2D *texture, GLint level);
127
128 virtual ~Texture2DAttachment();
129
130 void addProxyRef(const FramebufferAttachment *proxy);
131 void releaseProxy(const FramebufferAttachment *proxy);
132
133 rx::RenderTarget *getRenderTarget();
134 rx::RenderTarget *getDepthStencil();
135 rx::TextureStorage *getTextureStorage();
136
137 virtual GLsizei getWidth() const;
138 virtual GLsizei getHeight() const;
139 virtual GLenum getInternalFormat() const;
140 virtual GLenum getActualFormat() const;
141 virtual GLsizei getSamples() const;
142
143 virtual unsigned int getSerial() const;
144
Jamie Madill218b6ed2014-06-16 10:34:01 -0400145 virtual GLuint id() const;
146 virtual GLenum type() const;
Jamie Madill9c074a32014-06-16 10:34:02 -0400147 virtual GLint mipLevel() const;
148 virtual GLint layer() const;
Jamie Madillafc21c02014-06-04 15:29:47 -0400149 virtual unsigned int getTextureSerial() const;
150
151 private:
152 DISALLOW_COPY_AND_ASSIGN(Texture2DAttachment);
153
154 BindingPointer <Texture2D> mTexture2D;
155 const GLint mLevel;
156};
157
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400158class TextureCubeMapAttachment : public FramebufferAttachmentImpl
Jamie Madillafc21c02014-06-04 15:29:47 -0400159{
160 public:
161 TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level);
162
163 virtual ~TextureCubeMapAttachment();
164
165 void addProxyRef(const FramebufferAttachment *proxy);
166 void releaseProxy(const FramebufferAttachment *proxy);
167
168 rx::RenderTarget *getRenderTarget();
169 rx::RenderTarget *getDepthStencil();
170 rx::TextureStorage *getTextureStorage();
171
172 virtual GLsizei getWidth() const;
173 virtual GLsizei getHeight() const;
174 virtual GLenum getInternalFormat() const;
175 virtual GLenum getActualFormat() const;
176 virtual GLsizei getSamples() const;
177
178 virtual unsigned int getSerial() const;
179
Jamie Madill218b6ed2014-06-16 10:34:01 -0400180 virtual GLuint id() const;
181 virtual GLenum type() const;
Jamie Madill9c074a32014-06-16 10:34:02 -0400182 virtual GLint mipLevel() const;
183 virtual GLint layer() const;
Jamie Madillafc21c02014-06-04 15:29:47 -0400184 virtual unsigned int getTextureSerial() const;
185
186 private:
187 DISALLOW_COPY_AND_ASSIGN(TextureCubeMapAttachment);
188
189 BindingPointer <TextureCubeMap> mTextureCubeMap;
190 const GLint mLevel;
191 const GLenum mFaceTarget;
192};
193
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400194class Texture3DAttachment : public FramebufferAttachmentImpl
Jamie Madillafc21c02014-06-04 15:29:47 -0400195{
196 public:
197 Texture3DAttachment(Texture3D *texture, GLint level, GLint layer);
198
199 virtual ~Texture3DAttachment();
200
201 void addProxyRef(const FramebufferAttachment *proxy);
202 void releaseProxy(const FramebufferAttachment *proxy);
203
204 rx::RenderTarget *getRenderTarget();
205 rx::RenderTarget *getDepthStencil();
206 rx::TextureStorage *getTextureStorage();
207
208 virtual GLsizei getWidth() const;
209 virtual GLsizei getHeight() const;
210 virtual GLenum getInternalFormat() const;
211 virtual GLenum getActualFormat() const;
212 virtual GLsizei getSamples() const;
213
214 virtual unsigned int getSerial() const;
215
Jamie Madill218b6ed2014-06-16 10:34:01 -0400216 virtual GLuint id() const;
217 virtual GLenum type() const;
Jamie Madill9c074a32014-06-16 10:34:02 -0400218 virtual GLint mipLevel() const;
219 virtual GLint layer() const;
Jamie Madillafc21c02014-06-04 15:29:47 -0400220 virtual unsigned int getTextureSerial() const;
221
222 private:
223 DISALLOW_COPY_AND_ASSIGN(Texture3DAttachment);
224
225 BindingPointer<Texture3D> mTexture3D;
226 const GLint mLevel;
227 const GLint mLayer;
228};
229
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400230class Texture2DArrayAttachment : public FramebufferAttachmentImpl
Jamie Madillafc21c02014-06-04 15:29:47 -0400231{
232 public:
233 Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer);
234
235 virtual ~Texture2DArrayAttachment();
236
237 void addProxyRef(const FramebufferAttachment *proxy);
238 void releaseProxy(const FramebufferAttachment *proxy);
239
240 rx::RenderTarget *getRenderTarget();
241 rx::RenderTarget *getDepthStencil();
242 rx::TextureStorage *getTextureStorage();
243
244 virtual GLsizei getWidth() const;
245 virtual GLsizei getHeight() const;
246 virtual GLenum getInternalFormat() const;
247 virtual GLenum getActualFormat() const;
248 virtual GLsizei getSamples() const;
249
250 virtual unsigned int getSerial() const;
251
Jamie Madill218b6ed2014-06-16 10:34:01 -0400252 virtual GLuint id() const;
253 virtual GLenum type() const;
Jamie Madill9c074a32014-06-16 10:34:02 -0400254 virtual GLint mipLevel() const;
255 virtual GLint layer() const;
Jamie Madillafc21c02014-06-04 15:29:47 -0400256 virtual unsigned int getTextureSerial() const;
257
258 private:
259 DISALLOW_COPY_AND_ASSIGN(Texture2DArrayAttachment);
260
261 BindingPointer<Texture2DArray> mTexture2DArray;
262 const GLint mLevel;
263 const GLint mLayer;
264};
265
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400266class RenderbufferAttachment : public FramebufferAttachmentImpl
267{
268 public:
269 RenderbufferAttachment(Renderbuffer *renderbuffer);
270
271 virtual ~RenderbufferAttachment();
272
273 rx::RenderTarget *getRenderTarget();
274 rx::RenderTarget *getDepthStencil();
275 rx::TextureStorage *getTextureStorage();
276
277 virtual GLsizei getWidth() const;
278 virtual GLsizei getHeight() const;
279 virtual GLenum getInternalFormat() const;
280 virtual GLenum getActualFormat() const;
281 virtual GLsizei getSamples() const;
282
283 virtual unsigned int getSerial() const;
284
Jamie Madill218b6ed2014-06-16 10:34:01 -0400285 virtual GLuint id() const;
286 virtual GLenum type() const;
Jamie Madill9c074a32014-06-16 10:34:02 -0400287 virtual GLint mipLevel() const;
288 virtual GLint layer() const;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400289 virtual unsigned int getTextureSerial() const;
290
291 private:
292 DISALLOW_COPY_AND_ASSIGN(RenderbufferAttachment);
293
294 BindingPointer<Renderbuffer> mRenderbuffer;
295};
296
Jamie Madillafc21c02014-06-04 15:29:47 -0400297}
298
299#endif // LIBGLESV2_FRAMEBUFFERATTACHMENT_H_