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.

This commit is contained in:
Robert Osfield
2006-08-02 15:41:47 +00:00
parent cdaca0ebdf
commit 4d556c0ec4

View File

@@ -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<TextureObjectManager> s_textureObjectManager;
if (!s_textureObjectManager) s_textureObjectManager = new TextureObjectManager;
static ref_ptr<TextureObjectManager> 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<OpenThreads::Mutex> lock(getTextureObjectManager()->_mutex);