blob: badcec1daaf75e92b32f7ae624a64791b79adcb8 [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
Jamie Madillea247592014-08-28 10:37:08 -040010#include "libGLESv2/common_includes.h"
Jamie Madillafc21c02014-06-04 15:29:47 -040011#include "libGLESv2/FramebufferAttachment.h"
12#include "libGLESv2/renderer/RenderTarget.h"
13
14#include "libGLESv2/Texture.h"
15#include "libGLESv2/renderer/Renderer.h"
Brandon Jones6518fe22014-07-08 15:16:52 -070016#include "libGLESv2/renderer/d3d/TextureStorage.h"
Jamie Madillafc21c02014-06-04 15:29:47 -040017#include "common/utilities.h"
18#include "libGLESv2/formatutils.h"
19#include "libGLESv2/Renderbuffer.h"
20
21namespace gl
22{
23
Jamie Madillafc21c02014-06-04 15:29:47 -040024////// FramebufferAttachment Implementation //////
25
Jamie Madille261b442014-06-25 12:42:21 -040026FramebufferAttachment::FramebufferAttachment()
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 Madille261b442014-06-25 12:42:21 -040079///// Texture2DAttachment Implementation ////////
80
81Texture2DAttachment::Texture2DAttachment(Texture2D *texture, GLint level) : mLevel(level)
Jamie Madillafc21c02014-06-04 15:29:47 -040082{
Jamie Madille261b442014-06-25 12:42:21 -040083 mTexture2D.set(texture);
Jamie Madillafc21c02014-06-04 15:29:47 -040084}
85
Jamie Madille261b442014-06-25 12:42:21 -040086Texture2DAttachment::~Texture2DAttachment()
Jamie Madillafc21c02014-06-04 15:29:47 -040087{
Jamie Madille261b442014-06-25 12:42:21 -040088 mTexture2D.set(NULL);
Jamie Madillafc21c02014-06-04 15:29:47 -040089}
90
Jamie Madille261b442014-06-25 12:42:21 -040091rx::RenderTarget *Texture2DAttachment::getRenderTarget()
Jamie Madillafc21c02014-06-04 15:29:47 -040092{
Jamie Madille261b442014-06-25 12:42:21 -040093 return mTexture2D->getRenderTarget(mLevel);
Jamie Madill218b6ed2014-06-16 10:34:01 -040094}
95
Jamie Madille261b442014-06-25 12:42:21 -040096rx::RenderTarget *Texture2DAttachment::getDepthStencil()
Jamie Madill218b6ed2014-06-16 10:34:01 -040097{
Brandon Jonescef06ff2014-08-05 13:27:48 -070098 return mTexture2D->getDepthStencil(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -040099}
100
Jamie Madille261b442014-06-25 12:42:21 -0400101rx::TextureStorage *Texture2DAttachment::getTextureStorage()
Jamie Madill9c074a32014-06-16 10:34:02 -0400102{
Jamie Madille261b442014-06-25 12:42:21 -0400103 return mTexture2D->getNativeTexture()->getStorageInstance();
Jamie Madill9c074a32014-06-16 10:34:02 -0400104}
105
Jamie Madille261b442014-06-25 12:42:21 -0400106GLsizei Texture2DAttachment::getWidth() const
Jamie Madill9c074a32014-06-16 10:34:02 -0400107{
Jamie Madille261b442014-06-25 12:42:21 -0400108 return mTexture2D->getWidth(mLevel);
Jamie Madill9c074a32014-06-16 10:34:02 -0400109}
110
Jamie Madille261b442014-06-25 12:42:21 -0400111GLsizei Texture2DAttachment::getHeight() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400112{
Jamie Madille261b442014-06-25 12:42:21 -0400113 return mTexture2D->getHeight(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -0400114}
115
Jamie Madille261b442014-06-25 12:42:21 -0400116GLenum Texture2DAttachment::getInternalFormat() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400117{
Jamie Madille261b442014-06-25 12:42:21 -0400118 return mTexture2D->getInternalFormat(mLevel);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400119}
120
Jamie Madille261b442014-06-25 12:42:21 -0400121GLenum Texture2DAttachment::getActualFormat() const
122{
123 return mTexture2D->getActualFormat(mLevel);
124}
125
126GLsizei Texture2DAttachment::getSamples() const
127{
128 return 0;
129}
130
131unsigned int Texture2DAttachment::getSerial() const
132{
133 return mTexture2D->getRenderTargetSerial(mLevel);
134}
135
136GLuint Texture2DAttachment::id() const
137{
138 return mTexture2D->id();
139}
140
141GLenum Texture2DAttachment::type() const
142{
143 return GL_TEXTURE_2D;
144}
145
146GLint Texture2DAttachment::mipLevel() const
147{
148 return mLevel;
149}
150
151GLint Texture2DAttachment::layer() const
152{
153 return 0;
154}
155
156unsigned int Texture2DAttachment::getTextureSerial() const
157{
158 return mTexture2D->getTextureSerial();
159}
160
161///// TextureCubeMapAttachment Implementation ////////
162
163TextureCubeMapAttachment::TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level)
164 : mFaceTarget(faceTarget), mLevel(level)
165{
166 mTextureCubeMap.set(texture);
167}
168
169TextureCubeMapAttachment::~TextureCubeMapAttachment()
170{
171 mTextureCubeMap.set(NULL);
172}
173
174rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
175{
176 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
177}
178
179rx::RenderTarget *TextureCubeMapAttachment::getDepthStencil()
180{
181 return mTextureCubeMap->getDepthStencil(mFaceTarget, mLevel);
182}
183
184rx::TextureStorage *TextureCubeMapAttachment::getTextureStorage()
185{
186 return mTextureCubeMap->getNativeTexture()->getStorageInstance();
187}
188
189GLsizei TextureCubeMapAttachment::getWidth() const
190{
191 return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
192}
193
194GLsizei TextureCubeMapAttachment::getHeight() const
195{
196 return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
197}
198
199GLenum TextureCubeMapAttachment::getInternalFormat() const
200{
201 return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
202}
203
204GLenum TextureCubeMapAttachment::getActualFormat() const
205{
206 return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
207}
208
209GLsizei TextureCubeMapAttachment::getSamples() const
210{
211 return 0;
212}
213
214unsigned int TextureCubeMapAttachment::getSerial() const
215{
216 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
217}
218
219GLuint TextureCubeMapAttachment::id() const
220{
221 return mTextureCubeMap->id();
222}
223
224GLenum TextureCubeMapAttachment::type() const
225{
226 return mFaceTarget;
227}
228
229GLint TextureCubeMapAttachment::mipLevel() const
230{
231 return mLevel;
232}
233
234GLint TextureCubeMapAttachment::layer() const
235{
236 return 0;
237}
238
239unsigned int TextureCubeMapAttachment::getTextureSerial() const
240{
241 return mTextureCubeMap->getTextureSerial();
242}
243
244///// Texture3DAttachment Implementation ////////
245
246Texture3DAttachment::Texture3DAttachment(Texture3D *texture, GLint level, GLint layer)
247 : mLevel(level), mLayer(layer)
248{
249 mTexture3D.set(texture);
250}
251
252Texture3DAttachment::~Texture3DAttachment()
253{
254 mTexture3D.set(NULL);
255}
256
257rx::RenderTarget *Texture3DAttachment::getRenderTarget()
258{
259 return mTexture3D->getRenderTarget(mLevel, mLayer);
260}
261
262rx::RenderTarget *Texture3DAttachment::getDepthStencil()
263{
264 return mTexture3D->getDepthStencil(mLevel, mLayer);
265}
266
267rx::TextureStorage *Texture3DAttachment::getTextureStorage()
268{
269 return mTexture3D->getNativeTexture()->getStorageInstance();
270}
271
272GLsizei Texture3DAttachment::getWidth() const
273{
274 return mTexture3D->getWidth(mLevel);
275}
276
277GLsizei Texture3DAttachment::getHeight() const
278{
279 return mTexture3D->getHeight(mLevel);
280}
281
282GLenum Texture3DAttachment::getInternalFormat() const
283{
284 return mTexture3D->getInternalFormat(mLevel);
285}
286
287GLenum Texture3DAttachment::getActualFormat() const
288{
289 return mTexture3D->getActualFormat(mLevel);
290}
291
292GLsizei Texture3DAttachment::getSamples() const
293{
294 return 0;
295}
296
297unsigned int Texture3DAttachment::getSerial() const
298{
299 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
300}
301
302GLuint Texture3DAttachment::id() const
303{
304 return mTexture3D->id();
305}
306
307GLenum Texture3DAttachment::type() const
308{
309 return GL_TEXTURE_3D;
310}
311
312GLint Texture3DAttachment::mipLevel() const
313{
314 return mLevel;
315}
316
317GLint Texture3DAttachment::layer() const
318{
319 return mLayer;
320}
321
322unsigned int Texture3DAttachment::getTextureSerial() const
323{
324 return mTexture3D->getTextureSerial();
325}
326
327////// Texture2DArrayAttachment Implementation //////
328
329Texture2DArrayAttachment::Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer)
330 : mLevel(level), mLayer(layer)
331{
332 mTexture2DArray.set(texture);
333}
334
335Texture2DArrayAttachment::~Texture2DArrayAttachment()
336{
337 mTexture2DArray.set(NULL);
338}
339
340rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
341{
342 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
343}
344
345rx::RenderTarget *Texture2DArrayAttachment::getDepthStencil()
346{
347 return mTexture2DArray->getDepthStencil(mLevel, mLayer);
348}
349
350rx::TextureStorage *Texture2DArrayAttachment::getTextureStorage()
351{
352 return mTexture2DArray->getNativeTexture()->getStorageInstance();
353}
354
355GLsizei Texture2DArrayAttachment::getWidth() const
356{
357 return mTexture2DArray->getWidth(mLevel);
358}
359
360GLsizei Texture2DArrayAttachment::getHeight() const
361{
362 return mTexture2DArray->getHeight(mLevel);
363}
364
365GLenum Texture2DArrayAttachment::getInternalFormat() const
366{
367 return mTexture2DArray->getInternalFormat(mLevel);
368}
369
370GLenum Texture2DArrayAttachment::getActualFormat() const
371{
372 return mTexture2DArray->getActualFormat(mLevel);
373}
374
375GLsizei Texture2DArrayAttachment::getSamples() const
376{
377 return 0;
378}
379
380unsigned int Texture2DArrayAttachment::getSerial() const
381{
382 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
383}
384
385GLuint Texture2DArrayAttachment::id() const
386{
387 return mTexture2DArray->id();
388}
389
390GLenum Texture2DArrayAttachment::type() const
391{
392 return GL_TEXTURE_2D_ARRAY;
393}
394
395GLint Texture2DArrayAttachment::mipLevel() const
396{
397 return mLevel;
398}
399
400GLint Texture2DArrayAttachment::layer() const
401{
402 return mLayer;
403}
404
405unsigned int Texture2DArrayAttachment::getTextureSerial() const
406{
407 return mTexture2DArray->getTextureSerial();
408}
409
410////// RenderbufferAttachment Implementation //////
411
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400412RenderbufferAttachment::RenderbufferAttachment(Renderbuffer *renderbuffer)
413{
414 ASSERT(renderbuffer);
415 mRenderbuffer.set(renderbuffer);
416}
417
418RenderbufferAttachment::~RenderbufferAttachment()
419{
420 mRenderbuffer.set(NULL);
421}
422
423rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
424{
425 return mRenderbuffer->getStorage()->getRenderTarget();
426}
427
428rx::RenderTarget *RenderbufferAttachment::getDepthStencil()
429{
430 return mRenderbuffer->getStorage()->getDepthStencil();
431}
432
433rx::TextureStorage *RenderbufferAttachment::getTextureStorage()
434{
435 UNREACHABLE();
436 return NULL;
437}
438
439GLsizei RenderbufferAttachment::getWidth() const
440{
441 return mRenderbuffer->getWidth();
442}
443
444GLsizei RenderbufferAttachment::getHeight() const
445{
446 return mRenderbuffer->getHeight();
447}
448
449GLenum RenderbufferAttachment::getInternalFormat() const
450{
451 return mRenderbuffer->getInternalFormat();
452}
453
454GLenum RenderbufferAttachment::getActualFormat() const
455{
456 return mRenderbuffer->getActualFormat();
457}
458
459GLsizei RenderbufferAttachment::getSamples() const
460{
461 return mRenderbuffer->getStorage()->getSamples();
462}
463
464unsigned int RenderbufferAttachment::getSerial() const
465{
466 return mRenderbuffer->getStorage()->getSerial();
467}
468
Jamie Madill218b6ed2014-06-16 10:34:01 -0400469GLuint RenderbufferAttachment::id() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400470{
Jamie Madill218b6ed2014-06-16 10:34:01 -0400471 return mRenderbuffer->id();
472}
473
474GLenum RenderbufferAttachment::type() const
475{
476 return GL_RENDERBUFFER;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400477}
478
Jamie Madill9c074a32014-06-16 10:34:02 -0400479GLint RenderbufferAttachment::mipLevel() const
480{
481 return 0;
482}
483
484GLint RenderbufferAttachment::layer() const
485{
486 return 0;
487}
488
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400489unsigned int RenderbufferAttachment::getTextureSerial() const
490{
491 UNREACHABLE();
492 return 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400493}
494
495}