Reduced LL's leakage of program/shader objects, drastically.

Re-structured some shader loading/unloading handling.

These changes are pretty experimental. I'll be holding off of tweaking the paramater managers(among other things) until I know if this stuff is working correctly.
This commit is contained in:
Shyotl
2011-02-10 18:21:38 -06:00
parent d0feea7ed7
commit 7d3e9723c3
6 changed files with 151 additions and 216 deletions

View File

@@ -69,9 +69,10 @@ hasGamma(false), hasLighting(false), calculatesAtmospherics(false)
//===============================
// LLGLSL Shader implementation
//===============================
LLGLSLShader::LLGLSLShader()
: mProgramObject(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT)
LLGLSLShader::LLGLSLShader(S32 shader_class)
: mProgramObject(0), mShaderClass(shader_class), mShaderLevel(0), mShaderGroup(SG_DEFAULT)
{
LLShaderMgr::getGlobalShaderList().push_back(this);
}
void LLGLSLShader::unload()
@@ -84,17 +85,18 @@ void LLGLSLShader::unload()
if (mProgramObject)
{
GLhandleARB obj[1024];
//Don't do this! Attached objects are already flagged for deletion.
//They will be deleted when no programs have them attached. (deleting a program auto-detaches them!)
/*GLhandleARB obj[1024];
GLsizei count;
glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj);
for (GLsizei i = 0; i < count; i++)
for (GLsizei i = 0; i < count; i++)
{
glDeleteObjectARB(obj[i]);
}
glDeleteObjectARB(mProgramObject);
}*/
if(mProgramObject)
glDeleteObjectARB(mProgramObject);
mProgramObject = 0;
}
@@ -110,12 +112,17 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
llassert_always(!mShaderFiles.empty());
BOOL success = TRUE;
if(mProgramObject) //purge the old program
glDeleteObjectARB(mProgramObject);
// Create program
mProgramObject = glCreateProgramObjectARB();
// Attach existing objects
if (!LLShaderMgr::instance()->attachShaderFeatures(this))
{
if(mProgramObject)
glDeleteObjectARB(mProgramObject);
mProgramObject = 0;
return FALSE;
}
@@ -145,6 +152,10 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
}
if( !success )
{
if(mProgramObject)
glDeleteObjectARB(mProgramObject);
mProgramObject = 0;
LL_WARNS("ShaderLoading") << "Failed to link shader: " << mName << LL_ENDL;
// Try again using a lower shader level;