blob: 0cabf39ec8d58dc04e0fdd3743bdd412cce187eb [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::TextureStorage *Texture2DAttachment::getTextureStorage()
Jamie Madill9c074a32014-06-16 10:34:02 -040096{
Jamie Madille261b442014-06-25 12:42:21 -040097 return mTexture2D->getNativeTexture()->getStorageInstance();
Jamie Madill9c074a32014-06-16 10:34:02 -040098}
99
Jamie Madille261b442014-06-25 12:42:21 -0400100GLsizei Texture2DAttachment::getWidth() const
Jamie Madill9c074a32014-06-16 10:34:02 -0400101{
Jamie Madille261b442014-06-25 12:42:21 -0400102 return mTexture2D->getWidth(mLevel);
Jamie Madill9c074a32014-06-16 10:34:02 -0400103}
104
Jamie Madille261b442014-06-25 12:42:21 -0400105GLsizei Texture2DAttachment::getHeight() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400106{
Jamie Madille261b442014-06-25 12:42:21 -0400107 return mTexture2D->getHeight(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -0400108}
109
Jamie Madille261b442014-06-25 12:42:21 -0400110GLenum Texture2DAttachment::getInternalFormat() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400111{
Jamie Madille261b442014-06-25 12:42:21 -0400112 return mTexture2D->getInternalFormat(mLevel);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400113}
114
Jamie Madille261b442014-06-25 12:42:21 -0400115GLenum Texture2DAttachment::getActualFormat() const
116{
117 return mTexture2D->getActualFormat(mLevel);
118}
119
120GLsizei Texture2DAttachment::getSamples() const
121{
122 return 0;
123}
124
125unsigned int Texture2DAttachment::getSerial() const
126{
127 return mTexture2D->getRenderTargetSerial(mLevel);
128}
129
130GLuint Texture2DAttachment::id() const
131{
132 return mTexture2D->id();
133}
134
135GLenum Texture2DAttachment::type() const
136{
137 return GL_TEXTURE_2D;
138}
139
140GLint Texture2DAttachment::mipLevel() const
141{
142 return mLevel;
143}
144
145GLint Texture2DAttachment::layer() const
146{
147 return 0;
148}
149
150unsigned int Texture2DAttachment::getTextureSerial() const
151{
152 return mTexture2D->getTextureSerial();
153}
154
155///// TextureCubeMapAttachment Implementation ////////
156
157TextureCubeMapAttachment::TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level)
158 : mFaceTarget(faceTarget), mLevel(level)
159{
160 mTextureCubeMap.set(texture);
161}
162
163TextureCubeMapAttachment::~TextureCubeMapAttachment()
164{
165 mTextureCubeMap.set(NULL);
166}
167
168rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
169{
170 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
171}
172
Jamie Madille261b442014-06-25 12:42:21 -0400173rx::TextureStorage *TextureCubeMapAttachment::getTextureStorage()
174{
175 return mTextureCubeMap->getNativeTexture()->getStorageInstance();
176}
177
178GLsizei TextureCubeMapAttachment::getWidth() const
179{
180 return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
181}
182
183GLsizei TextureCubeMapAttachment::getHeight() const
184{
185 return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
186}
187
188GLenum TextureCubeMapAttachment::getInternalFormat() const
189{
190 return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
191}
192
193GLenum TextureCubeMapAttachment::getActualFormat() const
194{
195 return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
196}
197
198GLsizei TextureCubeMapAttachment::getSamples() const
199{
200 return 0;
201}
202
203unsigned int TextureCubeMapAttachment::getSerial() const
204{
205 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
206}
207
208GLuint TextureCubeMapAttachment::id() const
209{
210 return mTextureCubeMap->id();
211}
212
213GLenum 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
228unsigned int TextureCubeMapAttachment::getTextureSerial() const
229{
230 return mTextureCubeMap->getTextureSerial();
231}
232
233///// Texture3DAttachment Implementation ////////
234
235Texture3DAttachment::Texture3DAttachment(Texture3D *texture, GLint level, GLint layer)
236 : mLevel(level), mLayer(layer)
237{
238 mTexture3D.set(texture);
239}
240
241Texture3DAttachment::~Texture3DAttachment()
242{
243 mTexture3D.set(NULL);
244}
245
246rx::RenderTarget *Texture3DAttachment::getRenderTarget()
247{
248 return mTexture3D->getRenderTarget(mLevel, mLayer);
249}
250
Jamie Madille261b442014-06-25 12:42:21 -0400251rx::TextureStorage *Texture3DAttachment::getTextureStorage()
252{
253 return mTexture3D->getNativeTexture()->getStorageInstance();
254}
255
256GLsizei Texture3DAttachment::getWidth() const
257{
258 return mTexture3D->getWidth(mLevel);
259}
260
261GLsizei Texture3DAttachment::getHeight() const
262{
263 return mTexture3D->getHeight(mLevel);
264}
265
266GLenum Texture3DAttachment::getInternalFormat() const
267{
268 return mTexture3D->getInternalFormat(mLevel);
269}
270
271GLenum Texture3DAttachment::getActualFormat() const
272{
273 return mTexture3D->getActualFormat(mLevel);
274}
275
276GLsizei Texture3DAttachment::getSamples() const
277{
278 return 0;
279}
280
281unsigned int Texture3DAttachment::getSerial() const
282{
283 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
284}
285
286GLuint Texture3DAttachment::id() const
287{
288 return mTexture3D->id();
289}
290
291GLenum Texture3DAttachment::type() const
292{
293 return GL_TEXTURE_3D;
294}
295
296GLint Texture3DAttachment::mipLevel() const
297{
298 return mLevel;
299}
300
301GLint Texture3DAttachment::layer() const
302{
303 return mLayer;
304}
305
306unsigned int Texture3DAttachment::getTextureSerial() const
307{
308 return mTexture3D->getTextureSerial();
309}
310
311////// Texture2DArrayAttachment Implementation //////
312
313Texture2DArrayAttachment::Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer)
314 : mLevel(level), mLayer(layer)
315{
316 mTexture2DArray.set(texture);
317}
318
319Texture2DArrayAttachment::~Texture2DArrayAttachment()
320{
321 mTexture2DArray.set(NULL);
322}
323
324rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
325{
326 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
327}
328
Jamie Madille261b442014-06-25 12:42:21 -0400329rx::TextureStorage *Texture2DArrayAttachment::getTextureStorage()
330{
331 return mTexture2DArray->getNativeTexture()->getStorageInstance();
332}
333
334GLsizei Texture2DArrayAttachment::getWidth() const
335{
336 return mTexture2DArray->getWidth(mLevel);
337}
338
339GLsizei Texture2DArrayAttachment::getHeight() const
340{
341 return mTexture2DArray->getHeight(mLevel);
342}
343
344GLenum Texture2DArrayAttachment::getInternalFormat() const
345{
346 return mTexture2DArray->getInternalFormat(mLevel);
347}
348
349GLenum Texture2DArrayAttachment::getActualFormat() const
350{
351 return mTexture2DArray->getActualFormat(mLevel);
352}
353
354GLsizei Texture2DArrayAttachment::getSamples() const
355{
356 return 0;
357}
358
359unsigned int Texture2DArrayAttachment::getSerial() const
360{
361 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
362}
363
364GLuint Texture2DArrayAttachment::id() const
365{
366 return mTexture2DArray->id();
367}
368
369GLenum Texture2DArrayAttachment::type() const
370{
371 return GL_TEXTURE_2D_ARRAY;
372}
373
374GLint Texture2DArrayAttachment::mipLevel() const
375{
376 return mLevel;
377}
378
379GLint Texture2DArrayAttachment::layer() const
380{
381 return mLayer;
382}
383
384unsigned int Texture2DArrayAttachment::getTextureSerial() const
385{
386 return mTexture2DArray->getTextureSerial();
387}
388
389////// RenderbufferAttachment Implementation //////
390
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400391RenderbufferAttachment::RenderbufferAttachment(Renderbuffer *renderbuffer)
392{
393 ASSERT(renderbuffer);
394 mRenderbuffer.set(renderbuffer);
395}
396
397RenderbufferAttachment::~RenderbufferAttachment()
398{
399 mRenderbuffer.set(NULL);
400}
401
402rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
403{
404 return mRenderbuffer->getStorage()->getRenderTarget();
405}
406
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400407rx::TextureStorage *RenderbufferAttachment::getTextureStorage()
408{
409 UNREACHABLE();
410 return NULL;
411}
412
413GLsizei RenderbufferAttachment::getWidth() const
414{
415 return mRenderbuffer->getWidth();
416}
417
418GLsizei RenderbufferAttachment::getHeight() const
419{
420 return mRenderbuffer->getHeight();
421}
422
423GLenum RenderbufferAttachment::getInternalFormat() const
424{
425 return mRenderbuffer->getInternalFormat();
426}
427
428GLenum RenderbufferAttachment::getActualFormat() const
429{
430 return mRenderbuffer->getActualFormat();
431}
432
433GLsizei RenderbufferAttachment::getSamples() const
434{
435 return mRenderbuffer->getStorage()->getSamples();
436}
437
438unsigned int RenderbufferAttachment::getSerial() const
439{
440 return mRenderbuffer->getStorage()->getSerial();
441}
442
Jamie Madill218b6ed2014-06-16 10:34:01 -0400443GLuint RenderbufferAttachment::id() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400444{
Jamie Madill218b6ed2014-06-16 10:34:01 -0400445 return mRenderbuffer->id();
446}
447
448GLenum RenderbufferAttachment::type() const
449{
450 return GL_RENDERBUFFER;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400451}
452
Jamie Madill9c074a32014-06-16 10:34:02 -0400453GLint RenderbufferAttachment::mipLevel() const
454{
455 return 0;
456}
457
458GLint RenderbufferAttachment::layer() const
459{
460 return 0;
461}
462
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400463unsigned int RenderbufferAttachment::getTextureSerial() const
464{
465 UNREACHABLE();
466 return 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400467}
468
469}