From 850034ab7512fc215653052e5070528e0dd827d6 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 16 Jul 2008 13:23:58 +0000 Subject: [PATCH] Moved the _textureObjectBuffer assignment to after the imagery has been download to avoid crashes under multi-threaded compile of texture objects (was causing a crash with 3D Textures, but is something that would happen with other Texture types as well.) --- src/osg/Texture1D.cpp | 4 +++- src/osg/Texture2D.cpp | 3 ++- src/osg/Texture2DArray.cpp | 4 +++- src/osg/Texture3D.cpp | 4 +++- src/osg/TextureCubeMap.cpp | 4 +++- src/osg/TextureRectangle.cpp | 4 +++- 6 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/osg/Texture1D.cpp b/src/osg/Texture1D.cpp index 8cbdf6c73..99bd15364 100644 --- a/src/osg/Texture1D.cpp +++ b/src/osg/Texture1D.cpp @@ -150,7 +150,7 @@ void Texture1D::apply(State& state) const { // we don't have a applyTexImage1D_subload yet so can't reuse.. so just generate a new texture object. - _textureObjectBuffer[contextID] = textureObject = generateTextureObject(contextID,GL_TEXTURE_1D); + textureObject = generateTextureObject(contextID,GL_TEXTURE_1D); textureObject->bind(); @@ -163,6 +163,8 @@ void Texture1D::apply(State& state) const // update the modified count to show that it is upto date. getModifiedCount(contextID) = _image->getModifiedCount(); + _textureObjectBuffer[contextID] = textureObject; + if (_unrefImageDataAfterApply && areAllTextureObjectsLoaded() && _image->getDataVariance()==STATIC) { Texture1D* non_const_this = const_cast(this); diff --git a/src/osg/Texture2D.cpp b/src/osg/Texture2D.cpp index 1f8bd22db..96e828704 100644 --- a/src/osg/Texture2D.cpp +++ b/src/osg/Texture2D.cpp @@ -184,7 +184,7 @@ void Texture2D::apply(State& state) const computeRequiredTextureDimensions(state,*image,_textureWidth, _textureHeight, _numMipmapLevels); - _textureObjectBuffer[contextID] = textureObject = generateTextureObject( + textureObject = generateTextureObject( contextID,GL_TEXTURE_2D,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,1,0); textureObject->bind(); @@ -210,6 +210,7 @@ void Texture2D::apply(State& state) const // update the modified tag to show that it is upto date. getModifiedCount(contextID) = image->getModifiedCount(); + _textureObjectBuffer[contextID] = textureObject; if (_unrefImageDataAfterApply && areAllTextureObjectsLoaded() && image->getDataVariance()==STATIC) { diff --git a/src/osg/Texture2DArray.cpp b/src/osg/Texture2DArray.cpp index 3c7e9f298..58d18c1a6 100644 --- a/src/osg/Texture2DArray.cpp +++ b/src/osg/Texture2DArray.cpp @@ -242,7 +242,7 @@ void Texture2DArray::apply(State& state) const computeRequiredTextureDimensions(state,*_images[0],_textureWidth, _textureHeight, _numMipmapLevels); // create texture object - _textureObjectBuffer[contextID] = textureObject = generateTextureObject( + textureObject = generateTextureObject( contextID,GL_TEXTURE_2D_ARRAY_EXT,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,_textureDepth,0); // bind texture @@ -271,6 +271,8 @@ void Texture2DArray::apply(State& state) const } textureObject->setAllocated(_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,_textureDepth,0); + _textureObjectBuffer[contextID] = textureObject; + // no idea what this for ;-) if (_unrefImageDataAfterApply && areAllTextureObjectsLoaded()) { diff --git a/src/osg/Texture3D.cpp b/src/osg/Texture3D.cpp index b5c2e7c20..78060c4b4 100644 --- a/src/osg/Texture3D.cpp +++ b/src/osg/Texture3D.cpp @@ -231,7 +231,7 @@ void Texture3D::apply(State& state) const // compute the dimensions of the texture. computeRequiredTextureDimensions(state,*_image,_textureWidth, _textureHeight, _textureDepth,_numMipmapLevels); - _textureObjectBuffer[contextID] = textureObject = generateTextureObject(contextID,GL_TEXTURE_3D); + textureObject = generateTextureObject(contextID,GL_TEXTURE_3D); textureObject->bind(); @@ -245,6 +245,8 @@ void Texture3D::apply(State& state) const // update the modified count to show that it is upto date. getModifiedCount(contextID) = _image->getModifiedCount(); + _textureObjectBuffer[contextID] = textureObject; + if (_unrefImageDataAfterApply && areAllTextureObjectsLoaded() && _image->getDataVariance()==STATIC) { Texture3D* non_const_this = const_cast(this); diff --git a/src/osg/TextureCubeMap.cpp b/src/osg/TextureCubeMap.cpp index 0e5d70ed1..dbb9059ad 100644 --- a/src/osg/TextureCubeMap.cpp +++ b/src/osg/TextureCubeMap.cpp @@ -227,7 +227,7 @@ void TextureCubeMap::apply(State& state) const _textureWidth = _textureHeight = minimum( _textureWidth , _textureHeight ); } - _textureObjectBuffer[contextID] = textureObject = generateTextureObject( + textureObject = generateTextureObject( contextID,GL_TEXTURE_CUBE_MAP,_numMipmapLevels,_internalFormat,_textureWidth,_textureHeight,1,0); textureObject->bind(); @@ -253,6 +253,8 @@ void TextureCubeMap::apply(State& state) const } + _textureObjectBuffer[contextID] = textureObject; + if (_unrefImageDataAfterApply && areAllTextureObjectsLoaded()) { TextureCubeMap* non_const_this = const_cast(this); diff --git a/src/osg/TextureRectangle.cpp b/src/osg/TextureRectangle.cpp index 9170ea8f8..6bc84bc39 100644 --- a/src/osg/TextureRectangle.cpp +++ b/src/osg/TextureRectangle.cpp @@ -197,7 +197,7 @@ void TextureRectangle::apply(State& state) const OpenThreads::ScopedLock lock(s_mutex); // we don't have a applyTexImage1D_subload yet so can't reuse.. so just generate a new texture object. - _textureObjectBuffer[contextID] = textureObject = generateTextureObject(contextID,GL_TEXTURE_RECTANGLE); + textureObject = generateTextureObject(contextID,GL_TEXTURE_RECTANGLE); textureObject->bind(); @@ -206,6 +206,8 @@ void TextureRectangle::apply(State& state) const applyTexImage_load(GL_TEXTURE_RECTANGLE, _image.get(), state, _textureWidth, _textureHeight); textureObject->setAllocated(1,_internalFormat,_textureWidth,_textureHeight,1,0); + + _textureObjectBuffer[contextID] = textureObject; if (_unrefImageDataAfterApply && areAllTextureObjectsLoaded() && _image->getDataVariance()==STATIC) {