1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be 4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file. 5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Framebuffer.cpp: Implements the gl::Framebuffer class. Implements GL framebuffer 8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105. 9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Framebuffer.h" 11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/main.h" 13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Renderbuffer.h" 14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/Texture.h" 15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "libGLESv2/utilities.h" 16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blocknamespace gl 18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockFramebuffer::Framebuffer() 21a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mColorbufferType = GL_NONE; 23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mDepthbufferType = GL_NONE; 24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mStencilbufferType = GL_NONE; 25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockFramebuffer::~Framebuffer() 28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mColorbufferPointer.set(NULL); 305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mDepthbufferPointer.set(NULL); 315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mStencilbufferPointer.set(NULL); 325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickRenderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const 355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick gl::Context *context = gl::getContext(); 375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *buffer = NULL; 385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (type == GL_NONE) 405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick buffer = NULL; 425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else if (type == GL_RENDERBUFFER) 445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick buffer = context->getRenderbuffer(handle); 465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else if (IsTextureTarget(type)) 485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick buffer = context->getTexture(handle)->getColorbuffer(type); 505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick UNREACHABLE(); 545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return buffer; 57a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 58a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer) 60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 61a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mColorbufferType = type; 625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mColorbufferPointer.set(lookupRenderbuffer(type, colorbuffer)); 63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 65a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer) 66a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 67a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mDepthbufferType = type; 685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mDepthbufferPointer.set(lookupRenderbuffer(type, depthbuffer)); 69a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 70a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 71a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer) 72a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 73a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mStencilbufferType = type; 745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mStencilbufferPointer.set(lookupRenderbuffer(type, stencilbuffer)); 75a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 76a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 77a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid Framebuffer::detachTexture(GLuint texture) 78a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (mColorbufferPointer.id() == texture && IsTextureTarget(mColorbufferType)) 80a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 81a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mColorbufferType = GL_NONE; 825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mColorbufferPointer.set(NULL); 83a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 84a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (mDepthbufferPointer.id() == texture && IsTextureTarget(mDepthbufferType)) 86a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 87a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mDepthbufferType = GL_NONE; 885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mDepthbufferPointer.set(NULL); 89a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 90a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 915abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (mStencilbufferPointer.id() == texture && IsTextureTarget(mStencilbufferType)) 92a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 93a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mStencilbufferType = GL_NONE; 945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mStencilbufferPointer.set(NULL); 95a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 96a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 97a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 98a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockvoid Framebuffer::detachRenderbuffer(GLuint renderbuffer) 99a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 1005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (mColorbufferPointer.id() == renderbuffer && mColorbufferType == GL_RENDERBUFFER) 101a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 102a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mColorbufferType = GL_NONE; 1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mColorbufferPointer.set(NULL); 104a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 105a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (mDepthbufferPointer.id() == renderbuffer && mDepthbufferType == GL_RENDERBUFFER) 107a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 108a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mDepthbufferType = GL_NONE; 1095abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mDepthbufferPointer.set(NULL); 110a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 111a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (mStencilbufferPointer.id() == renderbuffer && mStencilbufferType == GL_RENDERBUFFER) 113a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 114a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block mStencilbufferType = GL_NONE; 1155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mStencilbufferPointer.set(NULL); 116a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 117a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 118a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 119a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockunsigned int Framebuffer::getRenderTargetSerial() 120a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 1215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *colorbuffer = mColorbufferPointer.get(); 122a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 123a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (colorbuffer) 124a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 125a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return colorbuffer->getSerial(); 126a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 127a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 128a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return 0; 129a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 130a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 131a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockIDirect3DSurface9 *Framebuffer::getRenderTarget() 132a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 1335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *colorbuffer = mColorbufferPointer.get(); 134a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 135a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (colorbuffer) 136a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 137a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return colorbuffer->getRenderTarget(); 138a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 139a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 140a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return NULL; 141a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 142a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickIDirect3DSurface9 *Framebuffer::getDepthStencil() 1445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 1455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *depthstencilbuffer = mDepthbufferPointer.get(); 1465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (!depthstencilbuffer) 1485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick depthstencilbuffer = mStencilbufferPointer.get(); 1505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (depthstencilbuffer) 1535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 1545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return depthstencilbuffer->getDepthStencil(); 1555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 1565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 1575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 1585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 1595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 160a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockunsigned int Framebuffer::getDepthbufferSerial() 161a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 1625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *depthbuffer = mDepthbufferPointer.get(); 163a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 164a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (depthbuffer) 165a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 166a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return depthbuffer->getSerial(); 167a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 168a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 169a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return 0; 170a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 171a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickunsigned int Framebuffer::getStencilbufferSerial() 173a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 1745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *stencilbuffer = mStencilbufferPointer.get(); 175a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (stencilbuffer) 177a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 1785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return stencilbuffer->getSerial(); 179a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 180a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return 0; 182a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 183a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 184a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockColorbuffer *Framebuffer::getColorbuffer() 185a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 1865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *rb = mColorbufferPointer.get(); 187a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (rb != NULL && rb->isColorbuffer()) 189a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 1905abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return static_cast<Colorbuffer*>(rb->getStorage()); 191a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 192a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block else 193a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 1945abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 195a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 196a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 197a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 1985abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickDepthStencilbuffer *Framebuffer::getDepthbuffer() 199a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 2005abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *rb = mDepthbufferPointer.get(); 201a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 2025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (rb != NULL && rb->isDepthbuffer()) 203a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 2045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return static_cast<DepthStencilbuffer*>(rb->getStorage()); 2055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 2075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 209a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 210a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 211a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 2125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickDepthStencilbuffer *Framebuffer::getStencilbuffer() 213a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 2145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *rb = mStencilbufferPointer.get(); 215a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 2165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (rb != NULL && rb->isStencilbuffer()) 217a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 2185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return static_cast<DepthStencilbuffer*>(rb->getStorage()); 2195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 2215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return NULL; 223a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 224a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 225a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 226a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLenum Framebuffer::getColorbufferType() 227a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 228a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return mColorbufferType; 229a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 230a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 231a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLenum Framebuffer::getDepthbufferType() 232a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 233a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return mDepthbufferType; 234a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 235a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 236a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLenum Framebuffer::getStencilbufferType() 237a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 238a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return mStencilbufferType; 239a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 240a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 241a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLuint Framebuffer::getColorbufferHandle() 242a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 2435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return mColorbufferPointer.id(); 244a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 245a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 246a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLuint Framebuffer::getDepthbufferHandle() 247a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 2485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return mDepthbufferPointer.id(); 249a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 250a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 251a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockGLuint Framebuffer::getStencilbufferHandle() 252a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 2535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return mStencilbufferPointer.id(); 254a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 255a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 2565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickbool Framebuffer::hasStencil() 257a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 2585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (mStencilbufferType != GL_NONE) 2595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick DepthStencilbuffer *stencilbufferObject = getStencilbuffer(); 261a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 2625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (stencilbufferObject) 2635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return stencilbufferObject->getStencilSize() > 0; 2655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return false; 2695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickbool Framebuffer::isMultisample() 2725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 2735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // If the framebuffer is not complete, attachment samples may be mismatched, and it 2745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // cannot be used as a multisample framebuffer. If it is complete, it is required to 2755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // have a color attachment, and all its attachments must have the same number of samples, 2765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // so the number of samples for the colorbuffer will indicate whether the framebuffer is 2775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick // multisampled. 2785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (completeness() == GL_FRAMEBUFFER_COMPLETE && getColorbuffer()->getSamples() > 0) 2795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return true; 2815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 2835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 2845abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return false; 2855abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 2865abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 2875abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 2885abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLenum Framebuffer::completeness() 2895abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 290a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int width = 0; 291a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block int height = 0; 2925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick int samples = -1; 293a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 294a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (mColorbufferType != GL_NONE) 295a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 296a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block Colorbuffer *colorbuffer = getColorbuffer(); 297a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 298a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (!colorbuffer) 299a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 300a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 301a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 302a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 303a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0) 304a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 305a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 306a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 307a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 308ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (mColorbufferType == GL_RENDERBUFFER) 309ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch { 310ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (!gl::IsColorRenderable(colorbuffer->getFormat())) 311ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch { 312ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 313ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch } 314ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch } 315ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch else if (IsTextureTarget(mColorbufferType)) 3165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (IsCompressed(colorbuffer->getFormat())) 3185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return GL_FRAMEBUFFER_UNSUPPORTED; 3205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 321ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 322ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (colorbuffer->isFloatingPoint() && (!getContext()->supportsFloatRenderableTextures() || 323ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch !getContext()->supportsHalfFloatRenderableTextures())) 324ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch { 325ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return GL_FRAMEBUFFER_UNSUPPORTED; 326ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch } 327ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 328ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (colorbuffer->getFormat() == GL_LUMINANCE || colorbuffer->getFormat() == GL_LUMINANCE_ALPHA) 329ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch { 330ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return GL_FRAMEBUFFER_UNSUPPORTED; 331ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch } 3325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 333ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch else UNREACHABLE(); 3345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 335a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block width = colorbuffer->getWidth(); 336a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block height = colorbuffer->getHeight(); 3375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick samples = colorbuffer->getSamples(); 338a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 3395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 3405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; 3425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 3435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 3445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick DepthStencilbuffer *depthbuffer = NULL; 3455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick DepthStencilbuffer *stencilbuffer = NULL; 346a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 347a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (mDepthbufferType != GL_NONE) 348a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 349ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (mDepthbufferType != GL_RENDERBUFFER) 350ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch { 351ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return GL_FRAMEBUFFER_UNSUPPORTED; // Requires GL_OES_depth_texture 352ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch } 353ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 3545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick depthbuffer = getDepthbuffer(); 355a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 356a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (!depthbuffer) 357a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 358a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 359a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 360a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 361a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (depthbuffer->getWidth() == 0 || depthbuffer->getHeight() == 0) 362a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 363a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 364a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 365a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 366a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (width == 0) 367a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 368a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block width = depthbuffer->getWidth(); 369a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block height = depthbuffer->getHeight(); 370a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 371a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block else if (width != depthbuffer->getWidth() || height != depthbuffer->getHeight()) 372a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 373a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; 374a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 3755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 3765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (samples == -1) 3775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick samples = depthbuffer->getSamples(); 3795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 3805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else if (samples != depthbuffer->getSamples()) 3815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 3825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE; 3835abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 384a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 385a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 386a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (mStencilbufferType != GL_NONE) 387a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 388ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (mStencilbufferType != GL_RENDERBUFFER) 389ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch { 390ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return GL_FRAMEBUFFER_UNSUPPORTED; 391ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch } 392ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 3935abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick stencilbuffer = getStencilbuffer(); 394a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 395a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (!stencilbuffer) 396a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 397a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 398a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 399a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 400a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (stencilbuffer->getWidth() == 0 || stencilbuffer->getHeight() == 0) 401a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 402a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 403a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 404a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 405a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (width == 0) 406a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 407a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block width = stencilbuffer->getWidth(); 408a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block height = stencilbuffer->getHeight(); 409a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 410a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block else if (width != stencilbuffer->getWidth() || height != stencilbuffer->getHeight()) 411a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block { 412a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; 413a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 4145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (samples == -1) 4165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 4175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick samples = stencilbuffer->getSamples(); 4185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 4195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else if (samples != stencilbuffer->getSamples()) 4205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 4215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE; 4225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 4235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 4245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (mDepthbufferType == GL_RENDERBUFFER && mStencilbufferType == GL_RENDERBUFFER) 4265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 4275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (depthbuffer->getFormat() != GL_DEPTH24_STENCIL8_OES || 4285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick stencilbuffer->getFormat() != GL_DEPTH24_STENCIL8_OES || 4295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick depthbuffer->getSerial() != stencilbuffer->getSerial()) 4305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 4315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return GL_FRAMEBUFFER_UNSUPPORTED; 4325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 4335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 4345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return GL_FRAMEBUFFER_COMPLETE; 4365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 4375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickDefaultFramebuffer::DefaultFramebuffer(Colorbuffer *color, DepthStencilbuffer *depthStencil) 4395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 4405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mColorbufferType = GL_RENDERBUFFER; 441ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch mDepthbufferType = (depthStencil->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE; 442ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch mStencilbufferType = (depthStencil->getStencilSize() != 0) ? GL_RENDERBUFFER : GL_NONE; 4435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mColorbufferPointer.set(new Renderbuffer(0, color)); 4455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick Renderbuffer *depthStencilRenderbuffer = new Renderbuffer(0, depthStencil); 4475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mDepthbufferPointer.set(depthStencilRenderbuffer); 4485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick mStencilbufferPointer.set(depthStencilRenderbuffer); 4495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 4505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 4515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickint Framebuffer::getSamples() 4525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 4535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick if (completeness() == GL_FRAMEBUFFER_COMPLETE) 4545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 4555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return getColorbuffer()->getSamples(); 4565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick } 4575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick else 4585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick { 4595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick return 0; 460a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 4615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} 462a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 4635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain MerrickGLenum DefaultFramebuffer::completeness() 4645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{ 465ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // The default framebuffer should always be complete 466ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch ASSERT(Framebuffer::completeness() == GL_FRAMEBUFFER_COMPLETE); 467ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 468a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return GL_FRAMEBUFFER_COMPLETE; 469a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 4705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick 471a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 472