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