blob: 1277c0632130513f4b9708c582be996d0a12dc16 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 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// Framebuffer.cpp: Implements the gl::Framebuffer class. Implements GL framebuffer
8// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105.
9
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000010#include "libGLESv2/Framebuffer.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000012#include "libGLESv2/main.h"
13#include "libGLESv2/Renderbuffer.h"
14#include "libGLESv2/Texture.h"
daniel@transgaming.com93a81472010-04-20 18:52:58 +000015#include "libGLESv2/utilities.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000016
17namespace gl
18{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000019
apatrick@chromium.orgff8bdfb2010-09-15 17:27:49 +000020Framebuffer::Framebuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021{
22 mColorbufferType = GL_NONE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023 mDepthbufferType = GL_NONE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024 mStencilbufferType = GL_NONE;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025}
26
27Framebuffer::~Framebuffer()
28{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000029 mColorbufferPointer.set(NULL);
30 mDepthbufferPointer.set(NULL);
31 mStencilbufferPointer.set(NULL);
32}
33
34Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const
35{
36 gl::Context *context = gl::getContext();
37 Renderbuffer *buffer = NULL;
38
39 if (type == GL_NONE)
40 {
41 buffer = NULL;
42 }
43 else if (type == GL_RENDERBUFFER)
44 {
45 buffer = context->getRenderbuffer(handle);
46 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +000047 else if (IsInternalTextureTarget(type))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000048 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +000049 buffer = context->getTexture(handle)->getRenderbuffer(type);
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000050 }
51 else
52 {
53 UNREACHABLE();
54 }
55
56 return buffer;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057}
58
59void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer)
60{
daniel@transgaming.com2fa45512011-10-04 18:43:18 +000061 mColorbufferType = (colorbuffer != 0) ? type : GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000062 mColorbufferPointer.set(lookupRenderbuffer(type, colorbuffer));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000063}
64
65void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer)
66{
daniel@transgaming.com2fa45512011-10-04 18:43:18 +000067 mDepthbufferType = (depthbuffer != 0) ? type : GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000068 mDepthbufferPointer.set(lookupRenderbuffer(type, depthbuffer));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000069}
70
71void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer)
72{
daniel@transgaming.com2fa45512011-10-04 18:43:18 +000073 mStencilbufferType = (stencilbuffer != 0) ? type : GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000074 mStencilbufferPointer.set(lookupRenderbuffer(type, stencilbuffer));
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000075}
76
77void Framebuffer::detachTexture(GLuint texture)
78{
apatrick@chromium.org551022e2012-01-23 19:56:54 +000079 if (mColorbufferPointer.id() == texture && IsInternalTextureTarget(mColorbufferType))
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000080 {
81 mColorbufferType = GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000082 mColorbufferPointer.set(NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000083 }
daniel@transgaming.comfbc09532010-04-26 15:33:41 +000084
apatrick@chromium.org551022e2012-01-23 19:56:54 +000085 if (mDepthbufferPointer.id() == texture && IsInternalTextureTarget(mDepthbufferType))
daniel@transgaming.comfbc09532010-04-26 15:33:41 +000086 {
87 mDepthbufferType = GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000088 mDepthbufferPointer.set(NULL);
daniel@transgaming.comfbc09532010-04-26 15:33:41 +000089 }
90
apatrick@chromium.org551022e2012-01-23 19:56:54 +000091 if (mStencilbufferPointer.id() == texture && IsInternalTextureTarget(mStencilbufferType))
daniel@transgaming.comfbc09532010-04-26 15:33:41 +000092 {
93 mStencilbufferType = GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +000094 mStencilbufferPointer.set(NULL);
daniel@transgaming.comfbc09532010-04-26 15:33:41 +000095 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096}
97
98void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
99{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000100 if (mColorbufferPointer.id() == renderbuffer && mColorbufferType == GL_RENDERBUFFER)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101 {
102 mColorbufferType = GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000103 mColorbufferPointer.set(NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000104 }
105
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000106 if (mDepthbufferPointer.id() == renderbuffer && mDepthbufferType == GL_RENDERBUFFER)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 {
108 mDepthbufferType = GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000109 mDepthbufferPointer.set(NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000110 }
111
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000112 if (mStencilbufferPointer.id() == renderbuffer && mStencilbufferType == GL_RENDERBUFFER)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000113 {
114 mStencilbufferType = GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000115 mStencilbufferPointer.set(NULL);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000116 }
117}
118
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000119unsigned int Framebuffer::getRenderTargetSerial()
120{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000121 Renderbuffer *colorbuffer = mColorbufferPointer.get();
daniel@transgaming.com092bd482010-05-12 03:39:36 +0000122
123 if (colorbuffer)
124 {
125 return colorbuffer->getSerial();
126 }
127
128 return 0;
129}
130
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000131// Increments refcount on surface.
132// caller must Release() the returned surface
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000133IDirect3DSurface9 *Framebuffer::getRenderTarget()
134{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000135 Renderbuffer *colorbuffer = mColorbufferPointer.get();
daniel@transgaming.comfab5a1a2010-03-11 19:22:30 +0000136
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137 if (colorbuffer)
138 {
139 return colorbuffer->getRenderTarget();
140 }
141
142 return NULL;
143}
144
daniel@transgaming.com63e6afe2012-05-31 01:14:42 +0000145// Increments refcount on surface.
146// caller must Release() the returned surface
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000147IDirect3DSurface9 *Framebuffer::getDepthStencil()
148{
149 Renderbuffer *depthstencilbuffer = mDepthbufferPointer.get();
150
151 if (!depthstencilbuffer)
152 {
153 depthstencilbuffer = mStencilbufferPointer.get();
154 }
155
156 if (depthstencilbuffer)
157 {
158 return depthstencilbuffer->getDepthStencil();
159 }
160
161 return NULL;
162}
163
daniel@transgaming.com339ae702010-05-12 03:40:20 +0000164unsigned int Framebuffer::getDepthbufferSerial()
165{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000166 Renderbuffer *depthbuffer = mDepthbufferPointer.get();
daniel@transgaming.com339ae702010-05-12 03:40:20 +0000167
168 if (depthbuffer)
169 {
170 return depthbuffer->getSerial();
171 }
172
173 return 0;
174}
175
daniel@transgaming.com4cbc5902010-08-24 19:20:26 +0000176unsigned int Framebuffer::getStencilbufferSerial()
177{
178 Renderbuffer *stencilbuffer = mStencilbufferPointer.get();
179
180 if (stencilbuffer)
181 {
182 return stencilbuffer->getSerial();
183 }
184
185 return 0;
186}
187
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000188Renderbuffer *Framebuffer::getColorbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000189{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000190 return mColorbufferPointer.get();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000191}
192
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000193Renderbuffer *Framebuffer::getDepthbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000194{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000195 return mDepthbufferPointer.get();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000196}
197
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000198Renderbuffer *Framebuffer::getStencilbuffer()
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000199{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000200 return mStencilbufferPointer.get();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000201}
202
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +0000203GLenum Framebuffer::getColorbufferType()
204{
205 return mColorbufferType;
206}
207
208GLenum Framebuffer::getDepthbufferType()
209{
210 return mDepthbufferType;
211}
212
213GLenum Framebuffer::getStencilbufferType()
214{
215 return mStencilbufferType;
216}
217
218GLuint Framebuffer::getColorbufferHandle()
219{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000220 return mColorbufferPointer.id();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +0000221}
222
223GLuint Framebuffer::getDepthbufferHandle()
224{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000225 return mDepthbufferPointer.id();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +0000226}
227
228GLuint Framebuffer::getStencilbufferHandle()
229{
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000230 return mStencilbufferPointer.id();
daniel@transgaming.comc46c9c02010-04-23 18:34:55 +0000231}
232
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000233bool Framebuffer::hasStencil()
234{
235 if (mStencilbufferType != GL_NONE)
236 {
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000237 Renderbuffer *stencilbufferObject = getStencilbuffer();
daniel@transgaming.coma27ff1e2010-08-24 19:20:11 +0000238
239 if (stencilbufferObject)
240 {
241 return stencilbufferObject->getStencilSize() > 0;
242 }
243 }
244
245 return false;
246}
247
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000248GLenum Framebuffer::completeness()
249{
daniel@transgaming.comd885df02012-05-31 01:14:36 +0000250 gl::Context *context = gl::getContext();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000251 int width = 0;
252 int height = 0;
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000253 int samples = -1;
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000254 bool missingAttachment = true;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000255
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000256 if (mColorbufferType != GL_NONE)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000257 {
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000258 Renderbuffer *colorbuffer = getColorbuffer();
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000259
260 if (!colorbuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000261 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000262 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000263 }
264
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000265 if (colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000266 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000267 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000268 }
269
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000270 if (mColorbufferType == GL_RENDERBUFFER)
271 {
daniel@transgaming.comd2fd4f22011-02-01 18:49:11 +0000272 if (!gl::IsColorRenderable(colorbuffer->getInternalFormat()))
daniel@transgaming.comedc19182010-10-15 17:57:55 +0000273 {
274 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
275 }
276 }
apatrick@chromium.org551022e2012-01-23 19:56:54 +0000277 else if (IsInternalTextureTarget(mColorbufferType))
daniel@transgaming.com01868132010-08-24 19:21:17 +0000278 {
daniel@transgaming.comd885df02012-05-31 01:14:36 +0000279 GLenum internalformat = colorbuffer->getInternalFormat();
280 D3DFORMAT d3dformat = colorbuffer->getD3DFormat();
281
282 if (IsCompressed(internalformat) ||
283 internalformat == GL_LUMINANCE ||
284 internalformat == GL_LUMINANCE_ALPHA)
daniel@transgaming.com01868132010-08-24 19:21:17 +0000285 {
286 return GL_FRAMEBUFFER_UNSUPPORTED;
287 }
daniel@transgaming.com1297d922010-09-01 15:47:47 +0000288
daniel@transgaming.comd885df02012-05-31 01:14:36 +0000289 if ((dx2es::IsFloat32Format(d3dformat) && !context->supportsFloat32RenderableTextures()) ||
290 (dx2es::IsFloat16Format(d3dformat) && !context->supportsFloat16RenderableTextures()))
daniel@transgaming.comb6b2e672010-10-15 17:57:47 +0000291 {
292 return GL_FRAMEBUFFER_UNSUPPORTED;
293 }
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000294
295 if (dx2es::IsDepthFormat(d3dformat) || dx2es::IsStencilFormat(d3dformat))
296 {
297 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
298 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000299 }
daniel@transgaming.comd885df02012-05-31 01:14:36 +0000300 else
301 {
302 UNREACHABLE();
303 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
304 }
daniel@transgaming.com01868132010-08-24 19:21:17 +0000305
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000306 width = colorbuffer->getWidth();
307 height = colorbuffer->getHeight();
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000308 samples = colorbuffer->getSamples();
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000309 missingAttachment = false;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000310 }
311
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000312 Renderbuffer *depthbuffer = NULL;
313 Renderbuffer *stencilbuffer = NULL;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000314
315 if (mDepthbufferType != GL_NONE)
316 {
317 depthbuffer = getDepthbuffer();
318
319 if (!depthbuffer)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000320 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000321 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000322 }
323
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000324 if (depthbuffer->getWidth() == 0 || depthbuffer->getHeight() == 0)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000325 {
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000326 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
327 }
328
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000329 if (mDepthbufferType == GL_RENDERBUFFER)
330 {
331 if (!gl::IsDepthRenderable(depthbuffer->getInternalFormat()))
332 {
333 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
334 }
335 }
336 else if (IsInternalTextureTarget(mDepthbufferType))
337 {
338 D3DFORMAT d3dformat = depthbuffer->getD3DFormat();
339
340 // depth texture attachments require OES/ANGLE_depth_texture
341 if (!context->supportsDepthTextures())
342 {
343 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
344 }
345
346 if (!dx2es::IsDepthFormat(d3dformat))
347 {
348 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
349 }
350 }
351 else
352 {
353 UNREACHABLE();
354 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
355 }
356
357 if (missingAttachment)
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000358 {
359 width = depthbuffer->getWidth();
360 height = depthbuffer->getHeight();
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000361 samples = depthbuffer->getSamples();
362 missingAttachment = false;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000363 }
364 else if (width != depthbuffer->getWidth() || height != depthbuffer->getHeight())
365 {
366 return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
367 }
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000368 else if (samples != depthbuffer->getSamples())
369 {
370 return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE;
371 }
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000372 }
373
374 if (mStencilbufferType != GL_NONE)
375 {
376 stencilbuffer = getStencilbuffer();
377
378 if (!stencilbuffer)
379 {
380 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
381 }
382
383 if (stencilbuffer->getWidth() == 0 || stencilbuffer->getHeight() == 0)
384 {
385 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
386 }
387
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000388 if (mStencilbufferType == GL_RENDERBUFFER)
389 {
390 if (!gl::IsStencilRenderable(stencilbuffer->getInternalFormat()))
391 {
392 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
393 }
394 }
395 else if (IsInternalTextureTarget(mStencilbufferType))
396 {
397 D3DFORMAT d3dformat = stencilbuffer->getD3DFormat();
398
399 // texture stencil attachments come along as part
400 // of OES_packed_depth_stencil + OES/ANGLE_depth_texture
401 if (!context->supportsDepthTextures())
402 {
403 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
404 }
405
406 if (!dx2es::IsStencilFormat(d3dformat))
407 {
408 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
409 }
410 }
411 else
412 {
413 UNREACHABLE();
414 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
415 }
416
417 if (missingAttachment)
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000418 {
419 width = stencilbuffer->getWidth();
420 height = stencilbuffer->getHeight();
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000421 samples = stencilbuffer->getSamples();
422 missingAttachment = false;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000423 }
424 else if (width != stencilbuffer->getWidth() || height != stencilbuffer->getHeight())
425 {
426 return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
427 }
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000428 else if (samples != stencilbuffer->getSamples())
429 {
430 return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE;
431 }
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000432 }
433
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000434 // if we have both a depth and stencil buffer, they must refer to the same object
435 // since we only support packed_depth_stencil and not separate depth and stencil
436 if (depthbuffer && stencilbuffer && (depthbuffer != stencilbuffer))
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000437 {
daniel@transgaming.com6b7c84c2012-05-31 01:14:39 +0000438 return GL_FRAMEBUFFER_UNSUPPORTED;
439 }
440
441 // we need to have at least one attachment to be complete
442 if (missingAttachment)
443 {
444 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
daniel@transgaming.comcdacc8e2010-07-28 19:20:50 +0000445 }
446
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000447 return GL_FRAMEBUFFER_COMPLETE;
448}
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000449
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000450DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000451{
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000452 mColorbufferPointer.set(new Renderbuffer(0, colorbuffer));
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000453
454 Renderbuffer *depthStencilRenderbuffer = new Renderbuffer(0, depthStencil);
455 mDepthbufferPointer.set(depthStencilRenderbuffer);
456 mStencilbufferPointer.set(depthStencilRenderbuffer);
daniel@transgaming.comd14558a2011-11-09 17:46:18 +0000457
458 mColorbufferType = GL_RENDERBUFFER;
459 mDepthbufferType = (depthStencilRenderbuffer->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
460 mStencilbufferType = (depthStencilRenderbuffer->getStencilSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000461}
462
daniel@transgaming.com1f135d82010-08-24 19:20:36 +0000463int Framebuffer::getSamples()
464{
465 if (completeness() == GL_FRAMEBUFFER_COMPLETE)
466 {
467 return getColorbuffer()->getSamples();
468 }
469 else
470 {
471 return 0;
472 }
473}
474
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000475GLenum DefaultFramebuffer::completeness()
476{
daniel@transgaming.com73a5db62010-10-15 17:58:13 +0000477 // The default framebuffer should always be complete
478 ASSERT(Framebuffer::completeness() == GL_FRAMEBUFFER_COMPLETE);
479
daniel@transgaming.com9ecb9f92010-07-28 19:21:12 +0000480 return GL_FRAMEBUFFER_COMPLETE;
481}
482
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000483}