blob: c26f07d17036a0da519c4093ce41229c89fb1702 [file] [log] [blame]
Jamie Madillafc21c02014-06-04 15:29:47 -04001#include "precompiled.h"
2//
3// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// FramebufferAttachment.cpp: the gl::FramebufferAttachment class and its derived classes
9// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
10
11#include "libGLESv2/FramebufferAttachment.h"
12#include "libGLESv2/renderer/RenderTarget.h"
13
14#include "libGLESv2/Texture.h"
15#include "libGLESv2/renderer/Renderer.h"
16#include "libGLESv2/renderer/TextureStorage.h"
17#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
Jamie Madill1e3fa742014-06-16 10:34:00 -040034GLuint FramebufferAttachment::getRedSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -040035{
Jamie Madill1e3fa742014-06-16 10:34:00 -040036 if (gl::GetRedBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -040037 {
Jamie Madill1e3fa742014-06-16 10:34:00 -040038 return gl::GetRedBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -040039 }
40 else
41 {
42 return 0;
43 }
Jamie Madillafc21c02014-06-04 15:29:47 -040044}
45
Jamie Madill1e3fa742014-06-16 10:34:00 -040046GLuint FramebufferAttachment::getGreenSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -040047{
Jamie Madill1e3fa742014-06-16 10:34:00 -040048 if (gl::GetGreenBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -040049 {
Jamie Madill1e3fa742014-06-16 10:34:00 -040050 return gl::GetGreenBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -040051 }
52 else
53 {
54 return 0;
55 }
Jamie Madillafc21c02014-06-04 15:29:47 -040056}
57
Jamie Madill1e3fa742014-06-16 10:34:00 -040058GLuint FramebufferAttachment::getBlueSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -040059{
Jamie Madill1e3fa742014-06-16 10:34:00 -040060 if (gl::GetBlueBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -040061 {
Jamie Madill1e3fa742014-06-16 10:34:00 -040062 return gl::GetBlueBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -040063 }
64 else
65 {
66 return 0;
67 }
Jamie Madillafc21c02014-06-04 15:29:47 -040068}
69
Jamie Madill1e3fa742014-06-16 10:34:00 -040070GLuint FramebufferAttachment::getAlphaSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -040071{
Jamie Madill1e3fa742014-06-16 10:34:00 -040072 if (gl::GetAlphaBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -040073 {
Jamie Madill1e3fa742014-06-16 10:34:00 -040074 return gl::GetAlphaBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -040075 }
76 else
77 {
78 return 0;
79 }
Jamie Madillafc21c02014-06-04 15:29:47 -040080}
81
Jamie Madill1e3fa742014-06-16 10:34:00 -040082GLuint FramebufferAttachment::getDepthSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -040083{
Jamie Madill1e3fa742014-06-16 10:34:00 -040084 if (gl::GetDepthBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -040085 {
Jamie Madill1e3fa742014-06-16 10:34:00 -040086 return gl::GetDepthBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -040087 }
88 else
89 {
90 return 0;
91 }
Jamie Madillafc21c02014-06-04 15:29:47 -040092}
93
Jamie Madill1e3fa742014-06-16 10:34:00 -040094GLuint FramebufferAttachment::getStencilSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -040095{
Jamie Madill1e3fa742014-06-16 10:34:00 -040096 if (gl::GetStencilBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -040097 {
Jamie Madill1e3fa742014-06-16 10:34:00 -040098 return gl::GetStencilBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -040099 }
100 else
101 {
102 return 0;
103 }
Jamie Madillafc21c02014-06-04 15:29:47 -0400104}
105
Jamie Madill1e3fa742014-06-16 10:34:00 -0400106GLenum FramebufferAttachment::getComponentType(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400107{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400108 return gl::GetComponentType(getActualFormat(), clientVersion);
Jamie Madillafc21c02014-06-04 15:29:47 -0400109}
110
Jamie Madill1e3fa742014-06-16 10:34:00 -0400111GLenum FramebufferAttachment::getColorEncoding(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400112{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400113 return gl::GetColorEncoding(getActualFormat(), clientVersion);
Jamie Madillafc21c02014-06-04 15:29:47 -0400114}
115
Jamie Madill218b6ed2014-06-16 10:34:01 -0400116bool FramebufferAttachment::isTexture() const
117{
118 return (type() != GL_RENDERBUFFER);
119}
120
Jamie Madille261b442014-06-25 12:42:21 -0400121///// Texture2DAttachment Implementation ////////
122
123Texture2DAttachment::Texture2DAttachment(Texture2D *texture, GLint level) : mLevel(level)
Jamie Madillafc21c02014-06-04 15:29:47 -0400124{
Jamie Madille261b442014-06-25 12:42:21 -0400125 mTexture2D.set(texture);
Jamie Madillafc21c02014-06-04 15:29:47 -0400126}
127
Jamie Madille261b442014-06-25 12:42:21 -0400128Texture2DAttachment::~Texture2DAttachment()
Jamie Madillafc21c02014-06-04 15:29:47 -0400129{
Jamie Madille261b442014-06-25 12:42:21 -0400130 mTexture2D.set(NULL);
Jamie Madillafc21c02014-06-04 15:29:47 -0400131}
132
Jamie Madille261b442014-06-25 12:42:21 -0400133rx::RenderTarget *Texture2DAttachment::getRenderTarget()
Jamie Madillafc21c02014-06-04 15:29:47 -0400134{
Jamie Madille261b442014-06-25 12:42:21 -0400135 return mTexture2D->getRenderTarget(mLevel);
Jamie Madill218b6ed2014-06-16 10:34:01 -0400136}
137
Jamie Madille261b442014-06-25 12:42:21 -0400138rx::RenderTarget *Texture2DAttachment::getDepthStencil()
Jamie Madill218b6ed2014-06-16 10:34:01 -0400139{
Jamie Madille261b442014-06-25 12:42:21 -0400140 return mTexture2D->getDepthSencil(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -0400141}
142
Jamie Madille261b442014-06-25 12:42:21 -0400143rx::TextureStorage *Texture2DAttachment::getTextureStorage()
Jamie Madill9c074a32014-06-16 10:34:02 -0400144{
Jamie Madille261b442014-06-25 12:42:21 -0400145 return mTexture2D->getNativeTexture()->getStorageInstance();
Jamie Madill9c074a32014-06-16 10:34:02 -0400146}
147
Jamie Madille261b442014-06-25 12:42:21 -0400148GLsizei Texture2DAttachment::getWidth() const
Jamie Madill9c074a32014-06-16 10:34:02 -0400149{
Jamie Madille261b442014-06-25 12:42:21 -0400150 return mTexture2D->getWidth(mLevel);
Jamie Madill9c074a32014-06-16 10:34:02 -0400151}
152
Jamie Madille261b442014-06-25 12:42:21 -0400153GLsizei Texture2DAttachment::getHeight() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400154{
Jamie Madille261b442014-06-25 12:42:21 -0400155 return mTexture2D->getHeight(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -0400156}
157
Jamie Madille261b442014-06-25 12:42:21 -0400158GLenum Texture2DAttachment::getInternalFormat() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400159{
Jamie Madille261b442014-06-25 12:42:21 -0400160 return mTexture2D->getInternalFormat(mLevel);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400161}
162
Jamie Madille261b442014-06-25 12:42:21 -0400163GLenum Texture2DAttachment::getActualFormat() const
164{
165 return mTexture2D->getActualFormat(mLevel);
166}
167
168GLsizei Texture2DAttachment::getSamples() const
169{
170 return 0;
171}
172
173unsigned int Texture2DAttachment::getSerial() const
174{
175 return mTexture2D->getRenderTargetSerial(mLevel);
176}
177
178GLuint Texture2DAttachment::id() const
179{
180 return mTexture2D->id();
181}
182
183GLenum Texture2DAttachment::type() const
184{
185 return GL_TEXTURE_2D;
186}
187
188GLint Texture2DAttachment::mipLevel() const
189{
190 return mLevel;
191}
192
193GLint Texture2DAttachment::layer() const
194{
195 return 0;
196}
197
198unsigned int Texture2DAttachment::getTextureSerial() const
199{
200 return mTexture2D->getTextureSerial();
201}
202
203///// TextureCubeMapAttachment Implementation ////////
204
205TextureCubeMapAttachment::TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level)
206 : mFaceTarget(faceTarget), mLevel(level)
207{
208 mTextureCubeMap.set(texture);
209}
210
211TextureCubeMapAttachment::~TextureCubeMapAttachment()
212{
213 mTextureCubeMap.set(NULL);
214}
215
216rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
217{
218 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
219}
220
221rx::RenderTarget *TextureCubeMapAttachment::getDepthStencil()
222{
223 return mTextureCubeMap->getDepthStencil(mFaceTarget, mLevel);
224}
225
226rx::TextureStorage *TextureCubeMapAttachment::getTextureStorage()
227{
228 return mTextureCubeMap->getNativeTexture()->getStorageInstance();
229}
230
231GLsizei TextureCubeMapAttachment::getWidth() const
232{
233 return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
234}
235
236GLsizei TextureCubeMapAttachment::getHeight() const
237{
238 return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
239}
240
241GLenum TextureCubeMapAttachment::getInternalFormat() const
242{
243 return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
244}
245
246GLenum TextureCubeMapAttachment::getActualFormat() const
247{
248 return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
249}
250
251GLsizei TextureCubeMapAttachment::getSamples() const
252{
253 return 0;
254}
255
256unsigned int TextureCubeMapAttachment::getSerial() const
257{
258 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
259}
260
261GLuint TextureCubeMapAttachment::id() const
262{
263 return mTextureCubeMap->id();
264}
265
266GLenum TextureCubeMapAttachment::type() const
267{
268 return mFaceTarget;
269}
270
271GLint TextureCubeMapAttachment::mipLevel() const
272{
273 return mLevel;
274}
275
276GLint TextureCubeMapAttachment::layer() const
277{
278 return 0;
279}
280
281unsigned int TextureCubeMapAttachment::getTextureSerial() const
282{
283 return mTextureCubeMap->getTextureSerial();
284}
285
286///// Texture3DAttachment Implementation ////////
287
288Texture3DAttachment::Texture3DAttachment(Texture3D *texture, GLint level, GLint layer)
289 : mLevel(level), mLayer(layer)
290{
291 mTexture3D.set(texture);
292}
293
294Texture3DAttachment::~Texture3DAttachment()
295{
296 mTexture3D.set(NULL);
297}
298
299rx::RenderTarget *Texture3DAttachment::getRenderTarget()
300{
301 return mTexture3D->getRenderTarget(mLevel, mLayer);
302}
303
304rx::RenderTarget *Texture3DAttachment::getDepthStencil()
305{
306 return mTexture3D->getDepthStencil(mLevel, mLayer);
307}
308
309rx::TextureStorage *Texture3DAttachment::getTextureStorage()
310{
311 return mTexture3D->getNativeTexture()->getStorageInstance();
312}
313
314GLsizei Texture3DAttachment::getWidth() const
315{
316 return mTexture3D->getWidth(mLevel);
317}
318
319GLsizei Texture3DAttachment::getHeight() const
320{
321 return mTexture3D->getHeight(mLevel);
322}
323
324GLenum Texture3DAttachment::getInternalFormat() const
325{
326 return mTexture3D->getInternalFormat(mLevel);
327}
328
329GLenum Texture3DAttachment::getActualFormat() const
330{
331 return mTexture3D->getActualFormat(mLevel);
332}
333
334GLsizei Texture3DAttachment::getSamples() const
335{
336 return 0;
337}
338
339unsigned int Texture3DAttachment::getSerial() const
340{
341 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
342}
343
344GLuint Texture3DAttachment::id() const
345{
346 return mTexture3D->id();
347}
348
349GLenum Texture3DAttachment::type() const
350{
351 return GL_TEXTURE_3D;
352}
353
354GLint Texture3DAttachment::mipLevel() const
355{
356 return mLevel;
357}
358
359GLint Texture3DAttachment::layer() const
360{
361 return mLayer;
362}
363
364unsigned int Texture3DAttachment::getTextureSerial() const
365{
366 return mTexture3D->getTextureSerial();
367}
368
369////// Texture2DArrayAttachment Implementation //////
370
371Texture2DArrayAttachment::Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer)
372 : mLevel(level), mLayer(layer)
373{
374 mTexture2DArray.set(texture);
375}
376
377Texture2DArrayAttachment::~Texture2DArrayAttachment()
378{
379 mTexture2DArray.set(NULL);
380}
381
382rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
383{
384 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
385}
386
387rx::RenderTarget *Texture2DArrayAttachment::getDepthStencil()
388{
389 return mTexture2DArray->getDepthStencil(mLevel, mLayer);
390}
391
392rx::TextureStorage *Texture2DArrayAttachment::getTextureStorage()
393{
394 return mTexture2DArray->getNativeTexture()->getStorageInstance();
395}
396
397GLsizei Texture2DArrayAttachment::getWidth() const
398{
399 return mTexture2DArray->getWidth(mLevel);
400}
401
402GLsizei Texture2DArrayAttachment::getHeight() const
403{
404 return mTexture2DArray->getHeight(mLevel);
405}
406
407GLenum Texture2DArrayAttachment::getInternalFormat() const
408{
409 return mTexture2DArray->getInternalFormat(mLevel);
410}
411
412GLenum Texture2DArrayAttachment::getActualFormat() const
413{
414 return mTexture2DArray->getActualFormat(mLevel);
415}
416
417GLsizei Texture2DArrayAttachment::getSamples() const
418{
419 return 0;
420}
421
422unsigned int Texture2DArrayAttachment::getSerial() const
423{
424 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
425}
426
427GLuint Texture2DArrayAttachment::id() const
428{
429 return mTexture2DArray->id();
430}
431
432GLenum Texture2DArrayAttachment::type() const
433{
434 return GL_TEXTURE_2D_ARRAY;
435}
436
437GLint Texture2DArrayAttachment::mipLevel() const
438{
439 return mLevel;
440}
441
442GLint Texture2DArrayAttachment::layer() const
443{
444 return mLayer;
445}
446
447unsigned int Texture2DArrayAttachment::getTextureSerial() const
448{
449 return mTexture2DArray->getTextureSerial();
450}
451
452////// RenderbufferAttachment Implementation //////
453
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400454RenderbufferAttachment::RenderbufferAttachment(Renderbuffer *renderbuffer)
455{
456 ASSERT(renderbuffer);
457 mRenderbuffer.set(renderbuffer);
458}
459
460RenderbufferAttachment::~RenderbufferAttachment()
461{
462 mRenderbuffer.set(NULL);
463}
464
465rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
466{
467 return mRenderbuffer->getStorage()->getRenderTarget();
468}
469
470rx::RenderTarget *RenderbufferAttachment::getDepthStencil()
471{
472 return mRenderbuffer->getStorage()->getDepthStencil();
473}
474
475rx::TextureStorage *RenderbufferAttachment::getTextureStorage()
476{
477 UNREACHABLE();
478 return NULL;
479}
480
481GLsizei RenderbufferAttachment::getWidth() const
482{
483 return mRenderbuffer->getWidth();
484}
485
486GLsizei RenderbufferAttachment::getHeight() const
487{
488 return mRenderbuffer->getHeight();
489}
490
491GLenum RenderbufferAttachment::getInternalFormat() const
492{
493 return mRenderbuffer->getInternalFormat();
494}
495
496GLenum RenderbufferAttachment::getActualFormat() const
497{
498 return mRenderbuffer->getActualFormat();
499}
500
501GLsizei RenderbufferAttachment::getSamples() const
502{
503 return mRenderbuffer->getStorage()->getSamples();
504}
505
506unsigned int RenderbufferAttachment::getSerial() const
507{
508 return mRenderbuffer->getStorage()->getSerial();
509}
510
Jamie Madill218b6ed2014-06-16 10:34:01 -0400511GLuint RenderbufferAttachment::id() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400512{
Jamie Madill218b6ed2014-06-16 10:34:01 -0400513 return mRenderbuffer->id();
514}
515
516GLenum RenderbufferAttachment::type() const
517{
518 return GL_RENDERBUFFER;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400519}
520
Jamie Madill9c074a32014-06-16 10:34:02 -0400521GLint RenderbufferAttachment::mipLevel() const
522{
523 return 0;
524}
525
526GLint RenderbufferAttachment::layer() const
527{
528 return 0;
529}
530
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400531unsigned int RenderbufferAttachment::getTextureSerial() const
532{
533 UNREACHABLE();
534 return 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400535}
536
537}