blob: fa75087a05c3fe5541cc8fa19d62eb77d8ef429e [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 Madill3592a332014-09-03 15:07:15 -040078///// TextureAttachment Implementation ////////
79
80rx::TextureStorage *TextureAttachment::getTextureStorage()
81{
82 return getTexture()->getNativeTexture()->getStorageInstance();
83}
84
85GLsizei TextureAttachment::getSamples() const
86{
87 return 0;
88}
89
90GLuint TextureAttachment::id() const
91{
92 return getTexture()->id();
93}
94
95unsigned int TextureAttachment::getTextureSerial() const
96{
97 return getTexture()->getTextureSerial();
98}
99
Jamie Madille261b442014-06-25 12:42:21 -0400100///// Texture2DAttachment Implementation ////////
101
102Texture2DAttachment::Texture2DAttachment(Texture2D *texture, GLint level) : mLevel(level)
Jamie Madillafc21c02014-06-04 15:29:47 -0400103{
Jamie Madille261b442014-06-25 12:42:21 -0400104 mTexture2D.set(texture);
Jamie Madillafc21c02014-06-04 15:29:47 -0400105}
106
Jamie Madille261b442014-06-25 12:42:21 -0400107Texture2DAttachment::~Texture2DAttachment()
Jamie Madillafc21c02014-06-04 15:29:47 -0400108{
Jamie Madille261b442014-06-25 12:42:21 -0400109 mTexture2D.set(NULL);
Jamie Madillafc21c02014-06-04 15:29:47 -0400110}
111
Jamie Madille261b442014-06-25 12:42:21 -0400112rx::RenderTarget *Texture2DAttachment::getRenderTarget()
Jamie Madillafc21c02014-06-04 15:29:47 -0400113{
Jamie Madille261b442014-06-25 12:42:21 -0400114 return mTexture2D->getRenderTarget(mLevel);
Jamie Madill218b6ed2014-06-16 10:34:01 -0400115}
116
Jamie Madille261b442014-06-25 12:42:21 -0400117GLsizei Texture2DAttachment::getWidth() const
Jamie Madill9c074a32014-06-16 10:34:02 -0400118{
Jamie Madille261b442014-06-25 12:42:21 -0400119 return mTexture2D->getWidth(mLevel);
Jamie Madill9c074a32014-06-16 10:34:02 -0400120}
121
Jamie Madille261b442014-06-25 12:42:21 -0400122GLsizei Texture2DAttachment::getHeight() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400123{
Jamie Madille261b442014-06-25 12:42:21 -0400124 return mTexture2D->getHeight(mLevel);
Jamie Madillafc21c02014-06-04 15:29:47 -0400125}
126
Jamie Madille261b442014-06-25 12:42:21 -0400127GLenum Texture2DAttachment::getInternalFormat() const
Jamie Madillafc21c02014-06-04 15:29:47 -0400128{
Jamie Madille261b442014-06-25 12:42:21 -0400129 return mTexture2D->getInternalFormat(mLevel);
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400130}
131
Jamie Madille261b442014-06-25 12:42:21 -0400132GLenum Texture2DAttachment::getActualFormat() const
133{
134 return mTexture2D->getActualFormat(mLevel);
135}
136
Jamie Madille261b442014-06-25 12:42:21 -0400137unsigned int Texture2DAttachment::getSerial() const
138{
139 return mTexture2D->getRenderTargetSerial(mLevel);
140}
141
Jamie Madille261b442014-06-25 12:42:21 -0400142GLenum Texture2DAttachment::type() const
143{
144 return GL_TEXTURE_2D;
145}
146
147GLint Texture2DAttachment::mipLevel() const
148{
149 return mLevel;
150}
151
152GLint Texture2DAttachment::layer() const
153{
154 return 0;
155}
156
Jamie Madill3592a332014-09-03 15:07:15 -0400157Texture *Texture2DAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400158{
Jamie Madill3592a332014-09-03 15:07:15 -0400159 return mTexture2D.get();
Jamie Madille261b442014-06-25 12:42:21 -0400160}
161
162///// TextureCubeMapAttachment Implementation ////////
163
164TextureCubeMapAttachment::TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level)
165 : mFaceTarget(faceTarget), mLevel(level)
166{
167 mTextureCubeMap.set(texture);
168}
169
170TextureCubeMapAttachment::~TextureCubeMapAttachment()
171{
172 mTextureCubeMap.set(NULL);
173}
174
175rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
176{
177 return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
178}
179
Jamie Madille261b442014-06-25 12:42:21 -0400180GLsizei TextureCubeMapAttachment::getWidth() const
181{
182 return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
183}
184
185GLsizei TextureCubeMapAttachment::getHeight() const
186{
187 return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
188}
189
190GLenum TextureCubeMapAttachment::getInternalFormat() const
191{
192 return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
193}
194
195GLenum TextureCubeMapAttachment::getActualFormat() const
196{
197 return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
198}
199
Jamie Madille261b442014-06-25 12:42:21 -0400200unsigned int TextureCubeMapAttachment::getSerial() const
201{
202 return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
203}
204
Jamie Madille261b442014-06-25 12:42:21 -0400205GLenum TextureCubeMapAttachment::type() const
206{
207 return mFaceTarget;
208}
209
210GLint TextureCubeMapAttachment::mipLevel() const
211{
212 return mLevel;
213}
214
215GLint TextureCubeMapAttachment::layer() const
216{
217 return 0;
218}
219
Jamie Madill3592a332014-09-03 15:07:15 -0400220Texture *TextureCubeMapAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400221{
Jamie Madill3592a332014-09-03 15:07:15 -0400222 return mTextureCubeMap.get();
Jamie Madille261b442014-06-25 12:42:21 -0400223}
224
225///// Texture3DAttachment Implementation ////////
226
227Texture3DAttachment::Texture3DAttachment(Texture3D *texture, GLint level, GLint layer)
228 : mLevel(level), mLayer(layer)
229{
230 mTexture3D.set(texture);
231}
232
233Texture3DAttachment::~Texture3DAttachment()
234{
235 mTexture3D.set(NULL);
236}
237
238rx::RenderTarget *Texture3DAttachment::getRenderTarget()
239{
240 return mTexture3D->getRenderTarget(mLevel, mLayer);
241}
242
Jamie Madille261b442014-06-25 12:42:21 -0400243GLsizei Texture3DAttachment::getWidth() const
244{
245 return mTexture3D->getWidth(mLevel);
246}
247
248GLsizei Texture3DAttachment::getHeight() const
249{
250 return mTexture3D->getHeight(mLevel);
251}
252
253GLenum Texture3DAttachment::getInternalFormat() const
254{
255 return mTexture3D->getInternalFormat(mLevel);
256}
257
258GLenum Texture3DAttachment::getActualFormat() const
259{
260 return mTexture3D->getActualFormat(mLevel);
261}
262
Jamie Madille261b442014-06-25 12:42:21 -0400263unsigned int Texture3DAttachment::getSerial() const
264{
265 return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
266}
267
Jamie Madille261b442014-06-25 12:42:21 -0400268GLenum Texture3DAttachment::type() const
269{
270 return GL_TEXTURE_3D;
271}
272
273GLint Texture3DAttachment::mipLevel() const
274{
275 return mLevel;
276}
277
278GLint Texture3DAttachment::layer() const
279{
280 return mLayer;
281}
282
Jamie Madill3592a332014-09-03 15:07:15 -0400283Texture *Texture3DAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400284{
Jamie Madill3592a332014-09-03 15:07:15 -0400285 return mTexture3D.get();
Jamie Madille261b442014-06-25 12:42:21 -0400286}
287
288////// Texture2DArrayAttachment Implementation //////
289
290Texture2DArrayAttachment::Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer)
291 : mLevel(level), mLayer(layer)
292{
293 mTexture2DArray.set(texture);
294}
295
296Texture2DArrayAttachment::~Texture2DArrayAttachment()
297{
298 mTexture2DArray.set(NULL);
299}
300
301rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
302{
303 return mTexture2DArray->getRenderTarget(mLevel, mLayer);
304}
305
Jamie Madille261b442014-06-25 12:42:21 -0400306GLsizei Texture2DArrayAttachment::getWidth() const
307{
308 return mTexture2DArray->getWidth(mLevel);
309}
310
311GLsizei Texture2DArrayAttachment::getHeight() const
312{
313 return mTexture2DArray->getHeight(mLevel);
314}
315
316GLenum Texture2DArrayAttachment::getInternalFormat() const
317{
318 return mTexture2DArray->getInternalFormat(mLevel);
319}
320
321GLenum Texture2DArrayAttachment::getActualFormat() const
322{
323 return mTexture2DArray->getActualFormat(mLevel);
324}
325
Jamie Madille261b442014-06-25 12:42:21 -0400326unsigned int Texture2DArrayAttachment::getSerial() const
327{
328 return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
329}
330
Jamie Madille261b442014-06-25 12:42:21 -0400331GLenum Texture2DArrayAttachment::type() const
332{
333 return GL_TEXTURE_2D_ARRAY;
334}
335
336GLint Texture2DArrayAttachment::mipLevel() const
337{
338 return mLevel;
339}
340
341GLint Texture2DArrayAttachment::layer() const
342{
343 return mLayer;
344}
345
Jamie Madill3592a332014-09-03 15:07:15 -0400346Texture *Texture2DArrayAttachment::getTexture() const
Jamie Madille261b442014-06-25 12:42:21 -0400347{
Jamie Madill3592a332014-09-03 15:07:15 -0400348 return mTexture2DArray.get();
Jamie Madille261b442014-06-25 12:42:21 -0400349}
350
351////// RenderbufferAttachment Implementation //////
352
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400353RenderbufferAttachment::RenderbufferAttachment(Renderbuffer *renderbuffer)
354{
355 ASSERT(renderbuffer);
356 mRenderbuffer.set(renderbuffer);
357}
358
359RenderbufferAttachment::~RenderbufferAttachment()
360{
361 mRenderbuffer.set(NULL);
362}
363
364rx::RenderTarget *RenderbufferAttachment::getRenderTarget()
365{
366 return mRenderbuffer->getStorage()->getRenderTarget();
367}
368
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400369rx::TextureStorage *RenderbufferAttachment::getTextureStorage()
370{
371 UNREACHABLE();
372 return NULL;
373}
374
375GLsizei RenderbufferAttachment::getWidth() const
376{
377 return mRenderbuffer->getWidth();
378}
379
380GLsizei RenderbufferAttachment::getHeight() const
381{
382 return mRenderbuffer->getHeight();
383}
384
385GLenum RenderbufferAttachment::getInternalFormat() const
386{
387 return mRenderbuffer->getInternalFormat();
388}
389
390GLenum RenderbufferAttachment::getActualFormat() const
391{
392 return mRenderbuffer->getActualFormat();
393}
394
395GLsizei RenderbufferAttachment::getSamples() const
396{
397 return mRenderbuffer->getStorage()->getSamples();
398}
399
400unsigned int RenderbufferAttachment::getSerial() const
401{
402 return mRenderbuffer->getStorage()->getSerial();
403}
404
Jamie Madill218b6ed2014-06-16 10:34:01 -0400405GLuint RenderbufferAttachment::id() const
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400406{
Jamie Madill218b6ed2014-06-16 10:34:01 -0400407 return mRenderbuffer->id();
408}
409
410GLenum RenderbufferAttachment::type() const
411{
412 return GL_RENDERBUFFER;
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400413}
414
Jamie Madill9c074a32014-06-16 10:34:02 -0400415GLint RenderbufferAttachment::mipLevel() const
416{
417 return 0;
418}
419
420GLint RenderbufferAttachment::layer() const
421{
422 return 0;
423}
424
Jamie Madill6c7b4ad2014-06-16 10:33:59 -0400425unsigned int RenderbufferAttachment::getTextureSerial() const
426{
427 UNREACHABLE();
428 return 0;
Jamie Madillafc21c02014-06-04 15:29:47 -0400429}
430
431}