prevent immutability resetting when textureobject is taken from orphans

This commit is contained in:
Julien Valentin 2020-03-25 23:00:24 +01:00 committed by Robert Osfield
parent c29e2e4f40
commit b8416a7aa2
7 changed files with 56 additions and 33 deletions

View File

@ -238,13 +238,15 @@ void Texture1D::apply(State& state) const
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_1D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, 1, 1, 0); textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_1D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, 1, 1, 0);
textureObject->bind(state); textureObject->bind(state);
applyTexParameters(GL_TEXTURE_1D, state); applyTexParameters(GL_TEXTURE_1D, state);
if(!textureObject->_allocated)
{
extensions->glTexStorage1D( GL_TEXTURE_1D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth); extensions->glTexStorage1D( GL_TEXTURE_1D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth);
} }
}
else else
{ {
GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat; GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat;
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_1D, _numMipmapLevels, internalFormat, _textureWidth, 1, 1, 0); textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_1D, _numMipmapLevels, internalFormat, _textureWidth, 1, 1, _borderWidth);
textureObject->bind(state); textureObject->bind(state);
applyTexParameters(GL_TEXTURE_1D, state); applyTexParameters(GL_TEXTURE_1D, state);
@ -260,6 +262,8 @@ void Texture1D::apply(State& state) const
_readPBuffer->bindPBufferToTexture(GL_FRONT); _readPBuffer->bindPBufferToTexture(GL_FRONT);
} }
textureObject->setAllocated(_numMipmapLevels, texStorageSizedInternalFormat!=0? texStorageSizedInternalFormat: _internalFormat, _textureWidth, 1, 1, _borderWidth);
} }
else else
{ {

View File

@ -305,9 +305,12 @@ void Texture2D::apply(State& state) const
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_2D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, _borderWidth); textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_2D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, _borderWidth);
textureObject->bind(state); textureObject->bind(state);
applyTexParameters(GL_TEXTURE_2D, state); applyTexParameters(GL_TEXTURE_2D, state);
if(!textureObject->_allocated)
{
extensions->glTexStorage2D( GL_TEXTURE_2D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, extensions->glTexStorage2D( GL_TEXTURE_2D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat,
_textureWidth, _textureHeight); _textureWidth, _textureHeight);
} }
}
else else
{ {
GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat; GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat;
@ -326,6 +329,7 @@ void Texture2D::apply(State& state) const
_readPBuffer->bindPBufferToTexture(GL_FRONT); _readPBuffer->bindPBufferToTexture(GL_FRONT);
} }
textureObject->setAllocated(_numMipmapLevels, texStorageSizedInternalFormat!=0? texStorageSizedInternalFormat: _internalFormat, _textureWidth, _textureHeight, 1, _borderWidth);
} }
else else
{ {

View File

@ -353,7 +353,7 @@ void Texture2DArray::apply(State& state) const
applyTexParameters(GL_TEXTURE_2D_ARRAY, state); applyTexParameters(GL_TEXTURE_2D_ARRAY, state);
// First we need to allocate the texture memory // First we need to allocate the texture memory
if(texStorageSizedInternalFormat!=0) if(texStorageSizedInternalFormat!=0 && !textureObject->_allocated)
{ {
extensions->glTexStorage3D(GL_TEXTURE_2D_ARRAY, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, textureDepth); extensions->glTexStorage3D(GL_TEXTURE_2D_ARRAY, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, textureDepth);
} }
@ -452,7 +452,7 @@ void Texture2DArray::apply(State& state) const
applyTexParameters(GL_TEXTURE_2D_ARRAY,state); applyTexParameters(GL_TEXTURE_2D_ARRAY,state);
if (texStorageSizedInternalFormat!=0) if (texStorageSizedInternalFormat!=0 && !textureObject->_allocated)
{ {
extensions->glTexStorage3D( GL_TEXTURE_2D_ARRAY, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth); extensions->glTexStorage3D( GL_TEXTURE_2D_ARRAY, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth);
} }
@ -463,6 +463,8 @@ void Texture2DArray::apply(State& state) const
_sourceFormat ? _sourceFormat : _internalFormat, _sourceFormat ? _sourceFormat : _internalFormat,
_sourceType ? _sourceType : GL_UNSIGNED_BYTE, _sourceType ? _sourceType : GL_UNSIGNED_BYTE,
0); 0);
textureObject->setAllocated(_numMipmapLevels, texStorageSizedInternalFormat!=0 ? texStorageSizedInternalFormat :_internalFormat, _textureWidth, _textureHeight, _textureDepth, 0);
} }
// nothing before, so just unbind the texture target // nothing before, so just unbind the texture target

View File

