Separate Colorbuffer into storage and texture variants, implementing a common interface.

TRAC #16284
Signed-off-by: Daniel Koch
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/trunk@840 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Renderbuffer.cpp b/src/libGLESv2/Renderbuffer.cpp
index ae252ec..74d60f2 100644
--- a/src/libGLESv2/Renderbuffer.cpp
+++ b/src/libGLESv2/Renderbuffer.cpp
@@ -16,108 +16,185 @@
 
 namespace gl
 {
-unsigned int RenderbufferStorage::mCurrentSerial = 1;
+unsigned int RenderbufferInterface::mCurrentSerial = 1;
 
-Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *storage) : RefCountObject(id)
+RenderbufferInterface::RenderbufferInterface() : mSerial(issueSerial())
 {
-    ASSERT(storage != NULL);
-    mStorage = storage;
+}
+
+GLuint RenderbufferInterface::getRedSize() const
+{
+    return dx2es::GetRedSize(getD3DFormat());
+}
+
+GLuint RenderbufferInterface::getGreenSize() const
+{
+    return dx2es::GetGreenSize(getD3DFormat());
+}
+
+GLuint RenderbufferInterface::getBlueSize() const
+{
+    return dx2es::GetBlueSize(getD3DFormat());
+}
+
+GLuint RenderbufferInterface::getAlphaSize() const
+{
+    return dx2es::GetAlphaSize(getD3DFormat());
+}
+
+GLuint RenderbufferInterface::getDepthSize() const
+{
+    return dx2es::GetDepthSize(getD3DFormat());
+}
+
+GLuint RenderbufferInterface::getStencilSize() const
+{
+    return dx2es::GetStencilSize(getD3DFormat());
+}
+
+unsigned int RenderbufferInterface::getSerial() const
+{
+    return mSerial;
+}
+
+unsigned int RenderbufferInterface::issueSerial()
+{
+    return mCurrentSerial++;
+}
+
+RenderbufferTexture::RenderbufferTexture(Texture *texture, GLenum target) : mTexture(texture), mTarget(target)
+{
+}
+
+RenderbufferTexture::~RenderbufferTexture()
+{
+}
+
+IDirect3DSurface9 *RenderbufferTexture::getRenderTarget()
+{
+    return mTexture->getRenderTarget(mTarget);
+}
+
+IDirect3DSurface9 *RenderbufferTexture::getDepthStencil()
+{
+    return NULL;
+}
+
+GLsizei RenderbufferTexture::getWidth() const
+{
+    return mTexture->getWidth();
+}
+ 
+GLsizei RenderbufferTexture::getHeight() const
+{
+    return mTexture->getHeight();
+}
+ 
+GLenum RenderbufferTexture::getInternalFormat() const
+{
+    return mTexture->getInternalFormat();
+}
+ 
+GLsizei RenderbufferTexture::getSamples() const
+{
+    return 0;
+}
+
+D3DFORMAT RenderbufferTexture::getD3DFormat() const
+{
+    return mTexture->getD3DFormat();
+}
+
+Renderbuffer::Renderbuffer(GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
+{
+    ASSERT(instance != NULL);
+    mInstance = instance;
 }
 
 Renderbuffer::~Renderbuffer()
 {
-    delete mStorage;
-}
-
-Colorbuffer *Renderbuffer::getColorbuffer()
-{
-    return mStorage->getColorbuffer();
-}
-
-DepthStencilbuffer *Renderbuffer::getDepthbuffer()
-{
-    return mStorage->getDepthbuffer();
-}
-
-DepthStencilbuffer *Renderbuffer::getStencilbuffer()
-{
-    return mStorage->getStencilbuffer();
+    delete mInstance;
 }
 
 IDirect3DSurface9 *Renderbuffer::getRenderTarget()
 {
-    return mStorage->getRenderTarget();
+    return mInstance->getRenderTarget();
 }
 
 IDirect3DSurface9 *Renderbuffer::getDepthStencil()
 {
-    return mStorage->getDepthStencil();
+    return mInstance->getDepthStencil();
 }
 
 GLsizei Renderbuffer::getWidth() const
 {
-    return mStorage->getWidth();
+    return mInstance->getWidth();
 }
 
 GLsizei Renderbuffer::getHeight() const
 {
-    return mStorage->getHeight();
+    return mInstance->getHeight();
 }
 
 GLenum Renderbuffer::getInternalFormat() const
 {
-    return mStorage->getInternalFormat();
+    return mInstance->getInternalFormat();
+}
+
+D3DFORMAT Renderbuffer::getD3DFormat() const
+{
+    return mInstance->getD3DFormat();
 }
 
 GLuint Renderbuffer::getRedSize() const
 {
-    return mStorage->getRedSize();
+    return mInstance->getRedSize();
 }
 
 GLuint Renderbuffer::getGreenSize() const
 {
-    return mStorage->getGreenSize();
+    return mInstance->getGreenSize();
 }
 
 GLuint Renderbuffer::getBlueSize() const
 {
-    return mStorage->getBlueSize();
+    return mInstance->getBlueSize();
 }
 
 GLuint Renderbuffer::getAlphaSize() const
 {
-    return mStorage->getAlphaSize();
+    return mInstance->getAlphaSize();
 }
 
 GLuint Renderbuffer::getDepthSize() const
 {
-    return mStorage->getDepthSize();
+    return mInstance->getDepthSize();
 }
 
 GLuint Renderbuffer::getStencilSize() const
 {
-    return mStorage->getStencilSize();
+    return mInstance->getStencilSize();
 }
 
 GLsizei Renderbuffer::getSamples() const
 {
-    return mStorage->getSamples();
+    return mInstance->getSamples();
 }
 
 unsigned int Renderbuffer::getSerial() const
 {
-    return mStorage->getSerial();
+    return mInstance->getSerial();
 }
 
 void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
 {
     ASSERT(newStorage != NULL);
 
-    delete mStorage;
-    mStorage = newStorage;
+    delete mInstance;
+    mInstance = newStorage;
 }
 
-RenderbufferStorage::RenderbufferStorage() : mSerial(issueSerial())
+RenderbufferStorage::RenderbufferStorage()
 {
     mWidth = 0;
     mHeight = 0;
@@ -130,21 +207,6 @@
 {
 }
 
-Colorbuffer *RenderbufferStorage::getColorbuffer()
-{
-    return NULL;
-}
-
-DepthStencilbuffer *RenderbufferStorage::getDepthbuffer()
-{
-    return NULL;
-}
-
-DepthStencilbuffer *RenderbufferStorage::getStencilbuffer()
-{
-    return NULL;
-}
-
 IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
 {
     return NULL;
@@ -170,36 +232,6 @@
     return mInternalFormat;
 }
 
-GLuint RenderbufferStorage::getRedSize() const
-{
-    return dx2es::GetRedSize(getD3DFormat());
-}
-
-GLuint RenderbufferStorage::getGreenSize() const
-{
-    return dx2es::GetGreenSize(getD3DFormat());
-}
-
-GLuint RenderbufferStorage::getBlueSize() const
-{
-    return dx2es::GetBlueSize(getD3DFormat());
-}
-
-GLuint RenderbufferStorage::getAlphaSize() const
-{
-    return dx2es::GetAlphaSize(getD3DFormat());
-}
-
-GLuint RenderbufferStorage::getDepthSize() const
-{
-    return dx2es::GetDepthSize(getD3DFormat());
-}
-
-GLuint RenderbufferStorage::getStencilSize() const
-{
-    return dx2es::GetStencilSize(getD3DFormat());
-}
-
 GLsizei RenderbufferStorage::getSamples() const
 {
     return mSamples;
@@ -210,17 +242,7 @@
     return mD3DFormat;
 }
 
-unsigned int RenderbufferStorage::getSerial() const
-{
-    return mSerial;
-}
-
-unsigned int RenderbufferStorage::issueSerial()
-{
-    return mCurrentSerial++;
-}
-
-Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget), mTexture(NULL)
+Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget)
 {
     if (renderTarget)
     {
@@ -237,21 +259,7 @@
     }
 }
 
