forked from mirror/openmw-tes3mp
Cache the Program
This commit is contained in:
parent
456816f707
commit
22cc5c0965
3 changed files with 23 additions and 5 deletions
|
@ -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…
Reference in a new issue