@ -108,9 +108,11 @@ void Texture2DMultisample::apply(State& state) const
{ {
textureObject = generateAndAssignTextureObject(contextID, getTextureTarget(), 1, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, 0); textureObject = generateAndAssignTextureObject(contextID, getTextureTarget(), 1, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, 0);
textureObject->bind(state); textureObject->bind(state);
if(!textureObject->_allocated)
{
extensions->glTexStorage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _numSamples, texStorageSizedInternalFormat, _textureWidth, _textureHeight, _fixedsamplelocations); extensions->glTexStorage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, _numSamples, texStorageSizedInternalFormat, _textureWidth, _textureHeight, _fixedsamplelocations);
} }
}
else else
{ {
textureObject = generateAndAssignTextureObject(contextID, getTextureTarget(), 1, _internalFormat, _textureWidth, _textureHeight, 1, _borderWidth); textureObject = generateAndAssignTextureObject(contextID, getTextureTarget(), 1, _internalFormat, _textureWidth, _textureHeight, 1, _borderWidth);
@ -123,6 +125,7 @@ void Texture2DMultisample::apply(State& state) const
_textureHeight, _textureHeight,
_fixedsamplelocations ); _fixedsamplelocations );
} }
textureObject->setAllocated(1, texStorageSizedInternalFormat!=0? texStorageSizedInternalFormat: _internalFormat, _textureWidth, _textureHeight, 1, _borderWidth);
} }
else else

View File

@ -322,9 +322,11 @@ void Texture3D::apply(State& state) const
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_3D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth,0); textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_3D, _numMipmapLevels, texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth,0);
textureObject->bind(state); textureObject->bind(state);
applyTexParameters(GL_TEXTURE_3D, state); applyTexParameters(GL_TEXTURE_3D, state);
if(!textureObject->_allocated)
{
extensions->glTexStorage3D( GL_TEXTURE_3D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth); extensions->glTexStorage3D( GL_TEXTURE_3D, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight, _textureDepth);
} }
}
else else
{ {
GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat; GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat;
@ -345,6 +347,7 @@ void Texture3D::apply(State& state) const
_readPBuffer->bindPBufferToTexture(GL_FRONT); _readPBuffer->bindPBufferToTexture(GL_FRONT);
} }
textureObject->setAllocated(_numMipmapLevels, texStorageSizedInternalFormat!=0? texStorageSizedInternalFormat : _internalFormat, _textureWidth, _textureHeight, _textureDepth, _borderWidth);
} }
else else
{ {

View File

@ -352,8 +352,11 @@ void TextureCubeMap::apply(State& state) const
applyTexParameters(GL_TEXTURE_CUBE_MAP,state); applyTexParameters(GL_TEXTURE_CUBE_MAP,state);
if(texStorageSizedInternalFormat!=0) if(texStorageSizedInternalFormat!=0)
{
if(!textureObject->_allocated)
{ {
extensions->glTexStorage2D(GL_TEXTURE_CUBE_MAP, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight); extensions->glTexStorage2D(GL_TEXTURE_CUBE_MAP, osg::maximum(_numMipmapLevels,1), texStorageSizedInternalFormat, _textureWidth, _textureHeight);
}
} }
else else
@ -367,6 +370,7 @@ void TextureCubeMap::apply(State& state) const
0); 0);
} }
textureObject->setAllocated(_numMipmapLevels, texStorageSizedInternalFormat!=0? texStorageSizedInternalFormat : _internalFormat, _textureWidth, _textureHeight, 1, 0);
} }
else else
{ {

View File

@ -281,9 +281,11 @@ void TextureRectangle::apply(State& state) const
textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_RECTANGLE, 0, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, 0); textureObject = generateAndAssignTextureObject(contextID, GL_TEXTURE_RECTANGLE, 0, texStorageSizedInternalFormat, _textureWidth, _textureHeight, 1, 0);
textureObject->bind(state); textureObject->bind(state);
applyTexParameters(GL_TEXTURE_RECTANGLE, state); applyTexParameters(GL_TEXTURE_RECTANGLE, state);
if(!textureObject->_allocated)
{
extensions->glTexStorage2D( GL_TEXTURE_RECTANGLE, 1, texStorageSizedInternalFormat, _textureWidth, _textureHeight); extensions->glTexStorage2D( GL_TEXTURE_RECTANGLE, 1, texStorageSizedInternalFormat, _textureWidth, _textureHeight);
} }
}
else else
{ {
GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat; GLenum internalFormat = _sourceFormat ? _sourceFormat : _internalFormat;
@ -303,6 +305,7 @@ void TextureRectangle::apply(State& state) const
_readPBuffer->bindPBufferToTexture(GL_FRONT); _readPBuffer->bindPBufferToTexture(GL_FRONT);
} }
textureObject->setAllocated(0, texStorageSizedInternalFormat!=0? texStorageSizedInternalFormat : _internalFormat, _textureWidth, _textureHeight, 1, 0);
} }
else else
{ {