Implements color renderbuffers
TRAC #11890
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: http://angleproject.googlecode.com/svn/trunk@167 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Renderbuffer.cpp b/src/libGLESv2/Renderbuffer.cpp
index 29eb6e8..86796f0 100644
--- a/src/libGLESv2/Renderbuffer.cpp
+++ b/src/libGLESv2/Renderbuffer.cpp
@@ -74,6 +74,35 @@
     }
 }
 
+Colorbuffer::Colorbuffer(int width, int height, GLenum format)
+{
+    IDirect3DDevice9 *device = getDevice();
+
+    mRenderTarget = NULL;
+    HRESULT result = device->CreateRenderTarget(width, height, es2dx::ConvertRenderbufferFormat(format), 
+                                                D3DMULTISAMPLE_NONE, 0, FALSE, &mRenderTarget, NULL);
+
+    if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
+    {
+        error(GL_OUT_OF_MEMORY);
+
+        return;
+    }
+
+    ASSERT(SUCCEEDED(result));
+
+    if (mRenderTarget)
+    {
+        mWidth = width;
+        mHeight = height;
+    }
+    else
+    {
+        mWidth = 0;
+        mHeight = 0;
+    }
+}
+
 Colorbuffer::~Colorbuffer()
 {
     if (mRenderTarget)
diff --git a/src/libGLESv2/Renderbuffer.h b/src/libGLESv2/Renderbuffer.h
index 35e7a78..7672a8c 100644
--- a/src/libGLESv2/Renderbuffer.h
+++ b/src/libGLESv2/Renderbuffer.h
@@ -47,7 +47,8 @@
 class Colorbuffer : public Renderbuffer
 {
   public:
-    Colorbuffer(IDirect3DSurface9 *renderTarget);
+    explicit Colorbuffer(IDirect3DSurface9 *renderTarget);
+    Colorbuffer(int width, int height, GLenum format);
 
     ~Colorbuffer();
 
@@ -70,7 +71,7 @@
 class Depthbuffer : public Renderbuffer
 {
   public:
-    Depthbuffer(IDirect3DSurface9 *depthStencil);
+    explicit Depthbuffer(IDirect3DSurface9 *depthStencil);
     Depthbuffer(int width, int height);
 
     ~Depthbuffer();
@@ -89,7 +90,7 @@
 class Stencilbuffer : public Renderbuffer
 {
   public:
-    Stencilbuffer(IDirect3DSurface9 *depthStencil);
+    explicit Stencilbuffer(IDirect3DSurface9 *depthStencil);
     Stencilbuffer(int width, int height);
 
     ~Stencilbuffer();
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 1dcfd0d..b9624c4 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -3354,8 +3354,7 @@
               case GL_RGBA4:
               case GL_RGB5_A1:
               case GL_RGB565:
-                UNIMPLEMENTED();   // FIXME
-            //  context->setRenderbuffer(new Colorbuffer(renderTarget));
+                context->setRenderbuffer(new gl::Colorbuffer(width, height, internalformat));
                 break;
               case GL_STENCIL_INDEX8:
                 context->setRenderbuffer(new gl::Stencilbuffer(width, height));
diff --git a/src/libGLESv2/utilities.cpp b/src/libGLESv2/utilities.cpp
index d461ca4..9a4a0be 100644
--- a/src/libGLESv2/utilities.cpp
+++ b/src/libGLESv2/utilities.cpp
@@ -392,4 +392,17 @@
     }
 }
 
+D3DFORMAT ConvertRenderbufferFormat(GLenum format)
+{
+    switch (format)
+    {
+      case GL_RGBA4:
+      case GL_RGB5_A1:              return D3DFMT_A8R8G8B8;
+      case GL_RGB565:               return D3DFMT_R5G6B5;
+      case GL_DEPTH_COMPONENT16:
+      case GL_STENCIL_INDEX8:       return D3DFMT_D24S8;
+      default: UNREACHABLE();       return D3DFMT_A8R8G8B8;
+    }
+}
+
 }
diff --git a/src/libGLESv2/utilities.h b/src/libGLESv2/utilities.h
index cc9e96e..e0843ca 100644
--- a/src/libGLESv2/utilities.h
+++ b/src/libGLESv2/utilities.h
@@ -41,6 +41,7 @@
                           D3DPRIMITIVETYPE *d3dPrimitiveType, int *d3dPrimitiveCount);
 bool IsCubemapTextureTarget(GLenum target);
 bool CheckTextureFormatType(GLenum format, GLenum type);
+D3DFORMAT ConvertRenderbufferFormat(GLenum format);
 
 }