-Colorbuffer::Colorbuffer(Texture *texture, GLenum target) : mRenderTarget(NULL), mTexture(texture), mTarget(target)
-{
-    if (texture)
-    {
-        mWidth = texture->getWidth();
-        mHeight = texture->getHeight();
-        mInternalFormat = texture->getInternalFormat();
-        mD3DFormat = texture->getD3DFormat();
-        mSamples = 0;
-
-        mRenderTarget = texture->getRenderTarget(target);
-    }
-}
-
-Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL), mTexture(NULL)
+Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(NULL)
 {
     IDirect3DDevice9 *device = getDevice();
 
@@ -295,73 +303,8 @@
     }
 }
 
-GLsizei Colorbuffer::getWidth() const
-{
-    if (mTexture)
-    {
-        return mTexture->getWidth();
-    }
-
-    return mWidth;
-}
-
-GLsizei Colorbuffer::getHeight() const
-{
-    if (mTexture)
-    {
-        return mTexture->getHeight();
-    }
-
-    return mHeight;
-}
-
-GLenum Colorbuffer::getInternalFormat() const
-{
-    if (mTexture)
-    {
-        return mTexture->getInternalFormat();
-    }
-
-    return mInternalFormat;
-}
-
-GLenum Colorbuffer::getType() const
-{
-    if (mTexture)
-    {
-        return mTexture->getType();
-    }
-
-    return GL_UNSIGNED_BYTE;
-}
-
-D3DFORMAT Colorbuffer::getD3DFormat() const
-{
-    if (mTexture)
-    {
-        return mTexture->getD3DFormat();
-    }
-
-    return mD3DFormat;
-}
-
-Colorbuffer *Colorbuffer::getColorbuffer()
-{
-    return this;
-}
-
 IDirect3DSurface9 *Colorbuffer::getRenderTarget()
 {
-    if (mTexture)
-    {
-        if (mRenderTarget)
-        {
-            mRenderTarget->Release();
-        }
-
-        mRenderTarget = mTexture->getRenderTarget(mTarget);
-    }
-
     return mRenderTarget;
 }
 
