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);
}