blob: 994e1a559a1cf18e2378bab9648450b7e67eea67 [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 Madillaef95de2014-09-05 10:12:41 -040081TextureAttachment::TextureAttachment(GLenum binding)
82 : FramebufferAttachment(binding)
83{}
84
Jamie Madill3592a332014-09-03 15:07:15 -040085rx::TextureStorage *TextureAttachment::getTextureStorage()
86{
87 return getTexture()->getNativeTexture()->getStorageInstance();
88}
89
90GLsizei TextureAttachment::getSamples() const
91{
92 return 0;
93}
94
95GLuint TextureAttachment::id() const
96{
97 return getTexture()->id();
98}
99
100unsigned int TextureAttachment::getTextureSerial() const
101{
102 return getTexture()->getTextureSerial();
103}
104
Jamie Madille261b442014-06-25 12:42:21 -0400105///// Texture2DAttachment Implementation ////////
106
Jamie Madillaef95de2014-09-05 10:12:41 -0400107Texture2DAttachment::Texture2DAttachment(GLenum binding, Texture2D *texture, GLint level)
108 : TextureAttachment(binding),
109 mLevel(level)
Jamie Madillafc21c02014-06-04 15:29:47 -0400110{
Jamie Madille261b442014-06-25 12:42:21 -0400111 mTexture2D.set(texture);
Jamie Madillafc21c02014-06-04 15:29:47 -0400112}
113
Jamie Madille261b442014-06-25 12:42:21 -0400114Texture2DAttachment::~Texture2DAttachment()
Jamie Madillafc21c02014-06-04 15:29:47 -0400115{
Jamie Madille261b442014-06-25 12:42:21 -0400116 mTexture2D.set(NULL);
Jamie Madillafc21c02014-06-04 15:29:47 -0400117}
118
Jamie Madille261b442014-06-25 12:42:21 -0400119rx::RenderTarget *Texture2DAttachment::getRenderTarget()
Jamie Madillafc21c02014-06-04 15:29:47 -0400120{
Jamie Madille261b442014-06-25 12:42:21 -0400121 return mTexture2D->getRenderTarget(mLevel);
Jamie Madill218b6ed2014-06-16 10:34:01 -0400122}
123
Jamie Madille261b442014-06-25 12:42:21 -0400124GLsizei Texture2DAttachment::getWidth() const
Jamie Madill9c074a32014-06-16 10:34:02 -0400125{
Jamie Madille261b442014-06-25 12:42:21 -0400126 return mTexture2D->getWidth(mLevel);
Jamie Madill9c074a32014-06-16 10:34:02 -0400127}
128
Jamie Madille261b442014-06-25 12:42:21 -0400129GLsizei Texture2DAttachment::getHeight() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400130{
Jamie Madille261b442014-06-25 12:42:21 -0400131 return mTexture2D->getHeight(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -0400132}
133
Jamie Madille261b442014-06-25 12:42:21 -0400134GLenum Texture2DAttachment::getInternalFormat() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400135{
Jamie Madille261b442014-06-25 12:42:21 -0400136 return mTexture2D->getInternalFormat(mLevel);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400137}
138
Jamie Madille261b442014-06-25 12:42:21 -0400139GLenum Texture2DAttachment::getActualFormat() const
140{
141 return mTexture2D->getActualFormat(mLevel);
142}
143
Jamie Madille261b442014-06-25 12:42:21 -0400144unsigned int Texture2DAttachment::getSerial() const
145{
146 return mTexture2D->getRenderTargetSerial(mLevel);
147}
148
Jamie Madille261b442014-06-25 12:42:21 -0400149GLenum Texture2DAttachment::type() const
150{
151 return GL_TEXTURE_2D;
152}
153
154GLint Texture2DAttachment::mipLevel() const
155{
156 return mLevel;
157}
158
159GLint Texture2DAttachment::layer() const
160{
161 return 0;
162}
163
Jamie Madill3592a332014-09-03 15:07:15 -0400164Texture *Texture2DAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400165{
Jamie Madill3592a332014-09-03 15:07:15 -0400166 return mTexture2D.get();
Jamie Madille261b442014-06-25 12:42:21 -0400167}
168
169///// TextureCubeMapAttachment Implementation ////////
170
Jamie Madillaef95de2014-09-05 10:12:41 -0400171TextureCubeMapAttachment::TextureCubeMapAttachment(GLenum binding, TextureCubeMap *texture, GLenum faceTarget, GLint level)
172 : TextureAttachment(binding),
173 mFaceTarget(faceTarget), mLevel(level)
Jamie Madille261b442014-06-25 12:42:21 -0400174{
175 mTextureCubeMap.set(texture);
176}
177
178TextureCubeMapAttachment::~TextureCubeMapAttachment()
179{
180 mTextureCubeMap.set(NULL);
181}
182
183rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
184{
185 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
186}
187
Jamie Madille261b442014-06-25 12:42:21 -0400188GLsizei TextureCubeMapAttachment::getWidth() const
189{
190 return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
191}
192
193GLsizei TextureCubeMapAttachment::getHeight() const
194{
195 return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
196}
197
198GLenum TextureCubeMapAttachment::getInternalFormat() const
199{
200 return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
201}
202
203GLenum TextureCubeMapAttachment::getActualFormat() const
204{
205 return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
206}
207
Jamie Madille261b442014-06-25 12:42:21 -0400208unsigned int TextureCubeMapAttachment::getSerial() const
209{
210 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
211}
212
Jamie Madille261b442014-06-25 12:42:21 -0400213GLenum TextureCubeMapAttachment::type() const
214{
215 return mFaceTarget;
216}
217
218GLint TextureCubeMapAttachment::mipLevel() const
219{
220 return mLevel;
221}
222
223GLint TextureCubeMapAttachment::layer() const
224{
225 return 0;
226}
227
Jamie Madill3592a332014-09-03 15:07:15 -0400228Texture *TextureCubeMapAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400229{
Jamie Madill3592a332014-09-03 15:07:15 -0400230 return mTextureCubeMap.get();
Jamie Madille261b442014-06-25 12:42:21 -0400231}
232
233///// Texture3DAttachment Implementation ////////
234
Jamie Madillaef95de2014-09-05 10:12:41 -0400235Texture3DAttachment::Texture3DAttachment(GLenum binding, Texture3D *texture, GLint level, GLint layer)
236 : TextureAttachment(binding),
237 mLevel(level),
238 mLayer(layer)
Jamie Madille261b442014-06-25 12:42:21 -0400239{
240 mTexture3D.set(texture);
241}
242
243Texture3DAttachment::~Texture3DAttachment()
244{
245 mTexture3D.set(NULL);
246}
247
248rx::RenderTarget *Texture3DAttachment::getRenderTarget()
249{
250 return mTexture3D->getRenderTarget(mLevel, mLayer);
251}
252
Jamie Madille261b442014-06-25 12:42:21 -0400253GLsizei Texture3DAttachment::getWidth() const
254{
255 return mTexture3D->getWidth(mLevel);
256}
257
258GLsizei Texture3DAttachment::getHeight() const
259{
260 return mTexture3D->getHeight(mLevel);
261}
262
263GLenum Texture3DAttachment::getInternalFormat() const
264{
265 return mTexture3D->getInternalFormat(mLevel);
266}
267
268GLenum Texture3DAttachment::getActualFormat() const
269{
270 return mTexture3D->getActualFormat(mLevel);
271}
272
Jamie Madille261b442014-06-25 12:42:21 -0400273unsigned int Texture3DAttachment::getSerial() const
274{
275 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
276}
277
Jamie Madille261b442014-06-25 12:42:21 -0400278GLenum Texture3DAttachment::type() const
279{
280 return GL_TEXTURE_3D;
281}
282
283GLint Texture3DAttachment::mipLevel() const
284{
285 return mLevel;
286}
287
288GLint Texture3DAttachment::layer() const
289{
290 return mLayer;
291}
292
Jamie Madill3592a332014-09-03 15:07:15 -0400293Texture *Texture3DAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400294{
Jamie Madill3592a332014-09-03 15:07:15 -0400295 return mTexture3D.get();
Jamie Madille261b442014-06-25 12:42:21 -0400296}
297
298////// Texture2DArrayAttachment Implementation //////
299
Jamie Madillaef95de2014-09-05 10:12:41 -0400300Texture2DArrayAttachment::Texture2DArrayAttachment(GLenum binding, Texture2DArray *texture, GLint level, GLint layer)
301 : TextureAttachment(binding),
302 mLevel(level),
303 mLayer(layer)
Jamie Madille261b442014-06-25 12:42:21 -0400304{
305 mTexture2DArray.set(texture);
306}
307
308Texture2DArrayAttachment::~Texture2DArrayAttachment()
309{
310 mTexture2DArray.set(NULL);
311}
312
313rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
314{
315 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
316}
317
Jamie Madille261b442014-06-25 12:42:21 -0400318GLsizei Texture2DArrayAttachment::getWidth() const
319{
320 return mTexture2DArray->getWidth(mLevel);
321}
322
323GLsizei Texture2DArrayAttachment::getHeight() const
324{
325 return mTexture2DArray->getHeight(mLevel);
326}
327
328GLenum Texture2DArrayAttachment::getInternalFormat() const
329{
330 return mTexture2DArray->getInternalFormat(mLevel);
331}
332
333GLenum Texture2DArrayAttachment::getActualFormat() const
334{
335 return mTexture2DArray->getActualFormat(mLevel);
336}
337
Jamie Madille261b442014-06-25 12:42:21 -0400338unsigned int Texture2DArrayAttachment::getSerial() const
339{
340 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
341}
342
Jamie Madille261b442014-06-25 12:42:21 -0400343GLenum Texture2DArrayAttachment::type() const
344{
345 return GL_TEXTURE_2D_ARRAY;
346}
347
348GLint Texture2DArrayAttachment::mipLevel() const
349{
350 return mLevel;
351}
352
353GLint Texture2DArrayAttachment::layer() const
354{
355 return mLayer;
356}
357
Jamie Madill3592a332014-09-03 15:07:15 -0400358Texture *Texture2DArrayAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400359{
Jamie Madill3592a332014-09-03 15:07:15 -0400360 return mTexture2DArray.get();
Jamie Madille261b442014-06-25 12:42:21 -0400361}
362
363////// RenderbufferAttachment Implementation //////
364
Jamie Madillaef95de2014-09-05 10:12:41 -0400365RenderbufferAttachment::RenderbufferAttachment(GLenum binding, Renderbuffer *renderbuffer)
366 : FramebufferAttachment(binding)
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400367{
368 ASSERT(renderbuffer);
369 mRenderbuffer.set(renderbuffer);
370}
371
372RenderbufferAttachment::~RenderbufferAttachment()
373{
374 mRenderbuffer.set(NULL);
375}
376
377rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
378{
379 return mRenderbuffer->getStorage()->getRenderTarget();
380}
381
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400382rx::TextureStorage *RenderbufferAttachment::getTextureStorage()
383{
384 UNREACHABLE();
385 return NULL;
386}
387
388GLsizei RenderbufferAttachment::getWidth() const
389{
390 return mRenderbuffer->getWidth();
391}
392
393GLsizei RenderbufferAttachment::getHeight() const
394{
395 return mRenderbuffer->getHeight();
396}
397
398GLenum RenderbufferAttachment::getInternalFormat() const
399{
400 return mRenderbuffer->getInternalFormat();
401}
402
403GLenum RenderbufferAttachment::getActualFormat() const
404{
405 return mRenderbuffer->getActualFormat();
406}
407
408GLsizei RenderbufferAttachment::getSamples() const
409{
410 return mRenderbuffer->getStorage()->getSamples();
411}
412
413unsigned int RenderbufferAttachment::getSerial() const
414{
415 return mRenderbuffer->getStorage()->getSerial();
416}
417
Jamie Madill218b6ed2014-06-16 10:34:01 -0400418GLuint RenderbufferAttachment::id() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400419{
Jamie Madill218b6ed2014-06-16 10:34:01 -0400420 return mRenderbuffer->id();
421}
422
423GLenum RenderbufferAttachment::type() const
424{
425 return GL_RENDERBUFFER;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400426}
427
Jamie Madill9c074a32014-06-16 10:34:02 -0400428GLint RenderbufferAttachment::mipLevel() const
429{
430 return 0;
431}
432
433GLint RenderbufferAttachment::layer() const
434{
435 return 0;
436}
437
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400438unsigned int RenderbufferAttachment::getTextureSerial() const
439{
440 UNREACHABLE();
441 return 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400442}
443
444}