From Mike Weiblen, further work on GLSL support

This commit is contained in:
Robert Osfield
2005-05-06 09:58:49 +00:00
parent fc585cd33d
commit 7480d51830
6 changed files with 36 additions and 21 deletions

View File

@@ -12,7 +12,7 @@
*/
/* file: include/osg/Program
* author: Mike Weiblen 2005-04-29
* author: Mike Weiblen 2005-05-05
*/
#ifndef OSG_PROGRAM
@@ -364,6 +364,9 @@ class OSG_EXPORT Program : public osg::StateAttribute
* in the OpenGL context related to contextID.*/
static void flushDeletedGlPrograms(unsigned int contextID,double currentTime, double& availableTime);
typedef std::map< std::string, std::pair<GLint,GLenum> > NameInfoMap;
const NameInfoMap& getActiveUniforms(unsigned int contextID) const;
const NameInfoMap& getActiveAttribs(unsigned int contextID) const;
public:
@@ -390,7 +393,7 @@ class OSG_EXPORT Program : public osg::StateAttribute
void useProgram() const;
void resetAppliedUnifroms() const
void resetAppliedUniforms() const
{
for(LastAppliedUniformList::iterator itr=_lastAppliedUniformList.begin();
itr!=_lastAppliedUniformList.end();
@@ -426,8 +429,11 @@ class OSG_EXPORT Program : public osg::StateAttribute
}
}
inline GLint getUniformLocation( const std::string& name ) const { NameLocationMap::const_iterator itr = _uniformLocationMap.find(name); return (itr!=_uniformLocationMap.end()) ? itr->second : -1; }
inline GLint getAttribLocation( const std::string& name ) const { NameLocationMap::const_iterator itr = _attribLocationMap.find(name); return (itr!=_attribLocationMap.end()) ? itr->second : -1; }
const NameInfoMap& getActiveUniforms() const {return _uniformInfoMap;}
const NameInfoMap& getActiveAttribs() const {return _attribInfoMap;}
inline GLint getUniformLocation( const std::string& name ) const { NameInfoMap::const_iterator itr = _uniformInfoMap.find(name); return (itr!=_uniformInfoMap.end()) ? itr->second.first : -1; }
inline GLint getAttribLocation( const std::string& name ) const { NameInfoMap::const_iterator itr = _attribInfoMap.find(name); return (itr!=_attribInfoMap.end()) ? itr->second.first : -1; }
protected: /*methods*/
~PerContextProgram();
@@ -445,9 +451,8 @@ class OSG_EXPORT Program : public osg::StateAttribute
bool _isLinked;
const unsigned int _contextID;
typedef std::map<std::string, GLint> NameLocationMap;
NameLocationMap _uniformLocationMap;
NameLocationMap _attribLocationMap;
NameInfoMap _uniformInfoMap;
NameInfoMap _attribInfoMap;
typedef std::pair<const osg::Uniform*, unsigned int> UniformModifiedCountPair;
typedef std::vector<UniformModifiedCountPair> LastAppliedUniformList;

View File

@@ -11,7 +11,7 @@
*/
/* file: include/osg/Uniform
* author: Mike Weiblen 2005-04-21
* author: Mike Weiblen 2005-05-05
*/
#ifndef OSG_UNIFORM
@@ -153,7 +153,7 @@ class OSG_EXPORT Uniform : public Object
public:
Uniform();
Uniform( const std::string& name, Type type );
Uniform( Type type, const std::string& name );
/** Copy constructor using CopyOp to manage deep vs shallow copy. */
Uniform(const Uniform& rhs, const CopyOp& copyop=CopyOp::SHALLOW_COPY);

View File

@@ -13,7 +13,7 @@
*/
/* file: src/osg/Program.cpp
* author: Mike Weiblen 2005-04-29
* author: Mike Weiblen 2005-05-05
*/
#include <fstream>
@@ -2100,6 +2100,16 @@ bool Program::getGlProgramInfoLog(unsigned int contextID, std::string& log) cons
return getPCP( contextID )->getInfoLog( log );
}
const Program::NameInfoMap& Program::getActiveUniforms(unsigned int contextID) const
{
return getPCP( contextID )->getActiveUniforms();
}
const Program::NameInfoMap& Program::getActiveAttribs(unsigned int contextID) const
{
return getPCP( contextID )->getActiveAttribs();
}
///////////////////////////////////////////////////////////////////////////
// osg::Program::PerContextProgram
// PCP is an OSG abstraction of the per-context glProgram
@@ -2138,8 +2148,8 @@ void Program::PerContextProgram::linkProgram()
<< " id=" << _glProgramHandle
<< std::endl;
_uniformLocationMap.clear();
_attribLocationMap.clear();
_uniformInfoMap.clear();
_attribInfoMap.clear();
// set any explicit vertex attribute bindings
const AttribBindingList& bindlist = _program->getAttribBindingList();
@@ -2170,7 +2180,7 @@ void Program::PerContextProgram::linkProgram()
// dont build maps if link failed
if( ! _isLinked ) return;
// build _uniformLocationMap
// build _uniformInfoMap
GLint numUniforms = 0;
GLsizei maxLen = 0;
_extensions->glGetProgramiv( _glProgramHandle, GL_ACTIVE_UNIFORMS, &numUniforms );
@@ -2190,7 +2200,7 @@ void Program::PerContextProgram::linkProgram()
if( loc != -1 )
{
_uniformLocationMap[name] = loc;
_uniformInfoMap[name] = std::pair<GLint,GLenum>(loc,type);
osg::notify(osg::INFO)
<< "\tUniform \"" << name << "\""
@@ -2202,7 +2212,7 @@ void Program::PerContextProgram::linkProgram()
delete [] name;
}
// build _attribLocationMap
// build _attribInfoMap
GLint numAttrib = 0;
_extensions->glGetProgramiv( _glProgramHandle, GL_ACTIVE_ATTRIBUTES, &numAttrib );
_extensions->glGetProgramiv( _glProgramHandle, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxLen );
@@ -2221,7 +2231,7 @@ void Program::PerContextProgram::linkProgram()
if( loc != -1 )
{
_attribLocationMap[name] = loc;
_attribInfoMap[name] = std::pair<GLint,GLenum>(loc,type);
osg::notify(osg::INFO)
<< "\tAttrib \"" << name << "\""

View File

@@ -120,7 +120,7 @@ void State::reset()
apitr!=_appliedProgramObjectSet.end();
++apitr)
{
(*apitr)->resetAppliedUnifroms();
(*apitr)->resetAppliedUniforms();
}
_appliedProgramObjectSet.clear();

View File

@@ -935,7 +935,7 @@ Uniform* StateSet::getOrCreateUniform(const std::string& name, Uniform::Type typ
// no uniform found matching name so create it..
Uniform* uniform = new Uniform(name,type);
Uniform* uniform = new Uniform(type,name);
addUniform(uniform);
return uniform;

View File

@@ -11,7 +11,7 @@
*/
/* file: src/osg/Uniform.cpp
* author: Mike Weiblen 2005-04-21
* author: Mike Weiblen 2005-05-05
*/
#include <osg/Notify>
@@ -34,8 +34,8 @@ Uniform::Uniform() :
}
Uniform::Uniform( const std::string& name, Type type ) :
_name(name), _type(type),_modifiedCount(0)
Uniform::Uniform( Type type, const std::string& name ) :
_type(type), _name(name), _modifiedCount(0)
{
setDataVariance(STATIC);