blob: b611a445e9104ced06cb030ba65fb93f562f9e17 [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.cpp: the gl::FramebufferAttachment class and its derived classes
8// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
9
10#include "libGLESv2/FramebufferAttachment.h"
Jamie Madillafc21c02014-06-04 15:29:47 -040011#include "libGLESv2/Texture.h"
Jamie Madillafc21c02014-06-04 15:29:47 -040012#include "libGLESv2/formatutils.h"
13#include "libGLESv2/Renderbuffer.h"
Geoff Lang0b7eef72014-06-12 14:10:47 -040014#include "libGLESv2/renderer/RenderTarget.h"
15#include "libGLESv2/renderer/Renderer.h"
16#include "libGLESv2/renderer/d3d/TextureStorage.h"
17
18#include "common/utilities.h"
Jamie Madillafc21c02014-06-04 15:29:47 -040019
20namespace gl
21{
22
Jamie Madillafc21c02014-06-04 15:29:47 -040023////// FramebufferAttachment Implementation //////
24
Jamie Madillaef95de2014-09-05 10:12:41 -040025FramebufferAttachment::FramebufferAttachment(GLenum binding)
26 : mBinding(binding)
Jamie Madillafc21c02014-06-04 15:29:47 -040027{
Jamie Madillafc21c02014-06-04 15:29:47 -040028}
29
30FramebufferAttachment::~FramebufferAttachment()
31{
Jamie Madillafc21c02014-06-04 15:29:47 -040032}
33
Geoff Lange4a492b2014-06-19 14:14:41 -040034GLuint FramebufferAttachment::getRedSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040035{
Geoff Lang5d601382014-07-22 15:14:06 -040036 return (GetInternalFormatInfo(getInternalFormat()).redBits > 0) ? GetInternalFormatInfo(getActualFormat()).redBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040037}
38
Geoff Lange4a492b2014-06-19 14:14:41 -040039GLuint FramebufferAttachment::getGreenSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040040{
Geoff Lang5d601382014-07-22 15:14:06 -040041 return (GetInternalFormatInfo(getInternalFormat()).greenBits > 0) ? GetInternalFormatInfo(getActualFormat()).greenBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040042}
43
Geoff Lange4a492b2014-06-19 14:14:41 -040044GLuint FramebufferAttachment::getBlueSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040045{
Geoff Lang5d601382014-07-22 15:14:06 -040046 return (GetInternalFormatInfo(getInternalFormat()).blueBits > 0) ? GetInternalFormatInfo(getActualFormat()).blueBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040047}
48
Geoff Lange4a492b2014-06-19 14:14:41 -040049GLuint FramebufferAttachment::getAlphaSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040050{
Geoff Lang5d601382014-07-22 15:14:06 -040051 return (GetInternalFormatInfo(getInternalFormat()).alphaBits > 0) ? GetInternalFormatInfo(getActualFormat()).alphaBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040052}
53
Geoff Lange4a492b2014-06-19 14:14:41 -040054GLuint FramebufferAttachment::getDepthSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040055{
Geoff Lang5d601382014-07-22 15:14:06 -040056 return (GetInternalFormatInfo(getInternalFormat()).depthBits > 0) ? GetInternalFormatInfo(getActualFormat()).depthBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040057}
58
Geoff Lange4a492b2014-06-19 14:14:41 -040059GLuint FramebufferAttachment::getStencilSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040060{
Geoff Lang5d601382014-07-22 15:14:06 -040061 return (GetInternalFormatInfo(getInternalFormat()).stencilBits > 0) ? GetInternalFormatInfo(getActualFormat()).stencilBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040062}
63
Geoff Lange4a492b2014-06-19 14:14:41 -040064GLenum FramebufferAttachment::getComponentType() const
Jamie Madillafc21c02014-06-04 15:29:47 -040065{
Geoff Lang5d601382014-07-22 15:14:06 -040066 return GetInternalFormatInfo(getActualFormat()).componentType;
Jamie Madillafc21c02014-06-04 15:29:47 -040067}
68
Geoff Lange4a492b2014-06-19 14:14:41 -040069GLenum FramebufferAttachment::getColorEncoding() const
Jamie Madillafc21c02014-06-04 15:29:47 -040070{
Geoff Lang5d601382014-07-22 15:14:06 -040071 return GetInternalFormatInfo(getActualFormat()).colorEncoding;
Jamie Madillafc21c02014-06-04 15:29:47 -040072}
73
Jamie Madill218b6ed2014-06-16 10:34:01 -040074bool FramebufferAttachment::isTexture() const
75{
76 return (type() != GL_RENDERBUFFER);
77}
78
Jamie Madill3592a332014-09-03 15:07:15 -040079///// TextureAttachment Implementation ////////
80
Jamie Madillde3ed702014-09-03 15:07:17 -040081TextureAttachment::TextureAttachment(GLenum binding, const ImageIndex &index)
82 : FramebufferAttachment(binding),
83 mIndex(index)
Jamie Madillaef95de2014-09-05 10:12:41 -040084{}
85
Jamie Madill3592a332014-09-03 15:07:15 -040086rx::TextureStorage *TextureAttachment::getTextureStorage()
87{
88 return getTexture()->getNativeTexture()->getStorageInstance();
89}
90
91GLsizei TextureAttachment::getSamples() const
92{
93 return 0;
94}
95
96GLuint TextureAttachment::id() const
97{
98 return getTexture()->id();
99}
100
101unsigned int TextureAttachment::getTextureSerial() const
102{
103 return getTexture()->getTextureSerial();
104}
105
Jamie Madillde3ed702014-09-03 15:07:17 -0400106GLsizei TextureAttachment::getWidth() const
107{
108 return getTexture()->getWidth(mIndex);
109}
110
111GLsizei TextureAttachment::getHeight() const
112{
113 return getTexture()->getHeight(mIndex);
114}
115
116GLenum TextureAttachment::getInternalFormat() const
117{
118 return getTexture()->getInternalFormat(mIndex);
119}
120
121GLenum TextureAttachment::getActualFormat() const
122{
123 return getTexture()->getActualFormat(mIndex);
124}
125
126GLenum TextureAttachment::type() const
127{
128 return mIndex.type;
129}
130
131GLint TextureAttachment::mipLevel() const
132{
133 return mIndex.mipIndex;
134}
135
136GLint TextureAttachment::layer() const
137{
138 return mIndex.layerIndex;
139}
140
Jamie Madille261b442014-06-25 12:42:21 -0400141///// Texture2DAttachment Implementation ////////
142
Jamie Madillaef95de2014-09-05 10:12:41 -0400143Texture2DAttachment::Texture2DAttachment(GLenum binding, Texture2D *texture, GLint level)
Jamie Madillde3ed702014-09-03 15:07:17 -0400144 : TextureAttachment(binding, ImageIndex::Make2D(level)),
Jamie Madillaef95de2014-09-05 10:12:41 -0400145 mLevel(level)
Jamie Madillafc21c02014-06-04 15:29:47 -0400146{
Jamie Madille261b442014-06-25 12:42:21 -0400147 mTexture2D.set(texture);
Jamie Madillafc21c02014-06-04 15:29:47 -0400148}
149
Jamie Madille261b442014-06-25 12:42:21 -0400150Texture2DAttachment::~Texture2DAttachment()
Jamie Madillafc21c02014-06-04 15:29:47 -0400151{
Jamie Madille261b442014-06-25 12:42:21 -0400152 mTexture2D.set(NULL);
Jamie Madillafc21c02014-06-04 15:29:47 -0400153}
154
Jamie Madille261b442014-06-25 12:42:21 -0400155rx::RenderTarget *Texture2DAttachment::getRenderTarget()
Jamie Madillafc21c02014-06-04 15:29:47 -0400156{
Jamie Madille261b442014-06-25 12:42:21 -0400157 return mTexture2D->getRenderTarget(mLevel);
Jamie Madill218b6ed2014-06-16 10:34:01 -0400158}
159
Jamie Madille261b442014-06-25 12:42:21 -0400160unsigned int Texture2DAttachment::getSerial() const
161{
162 return mTexture2D->getRenderTargetSerial(mLevel);
163}
164
Jamie Madill3592a332014-09-03 15:07:15 -0400165Texture *Texture2DAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400166{
Jamie Madill3592a332014-09-03 15:07:15 -0400167 return mTexture2D.get();
Jamie Madille261b442014-06-25 12:42:21 -0400168}
169
170///// TextureCubeMapAttachment Implementation ////////
171
Jamie Madillaef95de2014-09-05 10:12:41 -0400172TextureCubeMapAttachment::TextureCubeMapAttachment(GLenum binding, TextureCubeMap *texture, GLenum faceTarget, GLint level)
Jamie Madillde3ed702014-09-03 15:07:17 -0400173 : TextureAttachment(binding, ImageIndex::MakeCube(faceTarget, level)),
174 mFaceTarget(faceTarget),
175 mLevel(level)
Jamie Madille261b442014-06-25 12:42:21 -0400176{
177 mTextureCubeMap.set(texture);
178}
179
180TextureCubeMapAttachment::~TextureCubeMapAttachment()
181{
182 mTextureCubeMap.set(NULL);
183}
184
185rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
186{
187 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
188}
189
Jamie Madille261b442014-06-25 12:42:21 -0400190unsigned int TextureCubeMapAttachment::getSerial() const
191{
192 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
193}
194
Jamie Madill3592a332014-09-03 15:07:15 -0400195Texture *TextureCubeMapAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400196{
Jamie Madill3592a332014-09-03 15:07:15 -0400197 return mTextureCubeMap.get();
Jamie Madille261b442014-06-25 12:42:21 -0400198}
199
200///// Texture3DAttachment Implementation ////////
201
Jamie Madillaef95de2014-09-05 10:12:41 -0400202Texture3DAttachment::Texture3DAttachment(GLenum binding, Texture3D *texture, GLint level, GLint layer)
Jamie Madillde3ed702014-09-03 15:07:17 -0400203 : TextureAttachment(binding, ImageIndex::Make3D(level, layer)),
Jamie Madillaef95de2014-09-05 10:12:41 -0400204 mLevel(level),
205 mLayer(layer)
Jamie Madille261b442014-06-25 12:42:21 -0400206{
207 mTexture3D.set(texture);
208}
209
210Texture3DAttachment::~Texture3DAttachment()
211{
212 mTexture3D.set(NULL);
213}
214
215rx::RenderTarget *Texture3DAttachment::getRenderTarget()
216{
217 return mTexture3D->getRenderTarget(mLevel, mLayer);
218}
219
Jamie Madille261b442014-06-25 12:42:21 -0400220unsigned int Texture3DAttachment::getSerial() const
221{
222 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
223}
224
Jamie Madill3592a332014-09-03 15:07:15 -0400225Texture *Texture3DAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400226{
Jamie Madill3592a332014-09-03 15:07:15 -0400227 return mTexture3D.get();
Jamie Madille261b442014-06-25 12:42:21 -0400228}
229
230////// Texture2DArrayAttachment Implementation //////
231
Jamie Madillaef95de2014-09-05 10:12:41 -0400232Texture2DArrayAttachment::Texture2DArrayAttachment(GLenum binding, Texture2DArray *texture, GLint level, GLint layer)
Jamie Madillde3ed702014-09-03 15:07:17 -0400233 : TextureAttachment(binding, ImageIndex::Make2DArray(level, layer)),
Jamie Madillaef95de2014-09-05 10:12:41 -0400234 mLevel(level),
235 mLayer(layer)
Jamie Madille261b442014-06-25 12:42:21 -0400236{
237 mTexture2DArray.set(texture);
238}
239
240Texture2DArrayAttachment::~Texture2DArrayAttachment()
241{
242 mTexture2DArray.set(NULL);
243}
244
245rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
246{
247 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
248}
249
Jamie Madille261b442014-06-25 12:42:21 -0400250unsigned int Texture2DArrayAttachment::getSerial() const
251{
252 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
253}
254
Jamie Madill3592a332014-09-03 15:07:15 -0400255Texture *Texture2DArrayAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400256{
Jamie Madill3592a332014-09-03 15:07:15 -0400257 return mTexture2DArray.get();
Jamie Madille261b442014-06-25 12:42:21 -0400258}
259
260////// RenderbufferAttachment Implementation //////
261
Jamie Madillaef95de2014-09-05 10:12:41 -0400262RenderbufferAttachment::RenderbufferAttachment(GLenum binding, Renderbuffer *renderbuffer)
263 : FramebufferAttachment(binding)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400264{
265 ASSERT(renderbuffer);
266 mRenderbuffer.set(renderbuffer);
267}
268
269RenderbufferAttachment::~RenderbufferAttachment()
270{
271 mRenderbuffer.set(NULL);
272}
273
274rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
275{
276 return mRenderbuffer->getStorage()->getRenderTarget();
277}
278
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400279rx::TextureStorage *RenderbufferAttachment::getTextureStorage()
280{
281 UNREACHABLE();
282 return NULL;
283}
284
285GLsizei RenderbufferAttachment::getWidth() const
286{
287 return mRenderbuffer->getWidth();
288}
289
290GLsizei RenderbufferAttachment::getHeight() const
291{
292 return mRenderbuffer->getHeight();
293}
294
295GLenum RenderbufferAttachment::getInternalFormat() const
296{
297 return mRenderbuffer->getInternalFormat();
298}
299
300GLenum RenderbufferAttachment::getActualFormat() const
301{
302 return mRenderbuffer->getActualFormat();
303}
304
305GLsizei RenderbufferAttachment::getSamples() const
306{
307 return mRenderbuffer->getStorage()->getSamples();
308}
309
310unsigned int RenderbufferAttachment::getSerial() const
311{
312 return mRenderbuffer->getStorage()->getSerial();
313}
314
Jamie Madill218b6ed2014-06-16 10:34:01 -0400315GLuint RenderbufferAttachment::id() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400316{
Jamie Madill218b6ed2014-06-16 10:34:01 -0400317 return mRenderbuffer->id();
318}
319
320GLenum RenderbufferAttachment::type() const
321{
322 return GL_RENDERBUFFER;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400323}
324
Jamie Madill9c074a32014-06-16 10:34:02 -0400325GLint RenderbufferAttachment::mipLevel() const
326{
327 return 0;
328}
329
330GLint RenderbufferAttachment::layer() const
331{
332 return 0;
333}
334
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400335unsigned int RenderbufferAttachment::getTextureSerial() const
336{
337 UNREACHABLE();
338 return 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400339}
340
341}