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/ResourceManager.cpp b/src/libGLESv2/ResourceManager.cpp
index 8fa2a65..0b8422e 100644
--- a/src/libGLESv2/ResourceManager.cpp
+++ b/src/libGLESv2/ResourceManager.cpp
@@ -146,14 +146,13 @@
     return handle;
 }
 
-// FIXME: shared object deletion needs handling
 void ResourceManager::deleteBuffer(GLuint buffer)
 {
     BufferMap::iterator bufferObject = mBufferMap.find(buffer);
 
     if (bufferObject != mBufferMap.end())
     {
-        delete bufferObject->second;
+        if (bufferObject->second) bufferObject->second->release();
         mBufferMap.erase(bufferObject);
     }
 }
@@ -194,30 +193,24 @@
     }
 }
 
-// FIXME: shared object deletion needs handling
 void ResourceManager::deleteTexture(GLuint texture)
 {
     TextureMap::iterator textureObject = mTextureMap.find(texture);
 
     if (textureObject != mTextureMap.end())
     {
-        if (texture != 0)
-        {
-            delete textureObject->second;
-        }
-
+        if (textureObject->second) textureObject->second->release();
         mTextureMap.erase(textureObject);
     }
 }
 
-// FIXME: shared object deletion needs handling
 void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
 {
     RenderbufferMap::iterator renderbufferObject = mRenderbufferMap.find(renderbuffer);
 
     if (renderbufferObject != mRenderbufferMap.end())
     {
-        delete renderbufferObject->second;
+        if (renderbufferObject->second) renderbufferObject->second->release();
         mRenderbufferMap.erase(renderbufferObject);
     }
 }
@@ -303,7 +296,9 @@
 {
     if (buffer != 0 && !getBuffer(buffer))
     {
-        mBufferMap[buffer] = new Buffer();
+        Buffer *bufferObject = new Buffer(buffer);
+        mBufferMap[buffer] = bufferObject;
+        bufferObject->addRef();
     }
 }
 
@@ -311,14 +306,24 @@
 {
     if (!getTexture(texture) && texture != 0)
     {
+        Texture *textureObject;
+
         if (type == SAMPLER_2D)
         {
-            mTextureMap[texture] = new Texture2D();
+            textureObject = new Texture2D(texture);
         }
         else if (type == SAMPLER_CUBE)
         {
-            mTextureMap[texture] = new TextureCubeMap();
+            textureObject = new TextureCubeMap(texture);
         }
+        else
+        {
+            UNREACHABLE();
+            return;
+        }
+
+        mTextureMap[texture] = textureObject;
+        textureObject->addRef();
     }
 }
 
@@ -326,7 +331,9 @@
 {
     if (renderbuffer != 0 && !getRenderbuffer(renderbuffer))
     {
-        mRenderbufferMap[renderbuffer] = new Renderbuffer();
+        Renderbuffer *renderbufferObject = new Renderbuffer(renderbuffer, new Colorbuffer(0, 0, GL_RGBA4));
+        mRenderbufferMap[renderbuffer] = renderbufferObject;
+        renderbufferObject->addRef();
     }
 }