Cache the Program

move
scrawl 9 years ago
parent 456816f707
commit 22cc5c0965

@ -3,6 +3,8 @@
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <osg/Program>
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include <boost/filesystem/path.hpp> #include <boost/filesystem/path.hpp>
#include <boost/filesystem/fstream.hpp> #include <boost/filesystem/fstream.hpp>
@ -78,4 +80,18 @@ namespace Shader
return shaderIt->second; return shaderIt->second;
} }
osg::ref_ptr<osg::Program> ShaderManager::getProgram(osg::ref_ptr<osg::Shader> vertexShader, osg::ref_ptr<osg::Shader> fragmentShader)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mMutex);
ProgramMap::iterator found = mPrograms.find(std::make_pair(vertexShader, fragmentShader));
if (found == mPrograms.end())
{
osg::ref_ptr<osg::Program> program (new osg::Program);
program->addShader(vertexShader);
program->addShader(fragmentShader);
found = mPrograms.insert(std::make_pair(std::make_pair(vertexShader, fragmentShader), program)).first;
}
return found->second;
}
} }

@ -30,6 +30,9 @@ namespace Shader
/// @note Thread safe. /// @note Thread safe.
osg::ref_ptr<osg::Shader> getShader(const std::string& shaderTemplate, const DefineMap& defines, osg::Shader::Type shaderType); osg::ref_ptr<osg::Shader> getShader(const std::string& shaderTemplate, const DefineMap& defines, osg::Shader::Type shaderType);
osg::ref_ptr<osg::Program> getProgram(osg::ref_ptr<osg::Shader> vertexShader, osg::ref_ptr<osg::Shader> fragmentShader);
private: private:
std::string mPath; std::string mPath;
@ -41,6 +44,9 @@ namespace Shader
typedef std::map<MapKey, osg::ref_ptr<osg::Shader> > ShaderMap; typedef std::map<MapKey, osg::ref_ptr<osg::Shader> > ShaderMap;
ShaderMap mShaders; ShaderMap mShaders;
typedef std::map<std::pair<osg::ref_ptr<osg::Shader>, osg::ref_ptr<osg::Shader> >, osg::ref_ptr<osg::Program> > ProgramMap;
ProgramMap mPrograms;
OpenThreads::Mutex mMutex; OpenThreads::Mutex mMutex;
}; };

@ -131,11 +131,7 @@ namespace Shader
if (vertexShader && fragmentShader) if (vertexShader && fragmentShader)
{ {
osg::ref_ptr<osg::Program> program (new osg::Program); stateset->setAttributeAndModes(mShaderManager.getProgram(vertexShader, fragmentShader), osg::StateAttribute::ON);
program->addShader(vertexShader);
program->addShader(fragmentShader);
stateset->setAttributeAndModes(program, osg::StateAttribute::ON);
for (std::map<int, std::string>::const_iterator texIt = reqs.mTextures.begin(); texIt != reqs.mTextures.end(); ++texIt) for (std::map<int, std::string>::const_iterator texIt = reqs.mTextures.begin(); texIt != reqs.mTextures.end(); ++texIt)
{ {

Loading…
Cancel
Save