From 53ee0ce3ec53d2aa9bf8f2bd502c8ef8ad3a8f65 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 8 Dec 2005 10:06:57 +0000 Subject: [PATCH] Added CameraNode::releaseGLObejcts() to help in clean up, and changed the ordering in SceneView::flushDeleteGLObjects() so that fbo's are deleted before any texture objects they use are deleted. --- include/osg/CameraNode | 5 +++++ src/osg/CameraNode.cpp | 8 ++++++++ src/osgProducer/OsgCameraGroup.cpp | 1 + src/osgUtil/SceneView.cpp | 9 +++++---- src/osgWrappers/osg/CameraNode.cpp | 2 ++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/include/osg/CameraNode b/include/osg/CameraNode index c6ea1104c..8c8903019 100644 --- a/include/osg/CameraNode +++ b/include/osg/CameraNode @@ -309,6 +309,11 @@ class OSG_EXPORT CameraNode : public Transform, public CullSettings OpenThreads::Mutex* getDataChangeMutex() const { return &_dataChangeMutex; } + /** If State is non-zero, this function releases any associated OpenGL objects for + * the specified graphics context. Otherwise, releases OpenGL objexts + * for all graphics contexts. */ + virtual void releaseGLObjects(osg::State* = 0) const; + public: /** Transform method that must be defined to provide generic interface for scene graph traversals.*/ diff --git a/src/osg/CameraNode.cpp b/src/osg/CameraNode.cpp index 77872fa24..e69dbb147 100644 --- a/src/osg/CameraNode.cpp +++ b/src/osg/CameraNode.cpp @@ -223,6 +223,14 @@ void CameraNode::detach(BufferComponent buffer) _bufferAttachmentMap.erase(buffer); } +void CameraNode::releaseGLObjects(osg::State* state) const +{ + if (state) const_cast(this)->_renderingCache[state->getContextID()] = 0; + else const_cast(this)->_renderingCache.setAllElementsTo(0); + + Transform::releaseGLObjects(state); +} + bool CameraNode::computeLocalToWorldMatrix(Matrix& matrix,NodeVisitor*) const { diff --git a/src/osgProducer/OsgCameraGroup.cpp b/src/osgProducer/OsgCameraGroup.cpp index fe6e21d47..732ce7fdd 100644 --- a/src/osgProducer/OsgCameraGroup.cpp +++ b/src/osgProducer/OsgCameraGroup.cpp @@ -741,6 +741,7 @@ void OsgCameraGroup::cleanup_frame() ++itr) { (*itr)->getSceneView()->releaseAllGLObjects(); + (*itr)->getSceneView()->setRenderStage(0); (*itr)->setCleanUpOnNextFrame(true); } diff --git a/src/osgUtil/SceneView.cpp b/src/osgUtil/SceneView.cpp index f9715829c..16c164048 100644 --- a/src/osgUtil/SceneView.cpp +++ b/src/osgUtil/SceneView.cpp @@ -746,6 +746,8 @@ void SceneView::flushAllDeletedGLObjects() double availableTime = 100.0f; double currentTime = _state->getFrameStamp()?_state->getFrameStamp()->getReferenceTime():0.0; + osg::FrameBufferObject::flushDeletedFrameBufferObjects(_state->getContextID(),currentTime,availableTime); + osg::RenderBuffer::flushDeletedRenderBuffers(_state->getContextID(),currentTime,availableTime); osg::Texture::flushAllDeletedTextureObjects(_state->getContextID()); osg::Drawable::flushAllDeletedDisplayLists(_state->getContextID()); osg::Drawable::flushDeletedVertexBufferObjects(_state->getContextID(),currentTime,availableTime); @@ -753,8 +755,6 @@ void SceneView::flushAllDeletedGLObjects() osg::FragmentProgram::flushDeletedFragmentProgramObjects(_state->getContextID(),currentTime,availableTime); osg::Program::flushDeletedGlPrograms(_state->getContextID(),currentTime,availableTime); osg::Shader::flushDeletedGlShaders(_state->getContextID(),currentTime,availableTime); - osg::RenderBuffer::flushDeletedRenderBuffers(_state->getContextID(),currentTime,availableTime); - osg::FrameBufferObject::flushDeletedFrameBufferObjects(_state->getContextID(),currentTime,availableTime); } void SceneView::flushDeletedGLObjects(double& availableTime) @@ -762,6 +762,9 @@ void SceneView::flushDeletedGLObjects(double& availableTime) _requiresFlush = false; double currentTime = _state->getFrameStamp()?_state->getFrameStamp()->getReferenceTime():0.0; + + osg::FrameBufferObject::flushDeletedFrameBufferObjects(_state->getContextID(),currentTime,availableTime); + osg::RenderBuffer::flushDeletedRenderBuffers(_state->getContextID(),currentTime,availableTime); osg::Texture::flushDeletedTextureObjects(_state->getContextID(),currentTime,availableTime); osg::Drawable::flushDeletedDisplayLists(_state->getContextID(),availableTime); osg::Drawable::flushDeletedVertexBufferObjects(_state->getContextID(),currentTime,availableTime); @@ -769,8 +772,6 @@ void SceneView::flushDeletedGLObjects(double& availableTime) osg::FragmentProgram::flushDeletedFragmentProgramObjects(_state->getContextID(),currentTime,availableTime); osg::Program::flushDeletedGlPrograms(_state->getContextID(),currentTime,availableTime); osg::Shader::flushDeletedGlShaders(_state->getContextID(),currentTime,availableTime); - osg::RenderBuffer::flushDeletedRenderBuffers(_state->getContextID(),currentTime,availableTime); - osg::FrameBufferObject::flushDeletedFrameBufferObjects(_state->getContextID(),currentTime,availableTime); } void SceneView::draw() diff --git a/src/osgWrappers/osg/CameraNode.cpp b/src/osgWrappers/osg/CameraNode.cpp index b9fd38532..2f9f01d08 100644 --- a/src/osgWrappers/osg/CameraNode.cpp +++ b/src/osgWrappers/osg/CameraNode.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -137,6 +138,7 @@ BEGIN_OBJECT_REFLECTOR(osg::CameraNode) I_Method0(osg::CameraNode::DrawCallback *, getPostDrawCallback); I_Method0(const osg::CameraNode::DrawCallback *, getPostDrawCallback); I_Method0(OpenThreads::Mutex *, getDataChangeMutex); + I_MethodWithDefaults1(void, releaseGLObjects, IN, osg::State *, x, 0); I_Method2(bool, computeLocalToWorldMatrix, IN, osg::Matrix &, matrix, IN, osg::NodeVisitor *, x); I_Method2(bool, computeWorldToLocalMatrix, IN, osg::Matrix &, matrix, IN, osg::NodeVisitor *, x); I_ReadOnlyProperty(osg::CameraNode::BufferAttachmentMap &, BufferAttachmentMap);