diff --git a/include/osgUtil/GLObjectsVisitor b/include/osgUtil/GLObjectsVisitor index c52d6cce6..353bc3023 100644 --- a/include/osgUtil/GLObjectsVisitor +++ b/include/osgUtil/GLObjectsVisitor @@ -91,6 +91,12 @@ class OSGUTIL_EXPORT GLObjectsVisitor : public osg::NodeVisitor return _renderInfo; } + /** Set whether and how often OpenGL errors should be checked for, defaults to osg::State::ONCE_PER_ATTRIBUTE. */ + void setCheckForGLErrors(osg::State::CheckForGLErrors check) { _checkGLErrors = check; } + + /** Get whether and how often OpenGL errors should be checked for.*/ + osg::State::CheckForGLErrors getCheckForGLErrors() const { return _checkGLErrors; } + /** Simply traverse using standard NodeVisitor traverse method.*/ virtual void apply(osg::Node& node); @@ -105,11 +111,13 @@ class OSGUTIL_EXPORT GLObjectsVisitor : public osg::NodeVisitor typedef std::set DrawableAppliedSet; typedef std::set StatesSetAppliedSet; - Mode _mode; - osg::RenderInfo _renderInfo; - DrawableAppliedSet _drawablesAppliedSet; - StatesSetAppliedSet _stateSetAppliedSet; - osg::ref_ptr _lastCompiledProgram; + Mode _mode; + osg::RenderInfo _renderInfo; + osg::State::CheckForGLErrors _checkGLErrors; + + DrawableAppliedSet _drawablesAppliedSet; + StatesSetAppliedSet _stateSetAppliedSet; + osg::ref_ptr _lastCompiledProgram; }; diff --git a/src/osgUtil/GLObjectsVisitor.cpp b/src/osgUtil/GLObjectsVisitor.cpp index 25aa8c896..32acc58fa 100644 --- a/src/osgUtil/GLObjectsVisitor.cpp +++ b/src/osgUtil/GLObjectsVisitor.cpp @@ -28,7 +28,7 @@ GLObjectsVisitor::GLObjectsVisitor(Mode mode) setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); _mode = mode; - + _checkGLErrors = osg::State::ONCE_PER_ATTRIBUTE; } void GLObjectsVisitor::apply(osg::Node& node) @@ -57,8 +57,15 @@ void GLObjectsVisitor::apply(osg::Drawable& drawable) { if (_drawablesAppliedSet.count(&drawable)!=0) return; + if (_checkGLErrors==osg::State::ONCE_PER_ATTRIBUTE) _renderInfo.getState()->checkGLErrors("start of Drawable::apply(osg::Drawable& drawable)"); + _drawablesAppliedSet.insert(&drawable); + if (drawable.getStateSet()) + { + apply(*(drawable.getStateSet())); + } + if (_mode&SWITCH_OFF_DISPLAY_LISTS) { drawable.setUseDisplayList(false); @@ -82,30 +89,34 @@ void GLObjectsVisitor::apply(osg::Drawable& drawable) if (_mode&COMPILE_DISPLAY_LISTS && _renderInfo.getState() && (drawable.getUseDisplayList() || drawable.getUseVertexBufferObjects())) { + drawable.compileGLObjects(_renderInfo); + + if (_checkGLErrors==osg::State::ONCE_PER_ATTRIBUTE) _renderInfo.getState()->checkGLErrors("after drawable.compileGLObjects() call in Drawable::apply(osg::Drawable& drawable) "); } + if (_mode&RELEASE_DISPLAY_LISTS) { drawable.releaseGLObjects(_renderInfo.getState()); } - - if (drawable.getStateSet()) - { - apply(*(drawable.getStateSet())); - } } void GLObjectsVisitor::apply(osg::StateSet& stateset) { if (_stateSetAppliedSet.count(&stateset)!=0) return; + if (_checkGLErrors==osg::State::ONCE_PER_ATTRIBUTE) _renderInfo.getState()->checkGLErrors("start of GLObjectsVisitor::apply(osg::StateSet& stateset)"); + _stateSetAppliedSet.insert(&stateset); if (_mode & COMPILE_STATE_ATTRIBUTES && _renderInfo.getState()) { + stateset.compileGLObjects(*_renderInfo.getState()); + if (_checkGLErrors==osg::State::ONCE_PER_ATTRIBUTE) _renderInfo.getState()->checkGLErrors("after stateset.compileGLObjects in GLObjectsVisitor::apply(osg::StateSet& stateset)"); + osg::Program* program = dynamic_cast(stateset.getAttribute(osg::StateAttribute::PROGRAM)); if (program) { if( program->isFixedFunction() ) @@ -129,6 +140,8 @@ void GLObjectsVisitor::apply(osg::StateSet& stateset) ++itr) { pcp->apply(*(itr->second.first)); + + if (_checkGLErrors==osg::State::ONCE_PER_ATTRIBUTE) _renderInfo.getState()->checkGLErrors(std::string("after pcp->apply(Unfiorm&) in GLObjectsVisitor::apply(osg::StateSet& stateset), unifrom name: ")+(itr->second.first)->getName()); } } } @@ -151,6 +164,8 @@ void GLObjectsVisitor::apply(osg::StateSet& stateset) { stateset.checkValidityOfAssociatedModes(*_renderInfo.getState()); } + + if (_checkGLErrors==osg::State::ONCE_PER_ATTRIBUTE) _renderInfo.getState()->checkGLErrors("after GLObjectsVisitor::apply(osg::StateSet& stateset)"); } void GLObjectsVisitor::compile(osg::Node& node) @@ -166,6 +181,8 @@ void GLObjectsVisitor::compile(osg::Node& node) extensions->glUseProgram(0); _renderInfo.getState()->setLastAppliedProgramObject(0); } + + if (_checkGLErrors!=osg::State::NEVER_CHECK_GL_ERRORS) _renderInfo.getState()->checkGLErrors("after GLObjectsVisitor::compile(osg::Node& node)"); } }