From 4d556c0ec4d8b6ac01ccc876704e5feb4583fd1a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 2 Aug 2006 15:41:47 +0000 Subject: [PATCH] Reworked the TextureObjectManager singleton so that it no longer reconstructed itself once deleted, and added checks to against a null manager to prevent calling code crashing. --- src/osg/Texture.cpp | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/osg/Texture.cpp b/src/osg/Texture.cpp index da3d17f34..69acd8aaa 100644 --- a/src/osg/Texture.cpp +++ b/src/osg/Texture.cpp @@ -65,7 +65,15 @@ class TextureObjectManager : public osg::Referenced public: TextureObjectManager(): - _expiryDelay(0.0) {} + _expiryDelay(0.0) + { + // printf("Constructing TextureObjectManager\n"); + } + + ~TextureObjectManager() + { + // printf("Destructing TextureObjectManager\n"); + } virtual Texture::TextureObject* generateTextureObject(unsigned int contextID,GLenum target); @@ -279,15 +287,15 @@ void TextureObjectManager::flushTextureObjects(unsigned int contextID,double cur static TextureObjectManager* getTextureObjectManager() { - static ref_ptr s_textureObjectManager; - if (!s_textureObjectManager) s_textureObjectManager = new TextureObjectManager; + static ref_ptr s_textureObjectManager = new TextureObjectManager; return s_textureObjectManager.get(); } Texture::TextureObject* Texture::generateTextureObject(unsigned int contextID,GLenum target) { - return getTextureObjectManager()->generateTextureObject(contextID,target); + if (getTextureObjectManager()) return getTextureObjectManager()->generateTextureObject(contextID,target); + else return 0; } Texture::TextureObject* Texture::generateTextureObject(unsigned int contextID, @@ -299,7 +307,8 @@ Texture::TextureObject* Texture::generateTextureObject(unsigned int contextID, GLsizei depth, GLint border) { - return getTextureObjectManager()->reuseOrGenerateTextureObject(contextID, + if (getTextureObjectManager()) + return getTextureObjectManager()->reuseOrGenerateTextureObject(contextID, target, numMipmapLevels, internalFormat, @@ -307,16 +316,18 @@ Texture::TextureObject* Texture::generateTextureObject(unsigned int contextID, height, depth, border); + else + return 0; } void Texture::flushAllDeletedTextureObjects(unsigned int contextID) { - getTextureObjectManager()->flushAllTextureObjects(contextID); + if (getTextureObjectManager()) getTextureObjectManager()->flushAllTextureObjects(contextID); } void Texture::flushDeletedTextureObjects(unsigned int contextID,double currentTime, double& availbleTime) { - getTextureObjectManager()->flushTextureObjects(contextID, currentTime, availbleTime); + if (getTextureObjectManager()) getTextureObjectManager()->flushTextureObjects(contextID, currentTime, availbleTime); } Texture::Texture(): @@ -465,7 +476,7 @@ void Texture::setMaxAnisotropy(float anis) /** Force a recompile on next apply() of associated OpenGL texture objects.*/ void Texture::dirtyTextureObject() { - getTextureObjectManager()->addTextureObjectsFrom(*this); + if (getTextureObjectManager()) getTextureObjectManager()->addTextureObjectsFrom(*this); } void Texture::takeTextureObjects(Texture::TextureObjectListMap& toblm) @@ -1279,7 +1290,7 @@ void Texture::releaseGLObjects(State* state) const else { unsigned int contextID = state->getContextID(); - if (_textureObjectBuffer[contextID].valid()) + if (_textureObjectBuffer[contextID].valid() && getTextureObjectManager()) { OpenThreads::ScopedLock lock(getTextureObjectManager()->_mutex);