OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Program.h
Go to the documentation of this file.
1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2  * Copyright (C) 2003-2005 3Dlabs Inc. Ltd.
3  * Copyright (C) 2004-2005 Nathan Cournia
4  * Copyright (C) 2008 Zebra Imaging
5  * Copyright (C) 2010 Vires Simulationstechnologie GmbH
6  *
7  * This application is open source and may be redistributed and/or modified
8  * freely and without restriction, both in commercial and non commercial
9  * applications, as long as this copyright notice is maintained.
10  *
11  * This application is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 */
15 
16 /* file: include/osg/Program
17  * author: Mike Weiblen 2008-01-02
18  * Holger Helmich 2010-10-21
19 */
20 
21 #ifndef OSG_PROGRAM
22 #define OSG_PROGRAM 1
23 
24 #include <string>
25 #include <vector>
26 #include <map>
27 
28 #include <osg/buffered_value>
29 #include <osg/ref_ptr>
30 #include <osg/Uniform>
31 #include <osg/Shader>
32 #include <osg/StateAttribute>
33 
34 namespace osg {
35 
36 class State;
37 
38 
40 
52 {
53  public:
54  Program();
55 
57  Program(const Program& rhs, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
58 
59  META_StateAttribute(osg, Program, PROGRAM);
60 
62  virtual int compare(const osg::StateAttribute& sa) const;
63 
66  virtual void apply(osg::State& state) const;
67 
69  virtual void setThreadSafeRefUnref(bool threadSafe);
70 
72  virtual void compileGLObjects(osg::State& state) const;
73 
75  virtual void resizeGLObjectBuffers(unsigned int maxSize);
76 
80  virtual void releaseGLObjects(osg::State* state=0) const;
81 
83  void dirtyProgram();
84 
87  bool addShader( Shader* shader );
88 
89  unsigned int getNumShaders() const { return static_cast<unsigned int>(_shaderList.size()); }
90 
91  Shader* getShader( unsigned int i ) { return _shaderList[i].get(); }
92  const Shader* getShader( unsigned int i ) const { return _shaderList[i].get(); }
93 
96  bool removeShader( Shader* shader );
97 
99  void setParameter( GLenum pname, GLint value );
100  GLint getParameter( GLenum pname ) const;
101 
103  void setComputeGroups( GLint numGroupsX, GLint numGroupsY, GLint numGroupsZ );
104  void getComputeGroups( GLint& numGroupsX, GLint& numGroupsY, GLint& numGroupsZ ) const;
105 
107  void addBindAttribLocation( const std::string& name, GLuint index );
108 
110  void removeBindAttribLocation( const std::string& name );
111 
113  void addBindFragDataLocation( const std::string& name, GLuint index );
114 
116  void removeBindFragDataLocation( const std::string& name );
117 
122  void addBindUniformBlock(const std::string& name, GLuint index);
123 
125  void removeBindUniformBlock(const std::string& name);
126 
128  void removeTransformFeedBackVarying(const std::string& name)
129  {
130  for(std::vector<std::string>::iterator i=_feedbackout.begin(); i!=_feedbackout.end(); i++)
131  {
132  if (*i == name) {_feedbackout.erase(i);break; }
133  }
134  }
135 
137  void addTransformFeedBackVarying(const std::string& outname)
138  {
139  _feedbackout.push_back(outname);
140  }
141 
143  inline unsigned int getNumTransformFeedBackVaryings() const { return _feedbackout.size(); }
144 
146  inline const std::string& getTransformFeedBackVarying(unsigned int i) const { return _feedbackout[i]; }
147 
149  void setTransformFeedBackMode(GLenum e) {_feedbackmode=e;}
150 
152  GLenum getTransformFeedBackMode() const {return _feedbackmode;}
153 
155  void setShaderDefines(const ShaderDefines& shaderDefs) { _shaderDefines = shaderDefs; }
156  ShaderDefines& getShaderDefines() { return _shaderDefines; }
157  const ShaderDefines& getShaderDefines() const { return _shaderDefines; }
158 
159 
160 
169  {
170  public:
171 
172  ProgramBinary();
173 
176 
178 
180  void allocate(unsigned int size);
181 
183  void assign(unsigned int size, const unsigned char* data);
184 
186  void setFormat(GLenum format) {_format = format;}
187 
189  GLenum getFormat() const {return _format;}
190 
192  unsigned int getSize() const { return static_cast<unsigned int>(_data.size()); }
193 
195  unsigned char* getData() { return _data.empty() ? 0 : &(_data.front()); }
196 
198  const unsigned char* getData() const { return _data.empty() ? 0 : &(_data.front()); }
199 
200  protected:
201  std::vector<unsigned char> _data;
202  GLenum _format;
203  };
204 
205 
209  void setProgramBinary(ProgramBinary* programBinary) { _programBinary = programBinary; }
210 
212  ProgramBinary* getProgramBinary() { return _programBinary.get(); }
213 
215  const ProgramBinary* getProgramBinary() const { return _programBinary.get(); }
216 
217  typedef std::map<std::string,GLuint> AttribBindingList;
218  typedef std::map<std::string,GLuint> FragDataBindingList;
219  typedef std::map<std::string,GLuint> UniformBlockBindingList;
220 
221  const AttribBindingList& getAttribBindingList() const { return _attribBindingList; }
222  const FragDataBindingList& getFragDataBindingList() const { return _fragDataBindingList; }
223  const UniformBlockBindingList& getUniformBlockBindingList() const { return _uniformBlockBindingList; }
224 
226  bool isFixedFunction() const;
227 
229  bool getGlProgramInfoLog(unsigned int contextID, std::string& log) const;
230 
234  static void deleteGlProgram(unsigned int contextID, GLuint program);
235 
238  static void flushDeletedGlPrograms(unsigned int contextID,double currentTime, double& availableTime);
239 
244  static void discardDeletedGlPrograms(unsigned int contextID);
245 
246  struct ActiveVarInfo {
247  ActiveVarInfo() : _location(-1), _type(Uniform::UNDEFINED), _size(-1) {}
248  ActiveVarInfo( GLint loc, GLenum type, GLint size ) : _location(loc), _type(type), _size(size) {}
249  GLint _location;
250  GLenum _type;
251  GLint _size;
252  };
253  typedef std::map< unsigned int, ActiveVarInfo > ActiveUniformMap;
254  typedef std::map< std::string, ActiveVarInfo > ActiveVarInfoMap;
255  //const ActiveUniformMap& getActiveUniforms(unsigned int contextID) const;
256  //const ActiveVarInfoMap& getActiveAttribs(unsigned int contextID) const;
258  {
259  UniformBlockInfo() : _index(GL_INVALID_INDEX), _size(0) {}
260  UniformBlockInfo(GLuint index, GLsizei size)
261  : _index(index), _size(size)
262  {
263  }
264  GLuint _index;
265  GLsizei _size;
266  };
267  typedef std::map<std::string, UniformBlockInfo> UniformBlockMap;
268 
269  //const UniformBlockMap& getUniformBlocks(unsigned contextID) const;
270  public:
271 
272  // make PerContextProgram a friend to allow it access Program's protected
273  // methods and member variables.
275  friend class PerContextProgram;
276 
279  {
280  public:
282  PerContextProgram(const Program* program, unsigned int contextID, GLuint programHandle=0);
283 
284  GLuint getHandle() const {return _glProgramHandle;}
285 
286  const osg::Program* getProgram() const { return _program; }
287 
288  void setDefineString(const std::string& defStr) { _defineStr = defStr; }
289  const std::string& getDefineString() const { return _defineStr; }
290 
291  void requestLink();
292  virtual void linkProgram(osg::State& state);
293  virtual bool validateProgram();
294  bool needsLink() const {return _needsLink;}
295  bool isLinked() const {return _isLinked;}
296  virtual bool getInfoLog( std::string& infoLog ) const;
297 
299  bool loadedBinary() const {return _loadedBinary;}
300 
307  virtual ProgramBinary* compileProgramBinary(osg::State& state);
308 
309  virtual void useProgram() const;
310 
311  void resetAppliedUniforms() const
312  {
313  _lastAppliedUniformList.clear();
314  }
315 
316 
317  inline void apply(const Uniform& uniform) const
318  {
319  GLint location = getUniformLocation(uniform.getNameID());
320  if (location>=0)
321  {
322  const Uniform* lastAppliedUniform = _lastAppliedUniformList[location].first.get();
323  if (lastAppliedUniform != &uniform)
324  {
325  // new attribute
326  uniform.apply(_extensions.get(),location);
327  _lastAppliedUniformList[location].first = &uniform;
328  _lastAppliedUniformList[location].second = uniform.getModifiedCount();
329  }
330  else if (_lastAppliedUniformList[location].second != uniform.getModifiedCount())
331  {
332  // existing attribute has been modified
333  uniform.apply(_extensions.get(),location);
334  _lastAppliedUniformList[location].first = &uniform;
335  _lastAppliedUniformList[location].second = uniform.getModifiedCount();
336  }
337  }
338  }
339 
340  const ActiveUniformMap& getActiveUniforms() const {return _uniformInfoMap;}
341  const ActiveVarInfoMap& getActiveAttribs() const {return _attribInfoMap;}
342  const UniformBlockMap& getUniformBlocks() const {return _uniformBlockMap; }
343  inline GLint getUniformLocation( unsigned int uniformNameID ) const { ActiveUniformMap::const_iterator itr = _uniformInfoMap.find(uniformNameID); return (itr!=_uniformInfoMap.end()) ? itr->second._location : -1; }
344 
353  inline GLint getUniformLocation( const std::string & uniformName ) const { return getUniformLocation( Uniform::getNameID( uniformName ) ); }
354 
355  inline GLint getAttribLocation( const std::string& name ) const { ActiveVarInfoMap::const_iterator itr = _attribInfoMap.find(name); return (itr!=_attribInfoMap.end()) ? itr->second._location : -1; }
356 
357  inline void addShaderToAttach(Shader *shader)
358  {
359  _shadersToAttach.push_back(shader);
360  }
361 
362  inline void addShaderToDetach(Shader *shader)
363  {
364  _shadersToDetach.push_back(shader);
365  }
366 
367  protected: /*methods*/
368  virtual ~PerContextProgram();
369 
370  protected: /*data*/
375 
378 
380  std::string _defineStr;
381 
385  bool _isLinked;
388 
389  const unsigned int _contextID;
390 
393 
394  ActiveUniformMap _uniformInfoMap;
395  ActiveVarInfoMap _attribInfoMap;
396  UniformBlockMap _uniformBlockMap;
397 
398  typedef std::pair<osg::ref_ptr<const osg::Uniform>, unsigned int> UniformModifiedCountPair;
399  typedef std::map<unsigned int, UniformModifiedCountPair> LastAppliedUniformList;
400  mutable LastAppliedUniformList _lastAppliedUniformList;
401 
402  typedef std::vector< ref_ptr<Shader> > ShaderList;
403  ShaderList _shadersToDetach;
404  ShaderList _shadersToAttach;
405 
406  private:
407  PerContextProgram(); // disallowed
408  PerContextProgram(const PerContextProgram&); // disallowed
409  PerContextProgram& operator=(const PerContextProgram&); // disallowed
410  };
411 
413  {
414  typedef std::vector< osg::ref_ptr<PerContextProgram> > PerContextPrograms;
415 
416  ProgramObjects(const Program* program, unsigned int contextID);
417 
418  unsigned int _contextID;
420  mutable PerContextPrograms _perContextPrograms;
421 
422  PerContextProgram* getPCP(const std::string& defineStr) const;
423  PerContextProgram* createPerContextProgram(const std::string& defineStr);
424  void requestLink();
425  void addShaderToAttach(Shader* shader);
426  void addShaderToDetach(Shader* shader);
427  bool getGlProgramInfoLog(std::string& log) const;
428  };
429 
431  PerContextProgram* getPCP(State& state) const;
432 
433  protected: /*methods*/
434  virtual ~Program();
435 
436  protected: /*data*/
437 
439  AttribBindingList _attribBindingList;
440  FragDataBindingList _fragDataBindingList;
441  UniformBlockBindingList _uniformBlockBindingList;
442 
443  typedef std::vector< ref_ptr<Shader> > ShaderList;
444  ShaderList _shaderList;
445 
447 
452 
453 
455  GLint _numGroupsX;
456  GLint _numGroupsY;
457  GLint _numGroupsZ;
458 
461  std::vector<std::string> _feedbackout;
462 
464 
465 
466  private:
467  Program& operator=(const Program&); // disallowed
468 
469 };
470 
471 }
472 
473 #endif
ShaderList _shaderList
Definition: Program.h:444
#define OSG_EXPORT
Definition: Export.h:43
ShaderDefines & getShaderDefines()
Definition: Program.h:156
void apply(const Uniform &uniform) const
Definition: Program.h:317
PerContextPrograms _perContextPrograms
Definition: Program.h:420
std::vector< ref_ptr< Shader > > ShaderList
Definition: Program.h:443
unsigned int getNumTransformFeedBackVaryings() const
Definition: Program.h:143
GLint getAttribLocation(const std::string &name) const
Definition: Program.h:355
GLint _numGroupsX
Definition: Program.h:455
const Program * _program
Definition: Program.h:419
std::vector< unsigned char > _data
Definition: Program.h:201
const ShaderDefines & getShaderDefines() const
Definition: Program.h:157
std::map< std::string, ActiveVarInfo > ActiveVarInfoMap
Definition: Program.h:254
osg::buffered_value< osg::ref_ptr< ProgramObjects > > _pcpList
Definition: Program.h:438
std::vector< osg::ref_ptr< PerContextProgram > > PerContextPrograms
Definition: Program.h:414
const Shader * getShader(unsigned int i) const
Definition: Program.h:92
ActiveVarInfo(GLint loc, GLenum type, GLint size)
Definition: Program.h:248
const ActiveUniformMap & getActiveUniforms() const
Definition: Program.h:340
std::set< std::string > ShaderDefines
Definition: Shader.h:34
const std::string & getTransformFeedBackVarying(unsigned int i) const
Definition: Program.h:146
void setDefineString(const std::string &defStr)
Definition: Program.h:288
const UniformBlockMap & getUniformBlocks() const
Definition: Program.h:342
GLint _geometryOutputType
Definition: Program.h:451
const ActiveVarInfoMap & getActiveAttribs() const
Definition: Program.h:341
LastAppliedUniformList _lastAppliedUniformList
Definition: Program.h:400
void resetAppliedUniforms() const
Definition: Program.h:311
FragDataBindingList _fragDataBindingList
Definition: Program.h:440
unsigned int getSize() const
Definition: Program.h:192
UniformBlockInfo(GLuint index, GLsizei size)
Definition: Program.h:260
std::map< unsigned int, UniformModifiedCountPair > LastAppliedUniformList
Definition: Program.h:399
osg::ref_ptr< GLExtensions > _extensions
Definition: Program.h:374
unsigned int getModifiedCount() const
Definition: Uniform.h:887
void setShaderDefines(const ShaderDefines &shaderDefs)
Definition: Program.h:155
#define META_Object(library, name)
Definition: Object.h:42
ProgramBinary * getProgramBinary()
Definition: Program.h:212
std::map< std::string, UniformBlockInfo > UniformBlockMap
Definition: Program.h:267
void setProgramBinary(ProgramBinary *programBinary)
Definition: Program.h:209
GLint _geometryVerticesOut
Definition: Program.h:449
ActiveVarInfoMap _attribInfoMap
Definition: Program.h:395
void addShaderToAttach(Shader *shader)
Definition: Program.h:357
ActiveUniformMap _uniformInfoMap
Definition: Program.h:394
ShaderDefines _shaderDefines
Definition: Program.h:463
const ProgramBinary * getProgramBinary() const
Definition: Program.h:215
GLint getUniformLocation(unsigned int uniformNameID) const
Definition: Program.h:343
#define GL_INVALID_INDEX
Definition: GLDefines.h:318
std::vector< std::string > _feedbackout
Definition: Program.h:461
osg::ref_ptr< ProgramBinary > _programBinary
Definition: Program.h:446
void removeTransformFeedBackVarying(const std::string &name)
Definition: Program.h:128
void apply(const GLExtensions *ext, GLint location) const
UniformBlockMap _uniformBlockMap
Definition: Program.h:396
const UniformBlockBindingList & getUniformBlockBindingList() const
Definition: Program.h:223
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
Definition: GLU.h:71
#define META_StateAttribute(library, name, type)
void setFormat(GLenum format)
Definition: Program.h:186
bool get(float &f) const
Shader * getShader(unsigned int i)
Definition: Program.h:91
UniformBlockBindingList _uniformBlockBindingList
Definition: Program.h:441
const std::string & getDefineString() const
Definition: Program.h:289
unsigned int getNumShaders() const
Definition: Program.h:89
static unsigned int getNameID(const std::string &name)
std::pair< osg::ref_ptr< const osg::Uniform >, unsigned int > UniformModifiedCountPair
Definition: Program.h:398
std::map< std::string, GLuint > AttribBindingList
Definition: Program.h:217
void addTransformFeedBackVarying(const std::string &outname)
Definition: Program.h:137
const unsigned char * getData() const
Definition: Program.h:198
unsigned int getNameID() const
Definition: AlphaFunc.h:19
GLint _numGroupsZ
Definition: Program.h:457
void addShaderToDetach(Shader *shader)
Definition: Program.h:362
GLuint getHandle() const
Definition: Program.h:284
GLenum getTransformFeedBackMode() const
Definition: Program.h:152
const FragDataBindingList & getFragDataBindingList() const
Definition: Program.h:222
GLint getUniformLocation(const std::string &uniformName) const
Definition: Program.h:353
const AttribBindingList & getAttribBindingList() const
Definition: Program.h:221
GLenum _feedbackmode
Definition: Program.h:460
void setTransformFeedBackMode(GLenum e)
Definition: Program.h:149
const osg::Program * getProgram() const
Definition: Program.h:286
std::map< std::string, GLuint > FragDataBindingList
Definition: Program.h:218
GLint _numGroupsY
Definition: Program.h:456
AttribBindingList _attribBindingList
Definition: Program.h:439
const unsigned int _contextID
Definition: Program.h:389
GLenum getFormat() const
Definition: Program.h:189
unsigned char * getData()
Definition: Program.h:195
std::vector< ref_ptr< Shader > > ShaderList
Definition: Program.h:402
std::map< std::string, GLuint > UniformBlockBindingList
Definition: Program.h:219
GLint _geometryInputType
Definition: Program.h:450
const Program * _program
Definition: Program.h:372
std::map< unsigned int, ActiveVarInfo > ActiveUniformMap
Definition: Program.h:253
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum format
Definition: GLU.h:71