From 7117ff4bd321bfd702ca85083a4cd1ddf9ab8360 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 29 Apr 2005 20:56:20 +0000 Subject: [PATCH] Added support for controlling the frequency of checking for OpenGL errors via: enum CheckForGLErrors { /** NEVER_CHECK_GL_ERRORS hints that OpenGL need not be checked for, this is the fastest option since checking for errors does incurr a small overhead.*/ NEVER_CHECK_GL_ERRORS, /** ONCE_PER_FRAME means that OpenGl errors will be checked for once per frame, the overhead is still small, but at least OpenGL errors that are occurring will be caught, the reporting isn't fine grained enough for debugging purposes.*/ ONCE_PER_FRAME, /** ONCE_PER_ATTRIBUTE means that OpenGL errors will be checked for after every attribute is applied, allow errors to be directly associated with particular operations which makes debugging much easier.*/ ONCE_PER_ATTRIBUTE }; /** Set whether and how often OpenGL errors should be checked for.*/ void setCheckForGLErrors(CheckForGLErrors check) { _checkGLErrors = check; } /** Get whether and how often OpenGL errors should be checked for.*/ CheckForGLErrors getCheckForGLErrors() const { return _checkGLErrors; } --- include/osg/State | 30 ++++++++++++++++++++++++------ src/osg/State.cpp | 10 +++++----- src/osgUtil/SceneView.cpp | 15 ++++++++++----- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/include/osg/State b/include/osg/State index 89bde2a73..26c59cbd8 100644 --- a/include/osg/State +++ b/include/osg/State @@ -708,8 +708,26 @@ class OSG_EXPORT State : public Referenced * if true steps should be taken to complete rendering early.*/ bool getAbortRendering() const { return _abortRenderingPtr!=0?(*_abortRenderingPtr):false; } - void setReportGLErrors(bool flag) { _reportGLErrors = flag; } - bool getReportGLErrors() const { return _reportGLErrors; } + enum CheckForGLErrors + { + /** NEVER_CHECK_GL_ERRORS hints that OpenGL need not be checked for, this + is the fastest option since checking for errors does incurr a small overhead.*/ + NEVER_CHECK_GL_ERRORS, + /** ONCE_PER_FRAME means that OpenGl errors will be checked for once per + frame, the overhead is still small, but at least OpenGL errors that are occurring + will be caught, the reporting isn't fine grained enough for debugging purposes.*/ + ONCE_PER_FRAME, + /** ONCE_PER_ATTRIBUTE means that OpenGL errors will be checked for after + every attribute is applied, allow errors to be directly associated with + particular operations which makes debugging much easier.*/ + ONCE_PER_ATTRIBUTE + }; + + /** Set whether and how often OpenGL errors should be checked for.*/ + void setCheckForGLErrors(CheckForGLErrors check) { _checkGLErrors = check; } + + /** Get whether and how often OpenGL errors should be checked for.*/ + CheckForGLErrors getCheckForGLErrors() const { return _checkGLErrors; } bool checkGLErrors(const char* str) const; bool checkGLErrors(StateAttribute::GLMode mode) const; @@ -732,7 +750,7 @@ class OSG_EXPORT State : public Referenced ref_ptr _displaySettings; bool* _abortRenderingPtr; - bool _reportGLErrors; + CheckForGLErrors _checkGLErrors; struct ModeStack { @@ -827,7 +845,7 @@ class OSG_EXPORT State : public Referenced if (enabled) glEnable(mode); else glDisable(mode); - if (_reportGLErrors) checkGLErrors(mode); + if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors(mode); return true; } @@ -846,7 +864,7 @@ class OSG_EXPORT State : public Referenced as.last_applied_attribute = attribute; attribute->apply(*this); - if (_reportGLErrors) checkGLErrors(attribute); + if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors(attribute); return true; } @@ -862,7 +880,7 @@ class OSG_EXPORT State : public Referenced if (as.global_default_attribute.valid()) { as.global_default_attribute->apply(*this); - if (_reportGLErrors) checkGLErrors(as.global_default_attribute.get()); + if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors(as.global_default_attribute.get()); } return true; } diff --git a/src/osg/State.cpp b/src/osg/State.cpp index 742f28006..2c11640a0 100644 --- a/src/osg/State.cpp +++ b/src/osg/State.cpp @@ -28,7 +28,7 @@ State::State() _modelView = _identity; _abortRenderingPtr = false; - _reportGLErrors = false; + _checkGLErrors = ONCE_PER_FRAME; _currentActiveTextureUnit=0; _currentClientActiveTextureUnit=0; @@ -247,7 +247,7 @@ void State::captureCurrentState(StateSet& stateset) const void State::apply(const StateSet* dstate) { - if (_reportGLErrors) checkGLErrors("start of State::apply(StateSet*)"); + if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors("start of State::apply(StateSet*)"); // equivilant to: //pushStateSet(dstate); @@ -312,13 +312,13 @@ void State::apply(const StateSet* dstate) apply(); } - if (_reportGLErrors) checkGLErrors("end of State::apply(StateSet*)"); + if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors("end of State::apply(StateSet*)"); } void State::apply() { - if (_reportGLErrors) checkGLErrors("start of State::apply()"); + if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors("start of State::apply()"); // go through all active OpenGL modes, enabling/disable where // appropriate. @@ -355,7 +355,7 @@ void State::apply() } } - if (_reportGLErrors) checkGLErrors("end of State::apply()"); + if (_checkGLErrors==ONCE_PER_ATTRIBUTE) checkGLErrors("end of State::apply()"); } void State::haveAppliedMode(StateAttribute::GLMode mode,StateAttribute::GLModeValue value) diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index 69b0439f1..40e25600b 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -938,12 +938,17 @@ void SceneView::draw() // re apply the defalt OGL state. _state->popAllStateSets(); - GLenum errorNo = glGetError(); - if (errorNo!=GL_NO_ERROR) + if (_state->getCheckForGLErrors()!=osg::State::NEVER_CHECK_GL_ERRORS) { - osg::notify(WARN)<<"Warning: detected OpenGL error '"<setReportGLErrors(true); + GLenum errorNo = glGetError(); + if (errorNo!=GL_NO_ERROR) + { + osg::notify(WARN)<<"Warning: detected OpenGL error '"<setCheckForGLErrors(osg::State::ONCE_PER_ATTRIBUTE); + } } }