Created a GLenum Texture::selectSizedInternalFormat(const osg::Image* image=0) const method to help clean up set up of glTexStorage.
Fixed typo.
This commit is contained in:
parent
7328e03d23
commit
71f134c64b
@ -652,8 +652,10 @@ class OSG_EXPORT Texture : public osg::TextureAttribute
|
||||
/** Get the internal texture format type. */
|
||||
inline InternalFormatType getInternalFormatType() const { return _internalFormatType; }
|
||||
|
||||
class TextureObject;
|
||||
/* select the size internal format to use based on Image when available or Texture format settings.*/
|
||||
GLenum selectSizedInternalFormat(const osg::Image* image=0) const;
|
||||
|
||||
class TextureObject;
|
||||
|
||||
/** return true if the texture image data has been modified and the associated GL texture object needs to be updated.*/
|
||||
virtual bool isDirty(unsigned int /*contextID*/) const { return false; }
|
||||
|
@ -228,7 +228,7 @@ GLenum assumeSizedInternalFormat(GLint internalFormat, GLenum type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool isCompressedInternalFormatSupportedByTexStorrage(GLint internalFormat)
|
||||
bool isCompressedInternalFormatSupportedByTexStorage(GLint internalFormat)
|
||||
{
|
||||
const size_t formatsCount = sizeof(compressedInternalFormats) / sizeof(compressedInternalFormats[0]);
|
||||
|
||||
@ -2091,6 +2091,45 @@ bool Texture::areAllTextureObjectsLoaded() const
|
||||
return true;
|
||||
}
|
||||
|
||||
GLenum Texture::selectSizedInternalFormat(const osg::Image* image) const
|
||||
{
|
||||
if (_borderWidth!=0) return 0;
|
||||
|
||||
if (image)
|
||||
{
|
||||
bool compressed_image = isCompressedInternalFormat((GLenum)image->getPixelFormat());
|
||||
|
||||
//calculate sized internal format
|
||||
if(compressed_image)
|
||||
{
|
||||
if(isCompressedInternalFormatSupportedByTexStorage(_internalFormat))
|
||||
{
|
||||
return _internalFormat;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isSizedInternalFormat(_internalFormat))
|
||||
{
|
||||
return _internalFormat;
|
||||
}
|
||||
else
|
||||
{
|
||||
return assumeSizedInternalFormat((GLenum)image->getInternalTextureFormat(), (GLenum)image->getDataType());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isSizedInternalFormat(_internalFormat)) return _internalFormat;
|
||||
|
||||
return assumeSizedInternalFormat(_internalFormat, (_sourceType!=0) ? _sourceType : GL_UNSIGNED_BYTE);
|
||||
}
|
||||
}
|
||||
|
||||
void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* image, GLsizei inwidth, GLsizei inheight,GLsizei numMipmapLevels) const
|
||||
{
|
||||
@ -2281,38 +2320,11 @@ void Texture::applyTexImage2D_load(State& state, GLenum target, const Image* ima
|
||||
int width = inwidth;
|
||||
int height = inheight;
|
||||
|
||||
bool useTexStorrage = extensions->isTextureStorageEnabled;
|
||||
GLenum sizedInternalFormat = 0;
|
||||
bool useTexStorage = extensions->isTextureStorageEnabled && extensions->isTexStorage2DSupported() && (_borderWidth==0);
|
||||
GLenum sizedInternalFormat = useTexStorage ? selectSizedInternalFormat(image) : 0;
|
||||
OSG_NOTICE<<"New path useTexStorage="<<useTexStorage<<", sizedInternalFormat="<<sizedInternalFormat<<std::endl;
|
||||
|
||||
if(useTexStorrage)
|
||||
{
|
||||
if(extensions->isTexStorage2DSupported() && _borderWidth == 0)
|
||||
{
|
||||
//calculate sized internal format
|
||||
if(!compressed_image)
|
||||
{
|
||||
if(isSizedInternalFormat(_internalFormat))
|
||||
{
|
||||
sizedInternalFormat = _internalFormat;
|
||||
}
|
||||
else
|
||||
{
|
||||
sizedInternalFormat = assumeSizedInternalFormat((GLenum)image->getInternalTextureFormat(), (GLenum)image->getDataType());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isCompressedInternalFormatSupportedByTexStorrage(_internalFormat))
|
||||
{
|
||||
sizedInternalFormat = _internalFormat;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
useTexStorrage &= sizedInternalFormat != 0;
|
||||
}
|
||||
|
||||
if(useTexStorrage)
|
||||
if (useTexStorage && sizedInternalFormat!=0)
|
||||
{
|
||||
if (getTextureTarget()==GL_TEXTURE_CUBE_MAP)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user