blob: bdafc2f7832f0cc9ad4272f6c16d10685cc980d5 [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 Madill6c7b4ad2014-06-16 10:33:59 -040024FramebufferAttachmentImpl::FramebufferAttachmentImpl()
Jamie Madillafc21c02014-06-04 15:29:47 -040025{
26}
27
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040028// The default case for classes inherited from FramebufferAttachmentImpl is not to
Jamie Madillafc21c02014-06-04 15:29:47 -040029// need to do anything upon the reference count to the parent FramebufferAttachment incrementing
30// or decrementing.
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040031void FramebufferAttachmentImpl::addProxyRef(const FramebufferAttachment *proxy)
Jamie Madillafc21c02014-06-04 15:29:47 -040032{
33}
34
Jamie Madill6c7b4ad2014-06-16 10:33:59 -040035void FramebufferAttachmentImpl::releaseProxy(const FramebufferAttachment *proxy)
Jamie Madillafc21c02014-06-04 15:29:47 -040036{
37}
38
39///// Texture2DAttachment Implementation ////////
40
41Texture2DAttachment::Texture2DAttachment(Texture2D *texture, GLint level) : mLevel(level)
42{
43 mTexture2D.set(texture);
44}
45
46Texture2DAttachment::~Texture2DAttachment()
47{
48 mTexture2D.set(NULL);
49}
50
51// Textures need to maintain their own reference count for references via
52// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
53void Texture2DAttachment::addProxyRef(const FramebufferAttachment *proxy)
54{
55 mTexture2D->addProxyRef(proxy);
56}
57
58void Texture2DAttachment::releaseProxy(const FramebufferAttachment *proxy)
59{
60 mTexture2D->releaseProxy(proxy);
61}
62
63rx::RenderTarget *Texture2DAttachment::getRenderTarget()
64{
65 return mTexture2D->getRenderTarget(mLevel);
66}
67
68rx::RenderTarget *Texture2DAttachment::getDepthStencil()
69{
70 return mTexture2D->getDepthSencil(mLevel);
71}
72
73rx::TextureStorage *Texture2DAttachment::getTextureStorage()
74{
75 return mTexture2D->getNativeTexture()->getStorageInstance();
76}
77
78GLsizei Texture2DAttachment::getWidth() const
79{
80 return mTexture2D->getWidth(mLevel);
81}
82
83GLsizei Texture2DAttachment::getHeight() const
84{
85 return mTexture2D->getHeight(mLevel);
86}
87
88GLenum Texture2DAttachment::getInternalFormat() const
89{
90 return mTexture2D->getInternalFormat(mLevel);
91}
92
93GLenum Texture2DAttachment::getActualFormat() const
94{
95 return mTexture2D->getActualFormat(mLevel);
96}
97
98GLsizei Texture2DAttachment::getSamples() const
99{
100 return 0;
101}
102
103unsigned int Texture2DAttachment::getSerial() const
104{
105 return mTexture2D->getRenderTargetSerial(mLevel);
106}
107
108bool Texture2DAttachment::isTexture() const
109{
110 return true;
111}
112
113unsigned int Texture2DAttachment::getTextureSerial() const
114{
115 return mTexture2D->getTextureSerial();
116}
117
118///// TextureCubeMapAttachment Implementation ////////
119
120TextureCubeMapAttachment::TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level)
121 : mFaceTarget(faceTarget), mLevel(level)
122{
123 mTextureCubeMap.set(texture);
124}
125
126TextureCubeMapAttachment::~TextureCubeMapAttachment()
127{
128 mTextureCubeMap.set(NULL);
129}
130
131// Textures need to maintain their own reference count for references via
132// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
133void TextureCubeMapAttachment::addProxyRef(const FramebufferAttachment *proxy)
134{
135 mTextureCubeMap->addProxyRef(proxy);
136}
137
138void TextureCubeMapAttachment::releaseProxy(const FramebufferAttachment *proxy)
139{
140 mTextureCubeMap->releaseProxy(proxy);
141}
142
143rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
144{
145 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
146}
147
148rx::RenderTarget *TextureCubeMapAttachment::getDepthStencil()
149{
150 return mTextureCubeMap->getDepthStencil(mFaceTarget, mLevel);
151}
152
153rx::TextureStorage *TextureCubeMapAttachment::getTextureStorage()
154{
155 return mTextureCubeMap->getNativeTexture()->getStorageInstance();
156}
157
158GLsizei TextureCubeMapAttachment::getWidth() const
159{
160 return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
161}
162
163GLsizei TextureCubeMapAttachment::getHeight() const
164{
165 return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
166}
167
168GLenum TextureCubeMapAttachment::getInternalFormat() const
169{
170 return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
171}
172
173GLenum TextureCubeMapAttachment::getActualFormat() const
174{
175 return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
176}
177
178GLsizei TextureCubeMapAttachment::getSamples() const
179{
180 return 0;
181}
182
183unsigned int TextureCubeMapAttachment::getSerial() const
184{
185 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
186}
187
188bool TextureCubeMapAttachment::isTexture() const
189{
190 return true;
191}
192
193unsigned int TextureCubeMapAttachment::getTextureSerial() const
194{
195 return mTextureCubeMap->getTextureSerial();
196}
197
198///// Texture3DAttachment Implementation ////////
199
200Texture3DAttachment::Texture3DAttachment(Texture3D *texture, GLint level, GLint layer)
201 : mLevel(level), mLayer(layer)
202{
203 mTexture3D.set(texture);
204}
205
206Texture3DAttachment::~Texture3DAttachment()
207{
208 mTexture3D.set(NULL);
209}
210
211// Textures need to maintain their own reference count for references via
212// Renderbuffers acting as proxies. Here, we notify the texture of a reference.
213void Texture3DAttachment::addProxyRef(const FramebufferAttachment *proxy)
214{
215 mTexture3D->addProxyRef(proxy);
216}
217
218void Texture3DAttachment::releaseProxy(const FramebufferAttachment *proxy)
219{
220 mTexture3D->releaseProxy(proxy);
221}
222
223rx::RenderTarget *Texture3DAttachment::getRenderTarget()
224{
225 return mTexture3D->getRenderTarget(mLevel, mLayer);
226}
227
228rx::RenderTarget *Texture3DAttachment::getDepthStencil()
229{
230 return mTexture3D->getDepthStencil(mLevel, mLayer);
231}
232
233rx::TextureStorage *Texture3DAttachment::getTextureStorage()
234{
235 return mTexture3D->getNativeTexture()->getStorageInstance();
236}
237
238GLsizei Texture3DAttachment::getWidth() const
239{
240 return mTexture3D->getWidth(mLevel);
241}
242
243GLsizei Texture3DAttachment::getHeight() const
244{
245 return mTexture3D->getHeight(mLevel);
246}
247
248GLenum Texture3DAttachment::getInternalFormat() const
249{
250 return mTexture3D->getInternalFormat(mLevel);
251}
252
253GLenum Texture3DAttachment::getActualFormat() const
254{
255 return mTexture3D->getActualFormat(mLevel);
256}
257
258GLsizei Texture3DAttachment::getSamples() const
259{
260 return 0;
261}
262
263unsigned int Texture3DAttachment::getSerial() const
264{
265 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
266}
267
268bool Texture3DAttachment::isTexture() const
269{
270 return true;
271}
272
273unsigned int Texture3DAttachment::getTextureSerial() const
274{
275 return mTexture3D->getTextureSerial();
276}
277
278////// Texture2DArrayAttachment Implementation //////
279
280Texture2DArrayAttachment::Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer)
281 : mLevel(level), mLayer(layer)
282{
283 mTexture2DArray.set(texture);
284}
285
286Texture2DArrayAttachment::~Texture2DArrayAttachment()
287{
288 mTexture2DArray.set(NULL);
289}
290
291void Texture2DArrayAttachment::addProxyRef(const FramebufferAttachment *proxy)
292{
293 mTexture2DArray->addProxyRef(proxy);
294}
295
296void Texture2DArrayAttachment::releaseProxy(const FramebufferAttachment *proxy)
297{
298 mTexture2DArray->releaseProxy(proxy);
299}
300
301rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
302{
303 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
304}
305
306rx::RenderTarget *Texture2DArrayAttachment::getDepthStencil()
307{
308 return mTexture2DArray->getDepthStencil(mLevel, mLayer);
309}
310
311rx::TextureStorage *Texture2DArrayAttachment::getTextureStorage()
312{
313 return mTexture2DArray->getNativeTexture()->getStorageInstance();
314}
315
316GLsizei Texture2DArrayAttachment::getWidth() const
317{
318 return mTexture2DArray->getWidth(mLevel);
319}
320
321GLsizei Texture2DArrayAttachment::getHeight() const
322{
323 return mTexture2DArray->getHeight(mLevel);
324}
325
326GLenum Texture2DArrayAttachment::getInternalFormat() const
327{
328 return mTexture2DArray->getInternalFormat(mLevel);
329}
330
331GLenum Texture2DArrayAttachment::getActualFormat() const
332{
333 return mTexture2DArray->getActualFormat(mLevel);
334}
335
336GLsizei Texture2DArrayAttachment::getSamples() const
337{
338 return 0;
339}
340
341unsigned int Texture2DArrayAttachment::getSerial() const
342{
343 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
344}
345
346bool Texture2DArrayAttachment::isTexture() const
347{
348 return true;
349}
350
351unsigned int Texture2DArrayAttachment::getTextureSerial() const
352{
353 return mTexture2DArray->getTextureSerial();
354}
355
356////// FramebufferAttachment Implementation //////
357
Jamie Madill1e3fa742014-06-16 10:34:00 -0400358FramebufferAttachment::FramebufferAttachment(GLuint id, FramebufferAttachmentImpl *instance)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400359 : RefCountObject(id),
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400360 mImpl(instance)
Jamie Madillafc21c02014-06-04 15:29:47 -0400361{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400362 ASSERT(mImpl != NULL);
Jamie Madillafc21c02014-06-04 15:29:47 -0400363}
364
365FramebufferAttachment::~FramebufferAttachment()
366{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400367 SafeDelete(mImpl);
Jamie Madillafc21c02014-06-04 15:29:47 -0400368}
369
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400370// The FramebufferAttachmentImpl contained in this FramebufferAttachment may need to maintain
Jamie Madillafc21c02014-06-04 15:29:47 -0400371// its own reference count, so we pass it on here.
372void FramebufferAttachment::addRef() const
373{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400374 mImpl->addProxyRef(this);
Jamie Madillafc21c02014-06-04 15:29:47 -0400375
376 RefCountObject::addRef();
377}
378
379void FramebufferAttachment::release() const
380{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400381 mImpl->releaseProxy(this);
Jamie Madillafc21c02014-06-04 15:29:47 -0400382
383 RefCountObject::release();
384}
385
386rx::RenderTarget *FramebufferAttachment::getRenderTarget()
387{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400388 return mImpl->getRenderTarget();
Jamie Madillafc21c02014-06-04 15:29:47 -0400389}
390
391rx::RenderTarget *FramebufferAttachment::getDepthStencil()
392{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400393 return mImpl->getDepthStencil();
Jamie Madillafc21c02014-06-04 15:29:47 -0400394}
395
396rx::TextureStorage *FramebufferAttachment::getTextureStorage()
397{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400398 return mImpl->getTextureStorage();
Jamie Madillafc21c02014-06-04 15:29:47 -0400399}
400
401GLsizei FramebufferAttachment::getWidth() const
402{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400403 return mImpl->getWidth();
Jamie Madillafc21c02014-06-04 15:29:47 -0400404}
405
406GLsizei FramebufferAttachment::getHeight() const
407{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400408 return mImpl->getHeight();
Jamie Madillafc21c02014-06-04 15:29:47 -0400409}
410
411GLenum FramebufferAttachment::getInternalFormat() const
412{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400413 return mImpl->getInternalFormat();
Jamie Madillafc21c02014-06-04 15:29:47 -0400414}
415
416GLenum FramebufferAttachment::getActualFormat() const
417{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400418 return mImpl->getActualFormat();
Jamie Madillafc21c02014-06-04 15:29:47 -0400419}
420
Jamie Madill1e3fa742014-06-16 10:34:00 -0400421GLuint FramebufferAttachment::getRedSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400422{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400423 if (gl::GetRedBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -0400424 {
Jamie Madill1e3fa742014-06-16 10:34:00 -0400425 return gl::GetRedBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -0400426 }
427 else
428 {
429 return 0;
430 }
Jamie Madillafc21c02014-06-04 15:29:47 -0400431}
432
Jamie Madill1e3fa742014-06-16 10:34:00 -0400433GLuint FramebufferAttachment::getGreenSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400434{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400435 if (gl::GetGreenBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -0400436 {
Jamie Madill1e3fa742014-06-16 10:34:00 -0400437 return gl::GetGreenBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -0400438 }
439 else
440 {
441 return 0;
442 }
Jamie Madillafc21c02014-06-04 15:29:47 -0400443}
444
Jamie Madill1e3fa742014-06-16 10:34:00 -0400445GLuint FramebufferAttachment::getBlueSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400446{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400447 if (gl::GetBlueBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -0400448 {
Jamie Madill1e3fa742014-06-16 10:34:00 -0400449 return gl::GetBlueBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -0400450 }
451 else
452 {
453 return 0;
454 }
Jamie Madillafc21c02014-06-04 15:29:47 -0400455}
456
Jamie Madill1e3fa742014-06-16 10:34:00 -0400457GLuint FramebufferAttachment::getAlphaSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400458{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400459 if (gl::GetAlphaBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -0400460 {
Jamie Madill1e3fa742014-06-16 10:34:00 -0400461 return gl::GetAlphaBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -0400462 }
463 else
464 {
465 return 0;
466 }
Jamie Madillafc21c02014-06-04 15:29:47 -0400467}
468
Jamie Madill1e3fa742014-06-16 10:34:00 -0400469GLuint FramebufferAttachment::getDepthSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400470{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400471 if (gl::GetDepthBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -0400472 {
Jamie Madill1e3fa742014-06-16 10:34:00 -0400473 return gl::GetDepthBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -0400474 }
475 else
476 {
477 return 0;
478 }
Jamie Madillafc21c02014-06-04 15:29:47 -0400479}
480
Jamie Madill1e3fa742014-06-16 10:34:00 -0400481GLuint FramebufferAttachment::getStencilSize(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400482{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400483 if (gl::GetStencilBits(getInternalFormat(), clientVersion) > 0)
Geoff Langb6a673a2014-06-05 14:19:16 -0400484 {
Jamie Madill1e3fa742014-06-16 10:34:00 -0400485 return gl::GetStencilBits(getActualFormat(), clientVersion);
Geoff Langb6a673a2014-06-05 14:19:16 -0400486 }
487 else
488 {
489 return 0;
490 }
Jamie Madillafc21c02014-06-04 15:29:47 -0400491}
492
Jamie Madill1e3fa742014-06-16 10:34:00 -0400493GLenum FramebufferAttachment::getComponentType(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400494{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400495 return gl::GetComponentType(getActualFormat(), clientVersion);
Jamie Madillafc21c02014-06-04 15:29:47 -0400496}
497
Jamie Madill1e3fa742014-06-16 10:34:00 -0400498GLenum FramebufferAttachment::getColorEncoding(int clientVersion) const
Jamie Madillafc21c02014-06-04 15:29:47 -0400499{
Jamie Madill1e3fa742014-06-16 10:34:00 -0400500 return gl::GetColorEncoding(getActualFormat(), clientVersion);
Jamie Madillafc21c02014-06-04 15:29:47 -0400501}
502
503GLsizei FramebufferAttachment::getSamples() const
504{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400505 return mImpl->getSamples();
Jamie Madillafc21c02014-06-04 15:29:47 -0400506}
507
508unsigned int FramebufferAttachment::getSerial() const
509{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400510 return mImpl->getSerial();
Jamie Madillafc21c02014-06-04 15:29:47 -0400511}
512
513bool FramebufferAttachment::isTexture() const
514{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400515 return mImpl->isTexture();
Jamie Madillafc21c02014-06-04 15:29:47 -0400516}
517
518unsigned int FramebufferAttachment::getTextureSerial() const
519{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400520 return mImpl->getTextureSerial();
Jamie Madillafc21c02014-06-04 15:29:47 -0400521}
522
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400523void FramebufferAttachment::setImplementation(FramebufferAttachmentImpl *newImpl)
Jamie Madillafc21c02014-06-04 15:29:47 -0400524{
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400525 ASSERT(newImpl != NULL);
Jamie Madillafc21c02014-06-04 15:29:47 -0400526
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400527 delete mImpl;
528 mImpl = newImpl;
529}
530
531RenderbufferAttachment::RenderbufferAttachment(Renderbuffer *renderbuffer)
532{
533 ASSERT(renderbuffer);
534 mRenderbuffer.set(renderbuffer);
535}
536
537RenderbufferAttachment::~RenderbufferAttachment()
538{
539 mRenderbuffer.set(NULL);
540}
541
542rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
543{
544 return mRenderbuffer->getStorage()->getRenderTarget();
545}
546
547rx::RenderTarget *RenderbufferAttachment::getDepthStencil()
548{
549 return mRenderbuffer->getStorage()->getDepthStencil();
550}
551
552rx::TextureStorage *RenderbufferAttachment::getTextureStorage()
553{
554 UNREACHABLE();
555 return NULL;
556}
557
558GLsizei RenderbufferAttachment::getWidth() const
559{
560 return mRenderbuffer->getWidth();
561}
562
563GLsizei RenderbufferAttachment::getHeight() const
564{
565 return mRenderbuffer->getHeight();
566}
567
568GLenum RenderbufferAttachment::getInternalFormat() const
569{
570 return mRenderbuffer->getInternalFormat();
571}
572
573GLenum RenderbufferAttachment::getActualFormat() const
574{
575 return mRenderbuffer->getActualFormat();
576}
577
578GLsizei RenderbufferAttachment::getSamples() const
579{
580 return mRenderbuffer->getStorage()->getSamples();
581}
582
583unsigned int RenderbufferAttachment::getSerial() const
584{
585 return mRenderbuffer->getStorage()->getSerial();
586}
587
588bool RenderbufferAttachment::isTexture() const
589{
590 return false;
591}
592
593unsigned int RenderbufferAttachment::getTextureSerial() const
594{
595 UNREACHABLE();
596 return 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400597}
598
599}