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