Sharing for buffer, texture and renderbuffer objects.

TRAC #12496

Derive Renderbuffer, Texture and Buffer from RefCountObject.
This class keeps a reference count for all objects that need cross-context
reference counting, and also the object id.
Restructure Renderbuffers to create a wrapper object and a storage object.
Use BindingPointer for all binding points instead of binding by object id.

Signed-off-by: Shannon Woods
Signed-off-by: Daniel Koch

git-svn-id: https://angleproject.googlecode.com/svn/trunk@364 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Renderbuffer.cpp b/src/libGLESv2/Renderbuffer.cpp
index 318b862..81cff87 100644
--- a/src/libGLESv2/Renderbuffer.cpp
+++ b/src/libGLESv2/Renderbuffer.cpp
@@ -15,73 +15,133 @@
 
 namespace gl
 {
-unsigned int Renderbuffer::mCurrentSerial = 1;
+unsigned int RenderbufferStorage::mCurrentSerial = 1;
 
-Renderbuffer::Renderbuffer()
+Renderbuffer::Renderbuffer(GLuint id, RenderbufferStorage *storage) : RefCountObject(id)
 {
-    mWidth = 0;
-    mHeight = 0;
-    mFormat = GL_RGBA4; // default format, needs to be one of the expected renderbuffer formats
-    mSerial = issueSerial();
+    ASSERT(storage != NULL);
+    mStorage = storage;
 }
 
 Renderbuffer::~Renderbuffer()
 {
+    delete mStorage;
 }
 
-bool Renderbuffer::isColorbuffer()
+bool Renderbuffer::isColorbuffer() const
 {
-    return false;
+    return mStorage->isColorbuffer();
 }
 
-bool Renderbuffer::isDepthbuffer()
+bool Renderbuffer::isDepthbuffer() const
 {
-    return false;
+    return mStorage->isDepthbuffer();
 }
 
-bool Renderbuffer::isStencilbuffer()
+bool Renderbuffer::isStencilbuffer() const
 {
-    return false;
+    return mStorage->isStencilbuffer();
 }
 
 IDirect3DSurface9 *Renderbuffer::getRenderTarget()
 {
-    return NULL;
+    return mStorage->getRenderTarget();
 }
 
 IDirect3DSurface9 *Renderbuffer::getDepthStencil()
 {
+    return mStorage->getDepthStencil();
+}
+
+int Renderbuffer::getWidth() const
+{
+    return mStorage->getWidth();
+}
+
+int Renderbuffer::getHeight() const
+{
+    return mStorage->getHeight();
+}
+
+GLenum Renderbuffer::getFormat() const
+{
+    return mStorage->getFormat();
+}
+
+unsigned int Renderbuffer::getSerial() const
+{
+    return mStorage->getSerial();
+}
+
+void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
+{
+    ASSERT(newStorage != NULL);
+
+    delete mStorage;
+    mStorage = newStorage;
+}
+
+RenderbufferStorage::RenderbufferStorage()
+{
+    mSerial = issueSerial();
+}
+
+RenderbufferStorage::~RenderbufferStorage()
+{
+}
+
+bool RenderbufferStorage::isColorbuffer() const
+{
+    return false;
+}
+
+bool RenderbufferStorage::isDepthbuffer() const
+{
+    return false;
+}
+
+bool RenderbufferStorage::isStencilbuffer() const
+{
+    return false;
+}
+
+IDirect3DSurface9 *RenderbufferStorage::getRenderTarget()
+{
     return NULL;
 }
 
-int Renderbuffer::getWidth()
+IDirect3DSurface9 *RenderbufferStorage::getDepthStencil()
+{
+    return NULL;
+}
+
+int RenderbufferStorage::getWidth() const
 {
     return mWidth;
 }
 
-int Renderbuffer::getHeight()
+int RenderbufferStorage::getHeight() const
 {
     return mHeight;
 }
 
-void Renderbuffer::setSize(int width, int height)
+void RenderbufferStorage::setSize(int width, int height)
 {
     mWidth = width;
     mHeight = height;
 }
 
-
-GLenum Renderbuffer::getFormat()
+GLenum RenderbufferStorage::getFormat() const
 {
     return mFormat;
 }
 
-unsigned int Renderbuffer::getSerial() const
+unsigned int RenderbufferStorage::getSerial() const
 {
     return mSerial;
 }
 
-unsigned int Renderbuffer::issueSerial()
+unsigned int RenderbufferStorage::issueSerial()
 {
     return mCurrentSerial++;
 }
@@ -105,18 +165,22 @@
     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)
+    if (width > 0 && height > 0)
     {
-        error(GL_OUT_OF_MEMORY);
+        HRESULT result = device->CreateRenderTarget(width, height, es2dx::ConvertRenderbufferFormat(format), 
+                                                    D3DMULTISAMPLE_NONE, 0, FALSE, &mRenderTarget, NULL);
 
-        return;
+        if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
+        {
+            error(GL_OUT_OF_MEMORY);
+
+            return;
+        }
+
+        ASSERT(SUCCEEDED(result));
     }
 
-    ASSERT(SUCCEEDED(result));
-
     if (mRenderTarget)
     {
         setSize(width, height);
@@ -137,12 +201,12 @@
     }
 }
 
-bool Colorbuffer::isColorbuffer()
+bool Colorbuffer::isColorbuffer() const
 {
     return true;
 }
 
-GLuint Colorbuffer::getRedSize()
+GLuint Colorbuffer::getRedSize() const
 {
     if (mRenderTarget)
     {
@@ -155,7 +219,7 @@
     return 0;
 }
 
-GLuint Colorbuffer::getGreenSize()
+GLuint Colorbuffer::getGreenSize() const
 {
     if (mRenderTarget)
     {
@@ -168,7 +232,7 @@
     return 0;
 }
 
-GLuint Colorbuffer::getBlueSize()
+GLuint Colorbuffer::getBlueSize() const
 {
     if (mRenderTarget)
     {
@@ -181,7 +245,7 @@
     return 0;
 }
 
-GLuint Colorbuffer::getAlphaSize()
+GLuint Colorbuffer::getAlphaSize() const
 {
     if (mRenderTarget)
     {
@@ -249,17 +313,17 @@
     }
 }
 
-bool DepthStencilbuffer::isDepthbuffer()
+bool DepthStencilbuffer::isDepthbuffer() const
 {
     return true;
 }
 
-bool DepthStencilbuffer::isStencilbuffer()
+bool DepthStencilbuffer::isStencilbuffer() const
 {
     return true;
 }
 
-GLuint DepthStencilbuffer::getDepthSize()
+GLuint DepthStencilbuffer::getDepthSize() const
 {
     if (mDepthStencil)
     {
@@ -272,7 +336,7 @@
     return 0;
 }
 
-GLuint DepthStencilbuffer::getStencilSize()
+GLuint DepthStencilbuffer::getStencilSize() const
 {
     if (mDepthStencil)
     {
@@ -314,12 +378,12 @@
 {
 }
 
-bool Depthbuffer::isDepthbuffer()
+bool Depthbuffer::isDepthbuffer() const
 {
     return true;
 }
 
-bool Depthbuffer::isStencilbuffer()
+bool Depthbuffer::isStencilbuffer() const
 {
     return false;
 }
@@ -352,12 +416,12 @@
 {
 }
 
-bool Stencilbuffer::isDepthbuffer()
+bool Stencilbuffer::isDepthbuffer() const
 {
     return false;
 }
 
-bool Stencilbuffer::isStencilbuffer()
+bool Stencilbuffer::isStencilbuffer() const
 {
     return true;
 }