@@ -427,16 +370,6 @@
     }
 }
 
-DepthStencilbuffer *DepthStencilbuffer::getDepthbuffer()
-{
-    return this;
-}
-
-DepthStencilbuffer *DepthStencilbuffer::getStencilbuffer()
-{
-    return this;
-}
-
 IDirect3DSurface9 *DepthStencilbuffer::getDepthStencil()
 {
     return mDepthStencil;
@@ -454,7 +387,7 @@
 
 Depthbuffer::Depthbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
 {
-    if (getDepthStencil())
+    if (mDepthStencil)
     {
         mInternalFormat = GL_DEPTH_COMPONENT16;   // If the renderbuffer parameters are queried, the calling function
                                                   // will expect one of the valid renderbuffer formats for use in 
@@ -466,16 +399,6 @@
 {
 }
 
-DepthStencilbuffer *Depthbuffer::getDepthbuffer()
-{
-    return this;
-}
-
-DepthStencilbuffer *Depthbuffer::getStencilbuffer()
-{
-    return NULL;
-}
-
 Stencilbuffer::Stencilbuffer(IDirect3DSurface9 *depthStencil) : DepthStencilbuffer(depthStencil)
 {
     if (depthStencil)
@@ -488,7 +411,7 @@
 
 Stencilbuffer::Stencilbuffer(int width, int height, GLsizei samples) : DepthStencilbuffer(width, height, samples)
 {
-    if (getDepthStencil())
+    if (mDepthStencil)
     {
         mInternalFormat = GL_STENCIL_INDEX8;   // If the renderbuffer parameters are queried, the calling function
                                                // will expect one of the valid renderbuffer formats for use in 
@@ -500,13 +423,4 @@
 {
 }
 
-DepthStencilbuffer *Stencilbuffer::getDepthbuffer()
-{
-    return NULL;
-}
-
-DepthStencilbuffer *Stencilbuffer::getStencilbuffer()
-{
-    return this;
-}
 }