blob: 861bd65b0e42dfdae23b8df4832b7f10afdf7e60 [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 Madille261b442014-06-25 12:42:21 -040025FramebufferAttachment::FramebufferAttachment()
Jamie Madillafc21c02014-06-04 15:29:47 -040026{
Jamie Madillafc21c02014-06-04 15:29:47 -040027}
28
29FramebufferAttachment::~FramebufferAttachment()
30{
Jamie Madillafc21c02014-06-04 15:29:47 -040031}
32
Geoff Lange4a492b2014-06-19 14:14:41 -040033GLuint FramebufferAttachment::getRedSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040034{
Geoff Lang5d601382014-07-22 15:14:06 -040035 return (GetInternalFormatInfo(getInternalFormat()).redBits > 0) ? GetInternalFormatInfo(getActualFormat()).redBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040036}
37
Geoff Lange4a492b2014-06-19 14:14:41 -040038GLuint FramebufferAttachment::getGreenSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040039{
Geoff Lang5d601382014-07-22 15:14:06 -040040 return (GetInternalFormatInfo(getInternalFormat()).greenBits > 0) ? GetInternalFormatInfo(getActualFormat()).greenBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040041}
42
Geoff Lange4a492b2014-06-19 14:14:41 -040043GLuint FramebufferAttachment::getBlueSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040044{
Geoff Lang5d601382014-07-22 15:14:06 -040045 return (GetInternalFormatInfo(getInternalFormat()).blueBits > 0) ? GetInternalFormatInfo(getActualFormat()).blueBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040046}
47
Geoff Lange4a492b2014-06-19 14:14:41 -040048GLuint FramebufferAttachment::getAlphaSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040049{
Geoff Lang5d601382014-07-22 15:14:06 -040050 return (GetInternalFormatInfo(getInternalFormat()).alphaBits > 0) ? GetInternalFormatInfo(getActualFormat()).alphaBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040051}
52
Geoff Lange4a492b2014-06-19 14:14:41 -040053GLuint FramebufferAttachment::getDepthSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040054{
Geoff Lang5d601382014-07-22 15:14:06 -040055 return (GetInternalFormatInfo(getInternalFormat()).depthBits > 0) ? GetInternalFormatInfo(getActualFormat()).depthBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040056}
57
Geoff Lange4a492b2014-06-19 14:14:41 -040058GLuint FramebufferAttachment::getStencilSize() const
Jamie Madillafc21c02014-06-04 15:29:47 -040059{
Geoff Lang5d601382014-07-22 15:14:06 -040060 return (GetInternalFormatInfo(getInternalFormat()).stencilBits > 0) ? GetInternalFormatInfo(getActualFormat()).stencilBits : 0;
Jamie Madillafc21c02014-06-04 15:29:47 -040061}
62
Geoff Lange4a492b2014-06-19 14:14:41 -040063GLenum FramebufferAttachment::getComponentType() const
Jamie Madillafc21c02014-06-04 15:29:47 -040064{
Geoff Lang5d601382014-07-22 15:14:06 -040065 return GetInternalFormatInfo(getActualFormat()).componentType;
Jamie Madillafc21c02014-06-04 15:29:47 -040066}
67
Geoff Lange4a492b2014-06-19 14:14:41 -040068GLenum FramebufferAttachment::getColorEncoding() const
Jamie Madillafc21c02014-06-04 15:29:47 -040069{
Geoff Lang5d601382014-07-22 15:14:06 -040070 return GetInternalFormatInfo(getActualFormat()).colorEncoding;
Jamie Madillafc21c02014-06-04 15:29:47 -040071}
72
Jamie Madill218b6ed2014-06-16 10:34:01 -040073bool FramebufferAttachment::isTexture() const
74{
75 return (type() != GL_RENDERBUFFER);
76}
77
Jamie Madille261b442014-06-25 12:42:21 -040078///// Texture2DAttachment Implementation ////////
79
80Texture2DAttachment::Texture2DAttachment(Texture2D *texture, GLint level) : mLevel(level)
Jamie Madillafc21c02014-06-04 15:29:47 -040081{
Jamie Madille261b442014-06-25 12:42:21 -040082 mTexture2D.set(texture);
Jamie Madillafc21c02014-06-04 15:29:47 -040083}
84
Jamie Madille261b442014-06-25 12:42:21 -040085Texture2DAttachment::~Texture2DAttachment()
Jamie Madillafc21c02014-06-04 15:29:47 -040086{
Jamie Madille261b442014-06-25 12:42:21 -040087 mTexture2D.set(NULL);
Jamie Madillafc21c02014-06-04 15:29:47 -040088}
89
Jamie Madille261b442014-06-25 12:42:21 -040090rx::RenderTarget *Texture2DAttachment::getRenderTarget()
Jamie Madillafc21c02014-06-04 15:29:47 -040091{
Jamie Madille261b442014-06-25 12:42:21 -040092 return mTexture2D->getRenderTarget(mLevel);
Jamie Madill218b6ed2014-06-16 10:34:01 -040093}
94
Jamie Madille261b442014-06-25 12:42:21 -040095rx::RenderTarget *Texture2DAttachment::getDepthStencil()
Jamie Madill218b6ed2014-06-16 10:34:01 -040096{
Brandon Jonescef06ff2014-08-05 13:27:48 -070097 return mTexture2D->getDepthStencil(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -040098}
99
Jamie Madille261b442014-06-25 12:42:21 -0400100rx::TextureStorage *Texture2DAttachment::getTextureStorage()
Jamie Madill9c074a32014-06-16 10:34:02 -0400101{
Jamie Madille261b442014-06-25 12:42:21 -0400102 return mTexture2D->getNativeTexture()->getStorageInstance();
Jamie Madill9c074a32014-06-16 10:34:02 -0400103}
104
Jamie Madille261b442014-06-25 12:42:21 -0400105GLsizei Texture2DAttachment::getWidth() const
Jamie Madill9c074a32014-06-16 10:34:02 -0400106{
Jamie Madille261b442014-06-25 12:42:21 -0400107 return mTexture2D->getWidth(mLevel);
Jamie Madill9c074a32014-06-16 10:34:02 -0400108}
109
Jamie Madille261b442014-06-25 12:42:21 -0400110GLsizei Texture2DAttachment::getHeight() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400111{
Jamie Madille261b442014-06-25 12:42:21 -0400112 return mTexture2D->getHeight(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -0400113}
114
Jamie Madille261b442014-06-25 12:42:21 -0400115GLenum Texture2DAttachment::getInternalFormat() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400116{
Jamie Madille261b442014-06-25 12:42:21 -0400117 return mTexture2D->getInternalFormat(mLevel);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400118}
119
Jamie Madille261b442014-06-25 12:42:21 -0400120GLenum Texture2DAttachment::getActualFormat() const
121{
122 return mTexture2D->getActualFormat(mLevel);
123}
124
125GLsizei Texture2DAttachment::getSamples() const
126{
127 return 0;
128}
129
130unsigned int Texture2DAttachment::getSerial() const
131{
132 return mTexture2D->getRenderTargetSerial(mLevel);
133}
134
135GLuint Texture2DAttachment::id() const
136{
137 return mTexture2D->id();
138}
139
140GLenum Texture2DAttachment::type() const
141{
142 return GL_TEXTURE_2D;
143}
144
145GLint Texture2DAttachment::mipLevel() const
146{
147 return mLevel;
148}
149
150GLint Texture2DAttachment::layer() const
151{
152 return 0;
153}
154
155unsigned int Texture2DAttachment::getTextureSerial() const
156{
157 return mTexture2D->getTextureSerial();
158}
159
160///// TextureCubeMapAttachment Implementation ////////
161
162TextureCubeMapAttachment::TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level)
163 : mFaceTarget(faceTarget), mLevel(level)
164{
165 mTextureCubeMap.set(texture);
166}
167
168TextureCubeMapAttachment::~TextureCubeMapAttachment()
169{
170 mTextureCubeMap.set(NULL);
171}
172
173rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
174{
175 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
176}
177
178rx::RenderTarget *TextureCubeMapAttachment::getDepthStencil()
179{
180 return mTextureCubeMap->getDepthStencil(mFaceTarget, mLevel);
181}
182
183rx::TextureStorage *TextureCubeMapAttachment::getTextureStorage()
184{
185 return mTextureCubeMap->getNativeTexture()->getStorageInstance();
186}
187
188GLsizei 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
208GLsizei TextureCubeMapAttachment::getSamples() const
209{
210 return 0;
211}
212
213unsigned int TextureCubeMapAttachment::getSerial() const
214{
215 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
216}
217
218GLuint TextureCubeMapAttachment::id() const
219{
220 return mTextureCubeMap->id();
221}
222
223GLenum TextureCubeMapAttachment::type() const
224{
225 return mFaceTarget;
226}
227
228GLint TextureCubeMapAttachment::mipLevel() const
229{
230 return mLevel;
231}
232
233GLint TextureCubeMapAttachment::layer() const
234{
235 return 0;
236}
237
238unsigned int TextureCubeMapAttachment::getTextureSerial() const
239{
240 return mTextureCubeMap->getTextureSerial();
241}
242
243///// Texture3DAttachment Implementation ////////
244
245Texture3DAttachment::Texture3DAttachment(Texture3D *texture, GLint level, GLint layer)
246 : mLevel(level), mLayer(layer)
247{
248 mTexture3D.set(texture);
249}
250
251Texture3DAttachment::~Texture3DAttachment()
252{
253 mTexture3D.set(NULL);
254}
255
256rx::RenderTarget *Texture3DAttachment::getRenderTarget()
257{
258 return mTexture3D->getRenderTarget(mLevel, mLayer);
259}
260
261rx::RenderTarget *Texture3DAttachment::getDepthStencil()
262{
263 return mTexture3D->getDepthStencil(mLevel, mLayer);
264}
265
266rx::TextureStorage *Texture3DAttachment::getTextureStorage()
267{
268 return mTexture3D->getNativeTexture()->getStorageInstance();
269}
270
271GLsizei Texture3DAttachment::getWidth() const
272{
273 return mTexture3D->getWidth(mLevel);
274}
275
276GLsizei Texture3DAttachment::getHeight() const
277{
278 return mTexture3D->getHeight(mLevel);
279}
280
281GLenum Texture3DAttachment::getInternalFormat() const
282{
283 return mTexture3D->getInternalFormat(mLevel);
284}
285
286GLenum Texture3DAttachment::getActualFormat() const
287{
288 return mTexture3D->getActualFormat(mLevel);
289}
290
291GLsizei Texture3DAttachment::getSamples() const
292{
293 return 0;
294}
295
296unsigned int Texture3DAttachment::getSerial() const
297{
298 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
299}
300
301GLuint Texture3DAttachment::id() const
302{
303 return mTexture3D->id();
304}
305
306GLenum Texture3DAttachment::type() const
307{
308 return GL_TEXTURE_3D;
309}
310
311GLint Texture3DAttachment::mipLevel() const
312{
313 return mLevel;
314}
315
316GLint Texture3DAttachment::layer() const
317{
318 return mLayer;
319}
320
321unsigned int Texture3DAttachment::getTextureSerial() const
322{
323 return mTexture3D->getTextureSerial();
324}
325
326////// Texture2DArrayAttachment Implementation //////
327
328Texture2DArrayAttachment::Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer)
329 : mLevel(level), mLayer(layer)
330{
331 mTexture2DArray.set(texture);
332}
333
334Texture2DArrayAttachment::~Texture2DArrayAttachment()
335{
336 mTexture2DArray.set(NULL);
337}
338
339rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
340{
341 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
342}
343
344rx::RenderTarget *Texture2DArrayAttachment::getDepthStencil()
345{
346 return mTexture2DArray->getDepthStencil(mLevel, mLayer);
347}
348
349rx::TextureStorage *Texture2DArrayAttachment::getTextureStorage()
350{
351 return mTexture2DArray->getNativeTexture()->getStorageInstance();
352}
353
354GLsizei Texture2DArrayAttachment::getWidth() const
355{
356 return mTexture2DArray->getWidth(mLevel);
357}
358
359GLsizei Texture2DArrayAttachment::getHeight() const
360{
361 return mTexture2DArray->getHeight(mLevel);
362}
363
364GLenum Texture2DArrayAttachment::getInternalFormat() const
365{
366 return mTexture2DArray->getInternalFormat(mLevel);
367}
368
369GLenum Texture2DArrayAttachment::getActualFormat() const
370{
371 return mTexture2DArray->getActualFormat(mLevel);
372}
373
374GLsizei Texture2DArrayAttachment::getSamples() const
375{
376 return 0;
377}
378
379unsigned int Texture2DArrayAttachment::getSerial() const
380{
381 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
382}
383
384GLuint Texture2DArrayAttachment::id() const
385{
386 return mTexture2DArray->id();
387}
388
389GLenum Texture2DArrayAttachment::type() const
390{
391 return GL_TEXTURE_2D_ARRAY;
392}
393
394GLint Texture2DArrayAttachment::mipLevel() const
395{
396 return mLevel;
397}
398
399GLint Texture2DArrayAttachment::layer() const
400{
401 return mLayer;
402}
403
404unsigned int Texture2DArrayAttachment::getTextureSerial() const
405{
406 return mTexture2DArray->getTextureSerial();
407}
408
409////// RenderbufferAttachment Implementation //////
410
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400411RenderbufferAttachment::RenderbufferAttachment(Renderbuffer *renderbuffer)
412{
413 ASSERT(renderbuffer);
414 mRenderbuffer.set(renderbuffer);
415}
416
417RenderbufferAttachment::~RenderbufferAttachment()
418{
419 mRenderbuffer.set(NULL);
420}
421
422rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
423{
424 return mRenderbuffer->getStorage()->getRenderTarget();
425}
426
427rx::RenderTarget *RenderbufferAttachment::getDepthStencil()
428{
429 return mRenderbuffer->getStorage()->getDepthStencil();
430}
431
432rx::TextureStorage *RenderbufferAttachment::getTextureStorage()
433{
434 UNREACHABLE();
435 return NULL;
436}
437
438GLsizei RenderbufferAttachment::getWidth() const
439{
440 return mRenderbuffer->getWidth();
441}
442
443GLsizei RenderbufferAttachment::getHeight() const
444{
445 return mRenderbuffer->getHeight();
446}
447
448GLenum RenderbufferAttachment::getInternalFormat() const
449{
450 return mRenderbuffer->getInternalFormat();
451}
452
453GLenum RenderbufferAttachment::getActualFormat() const
454{
455 return mRenderbuffer->getActualFormat();
456}
457
458GLsizei RenderbufferAttachment::getSamples() const
459{
460 return mRenderbuffer->getStorage()->getSamples();
461}
462
463unsigned int RenderbufferAttachment::getSerial() const
464{
465 return mRenderbuffer->getStorage()->getSerial();
466}
467
Jamie Madill218b6ed2014-06-16 10:34:01 -0400468GLuint RenderbufferAttachment::id() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400469{
Jamie Madill218b6ed2014-06-16 10:34:01 -0400470 return mRenderbuffer->id();
471}
472
473GLenum RenderbufferAttachment::type() const
474{
475 return GL_RENDERBUFFER;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400476}
477
Jamie Madill9c074a32014-06-16 10:34:02 -0400478GLint RenderbufferAttachment::mipLevel() const
479{
480 return 0;
481}
482
483GLint RenderbufferAttachment::layer() const
484{
485 return 0;
486}
487
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400488unsigned int RenderbufferAttachment::getTextureSerial() const
489{
490 UNREACHABLE();
491 return 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400492}
493
494}