This commit is contained in:
Drake Arconis
2012-09-16 16:40:49 -04:00
37 changed files with 893 additions and 655 deletions

View File

@@ -244,14 +244,16 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,
BOOL LLGLSLShader::attachObject(std::string object)
{
if (LLShaderMgr::instance()->mShaderObjects.count(object) > 0)
std::multimap<std::string, LLShaderMgr::CachedObjectInfo>::iterator it = LLShaderMgr::instance()->mShaderObjects.begin();
for(; it!=LLShaderMgr::instance()->mShaderObjects.end(); it++)
{
stop_glerror();
glAttachObjectARB(mProgramObject, LLShaderMgr::instance()->mShaderObjects[object]);
stop_glerror();
return TRUE;
if((*it).first == object)
{
glAttachObjectARB(mProgramObject, (*it).second.mHandle);
stop_glerror();
return TRUE;
}
}
else
{
LL_WARNS("ShaderLoading") << "Attempting to attach shader object that hasn't been compiled: " << object << LL_ENDL;
return FALSE;
@@ -262,6 +264,20 @@ void LLGLSLShader::attachObject(GLhandleARB object)
{
if (object != 0)
{
std::multimap<std::string, LLShaderMgr::CachedObjectInfo>::iterator it = LLShaderMgr::instance()->mShaderObjects.begin();
for(; it!=LLShaderMgr::instance()->mShaderObjects.end(); it++)
{
if((*it).second.mHandle == object)
{
LL_DEBUGS("ShaderLoading") << "Attached: " << (*it).first << llendl;
break;
}
}
if(it == LLShaderMgr::instance()->mShaderObjects.end())
{
LL_WARNS("ShaderLoading") << "Attached unknown shader!" << llendl;
}
stop_glerror();
glAttachObjectARB(mProgramObject, object);
stop_glerror();

View File

@@ -525,6 +525,14 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, S32 texture_index_channels)
{
std::pair<std::multimap<std::string, CachedObjectInfo >::iterator, std::multimap<std::string, CachedObjectInfo>::iterator> range;
range = mShaderObjects.equal_range(filename);
for (std::multimap<std::string, CachedObjectInfo>::iterator it = range.first; it != range.second;++it)
{
if((*it).second.mLevel == shader_level && (*it).second.mType == type)
return (*it).second.mHandle;
}
GLenum error = GL_NO_ERROR;
if (gDebugGL)
{
@@ -888,7 +896,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
if (ret)
{
// Add shader file to map
mShaderObjects[filename] = ret;
mShaderObjects.insert(make_pair(filename,CachedObjectInfo(ret,try_gpu_class,type)));
shader_level = try_gpu_class;
}
else

View File

@@ -185,8 +185,16 @@ public:
virtual void updateShaderUniforms(LLGLSLShader * shader) = 0; // Pure Virtual
public:
struct CachedObjectInfo
{
CachedObjectInfo(GLhandleARB handle, U32 level, GLenum type) :
mHandle(handle), mLevel(level), mType(type) {}
GLhandleARB mHandle; //Actual handle of the opengl shader object.
U32 mLevel; //Level /might/ not be needed, but it's stored to ensure there's no change in behavior.
GLenum mType; //GL_VERTEX_SHADER_ARB or GL_FRAGMENT_SHADER_ARB. Tracked because some utility shaders can be loaded as both types (carefully).
};
// Map of shader names to compiled
std::map<std::string, GLhandleARB> mShaderObjects;
std::multimap<std::string, CachedObjectInfo > mShaderObjects; //Singu Note: Packing more info here. Doing such provides capability to skip unneeded duplicate loading..
//global (reserved slot) shader parameters
std::vector<std::string> mReservedAttribs;