Adds resource manager class.
TRAC #12493
The resource manager class is now in charge of allocation &
management of objects which may be shared by multiple contexts.
Signed-off-by: Andrew Lewycky
Signed-off-by: Nicolas Capens
Signed-off-by: Daniel Koch
Author: Shannon Woods
git-svn-id: https://angleproject.googlecode.com/svn/trunk@360 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index 1306cfb..a32bc9f 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -45,7 +45,7 @@
{
}
-Program::Program()
+Program::Program(ResourceManager *manager, GLuint handle) : mResourceManager(manager), mHandle(handle)
{
mFragmentShader = NULL;
mVertexShader = NULL;
@@ -62,6 +62,8 @@
mDeleteStatus = false;
+ mRefCount = 0;
+
mSerial = issueSerial();
}
@@ -71,12 +73,12 @@
if (mVertexShader != NULL)
{
- mVertexShader->detach();
+ mVertexShader->release();
}
if (mFragmentShader != NULL)
{
- mFragmentShader->detach();
+ mFragmentShader->release();
}
}
@@ -90,7 +92,7 @@
}
mVertexShader = (VertexShader*)shader;
- mVertexShader->attach();
+ mVertexShader->addRef();
}
else if (shader->getType() == GL_FRAGMENT_SHADER)
{
@@ -100,7 +102,7 @@
}
mFragmentShader = (FragmentShader*)shader;
- mFragmentShader->attach();
+ mFragmentShader->addRef();
}
else UNREACHABLE();
@@ -116,7 +118,7 @@
return false;
}
- mVertexShader->detach();
+ mVertexShader->release();
mVertexShader = NULL;
}
else if (shader->getType() == GL_FRAGMENT_SHADER)
@@ -126,7 +128,7 @@
return false;
}
- mFragmentShader->detach();
+ mFragmentShader->release();
mFragmentShader = NULL;
}
else UNREACHABLE();
@@ -2379,13 +2381,13 @@
{
if (mFragmentShader)
{
- mFragmentShader->detach();
+ mFragmentShader->release();
mFragmentShader = NULL;
}
if (mVertexShader)
{
- mVertexShader->detach();
+ mVertexShader->release();
mVertexShader = NULL;
}
}
@@ -2462,6 +2464,26 @@
return mValidated;
}
+void Program::release()
+{
+ mRefCount--;
+
+ if (mRefCount == 0 && mDeleteStatus)
+ {
+ mResourceManager->deleteProgram(mHandle);
+ }
+}
+
+void Program::addRef()
+{
+ mRefCount++;
+}
+
+unsigned int Program::getRefCount() const
+{
+ return mRefCount;
+}
+
unsigned int Program::getSerial() const
{
return mSerial;