Initial import from TransGaming

git-svn-id: https://angleproject.googlecode.com/svn/trunk@2 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/libGLESv2/Framebuffer.cpp b/libGLESv2/Framebuffer.cpp
new file mode 100644
index 0000000..f242abe
--- /dev/null
+++ b/libGLESv2/Framebuffer.cpp
@@ -0,0 +1,233 @@
+//
+// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Framebuffer.cpp: Implements the gl::Framebuffer class. Implements GL framebuffer
+// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105.
+
+#include "Framebuffer.h"
+
+#include "Renderbuffer.h"
+#include "Texture.h"
+#include "main.h"
+
+namespace gl
+{
+Framebuffer::Framebuffer()
+{
+    mColorbufferType = GL_NONE;
+    mColorbufferHandle = 0;
+
+    mDepthbufferType = GL_NONE;
+    mDepthbufferHandle = 0;
+
+    mStencilbufferType = GL_NONE;
+    mStencilbufferHandle = 0;
+}
+
+Framebuffer::~Framebuffer()
+{
+}
+
+void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer)
+{
+    mColorbufferType = type;
+    mColorbufferHandle = colorbuffer;
+}
+
+void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer)
+{
+    mDepthbufferType = type;
+    mDepthbufferHandle = depthbuffer;
+}
+
+void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer)
+{
+    mStencilbufferType = type;
+    mStencilbufferHandle = stencilbuffer;
+}
+
+void Framebuffer::detachTexture(GLuint texture)
+{
+    if (mColorbufferHandle == texture && mColorbufferType == GL_TEXTURE)
+    {
+        mColorbufferType = GL_NONE;
+        mColorbufferHandle = 0;
+    }
+}
+
+void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
+{
+    if (mColorbufferHandle == renderbuffer && mColorbufferType == GL_RENDERBUFFER)
+    {
+        mColorbufferType = GL_NONE;
+        mColorbufferHandle = 0;
+    }
+
+    if (mDepthbufferHandle == renderbuffer && mDepthbufferType == GL_RENDERBUFFER)
+    {
+        mDepthbufferType = GL_NONE;
+        mDepthbufferHandle = 0;
+    }
+
+    if (mStencilbufferHandle == renderbuffer && mStencilbufferType == GL_RENDERBUFFER)
+    {
+        mStencilbufferType = GL_NONE;
+        mStencilbufferHandle = 0;
+    }
+}
+
+IDirect3DSurface9 *Framebuffer::getRenderTarget()
+{
+    Renderbuffer *colorbuffer = getColorbuffer();
+    
+    if (colorbuffer)
+    {
+        return colorbuffer->getRenderTarget();
+    }
+
+    return NULL;
+}
+
+IDirect3DSurface9 *Framebuffer::getDepthStencil()
+{
+    gl::Context *context = gl::getContext();
+    Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
+    
+    if (depthbuffer)
+    {
+        return depthbuffer->getDepthStencil();
+    }
+
+    return NULL;
+}
+
+Colorbuffer *Framebuffer::getColorbuffer()
+{
+    gl::Context *context = gl::getContext();
+    Colorbuffer *colorbuffer = NULL;
+
+    if (mColorbufferType == GL_RENDERBUFFER)
+    {
+        colorbuffer = context->getColorbuffer(mColorbufferHandle);
+    }
+    else if (mColorbufferType == GL_TEXTURE)
+    {
+        colorbuffer = context->getTexture(mColorbufferHandle);
+    }
+    else UNREACHABLE();
+
+    if (colorbuffer && colorbuffer->isColorbuffer())
+    {
+        return colorbuffer;
+    }
+
+    return NULL;
+}
+
+Depthbuffer *Framebuffer::getDepthbuffer()
+{
+    gl::Context *context = gl::getContext();
+    Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
+    
+    if (depthbuffer && depthbuffer->isDepthbuffer())
+    {
+        return depthbuffer;
+    }
+
+    return NULL;
+}
+
+Stencilbuffer *Framebuffer::getStencilbuffer()
+{
+    gl::Context *context = gl::getContext();
+    Stencilbuffer *stencilbuffer = context->getStencilbuffer(mStencilbufferHandle);
+    
+    if (stencilbuffer && stencilbuffer->isStencilbuffer())
+    {
+        return stencilbuffer;
+    }
+
+    return NULL;
+}
+
+GLenum Framebuffer::completeness()
+{
+    gl::Context *context = gl::getContext();
+
+    int width = 0;
+    int height = 0;
+
+    if (mColorbufferType != GL_NONE)
+    {
+        Colorbuffer *colorbuffer = getColorbuffer();
+
+        if (!colorbuffer)
+        {
+            return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+        }
+
+        if (colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0)
+        {
+            return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+        }
+
+        width = colorbuffer->getWidth();
+        height = colorbuffer->getHeight();
+    }
+
+    if (mDepthbufferType != GL_NONE)
+    {
+        Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
+
+        if (!depthbuffer)
+        {
+            return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+        }
+
+        if (depthbuffer->getWidth() == 0 || depthbuffer->getHeight() == 0)
+        {
+            return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+        }
+
+        if (width == 0)
+        {
+            width = depthbuffer->getWidth();
+            height = depthbuffer->getHeight();
+        }
+        else if (width != depthbuffer->getWidth() || height != depthbuffer->getHeight())
+        {
+            return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
+        }
+    }
+
+    if (mStencilbufferType != GL_NONE)
+    {
+        Stencilbuffer *stencilbuffer = context->getStencilbuffer(mStencilbufferHandle);
+
+        if (!stencilbuffer)
+        {
+            return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+        }
+
+        if (stencilbuffer->getWidth() == 0 || stencilbuffer->getHeight() == 0)
+        {
+            return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+        }
+
+        if (width == 0)
+        {
+            width = stencilbuffer->getWidth();
+            height = stencilbuffer->getHeight();
+        }
+        else if (width != stencilbuffer->getWidth() || height != stencilbuffer->getHeight())
+        {
+            return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
+        }
+    }
+
+    return GL_FRAMEBUFFER_COMPLETE;
+}
+}