From 3de303fd609ac37a47d90c14f65742926208006c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 17 Nov 2014 14:26:59 +0100 Subject: [PATCH] Discourage usage of *Texture::setImage() even more. ARB_direct_state_access doesn't have equivalent for glTexImage*D(), which indicates that these calls should not be used anymore. Also removed EXT_direct_state_access code path and kept just the plain glBindTexture() + glTexImage*D(), as I assume that all implementations which have EXT_DSA have also ARB_texture_storage, thus this alternative would have no use. --- doc/opengl-mapping.dox | 2 +- src/Magnum/AbstractTexture.cpp | 115 ++++++------------ src/Magnum/AbstractTexture.h | 15 --- src/Magnum/ColorFormat.h | 4 +- src/Magnum/CubeMapTexture.h | 3 + src/Magnum/CubeMapTextureArray.h | 3 + src/Magnum/Implementation/TextureState.cpp | 6 - src/Magnum/Implementation/TextureState.h | 3 - src/Magnum/RectangleTexture.h | 16 +-- src/Magnum/Texture.h | 26 ++-- src/Magnum/TextureArray.h | 24 ++-- .../TextureTools/distancefieldconverter.cpp | 3 +- 12 files changed, 84 insertions(+), 136 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 89e7b4a57..de618cb91 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -317,7 +317,7 @@ OpenGL function | Matching API OpenGL function | Matching API --------------------------------------- | ------------ @fn_gl{TexBuffer}, \n `glTextureBuffer()`, \n @fn_gl_extension{TextureBuffer,EXT,direct_state_access}, \n @fn_gl{TexBufferRange}, \n `glTextureBufferRange()`, \n @fn_gl_extension{TextureBufferRange,EXT,direct_state_access} | @ref BufferTexture::setBuffer() -@fn_gl{TexImage1D}, \n @fn_gl_extension{TextureImage1D,EXT,direct_state_access} \n @fn_gl{TexImage2D}, \n @fn_gl_extension{TextureImage2D,EXT,direct_state_access}, \n @fn_gl{TexImage3D}, \n @fn_gl_extension{TextureImage3D,EXT,direct_state_access} | @ref Texture::setImage(), \n @ref TextureArray::setImage(), \n @ref CubeMapTexture::setImage(), \n @ref CubeMapTextureArray::setImage(), \n @ref RectangleTexture::setImage() +@fn_gl{TexImage1D}, \n @fn_gl{TexImage2D}, \n @fn_gl{TexImage3D} | @ref Texture::setImage(), \n @ref TextureArray::setImage(), \n @ref CubeMapTexture::setImage(), \n @ref CubeMapTextureArray::setImage(), \n @ref RectangleTexture::setImage() @fn_gl{TexImage2DMultisample}, \n @fn_gl{TexImage3DMultisample} | @ref MultisampleTexture::setStorage() @fn_gl{TexParameter}, \n `glTextureParameter()`, \n @fn_gl_extension{TextureParameter,EXT,direct_state_access} | @ref Texture::setBaseLevel() "*Texture::setBaseLevel()", \n @ref Texture::setMaxLevel() "*Texture::setMaxLevel()", \n @ref Texture::setMinificationFilter() "*Texture::setMinificationFilter()", \n @ref Texture::setMagnificationFilter() "*Texture::setMagnificationFilter()", \n @ref Texture::setMinLod() "*Texture::setMinLod()", \n @ref Texture::setMaxLod() "*Texture::setMaxLod()", \n @ref Texture::setLodBias() "*Texture::setLodBias()", \n @ref Texture::setWrapping() "*Texture::setWrapping()", \n @ref Texture::setBorderColor() "*Texture::setBorderColor()", \n @ref Texture::setMaxAnisotropy() "*Texture::setMaxAnisotropy()", \n @ref Texture::setSRGBDecode() "*Texture::setSRGBDecode()", \n @ref Texture::setSwizzle() "*Texture::setSwizzle()", \n @ref Texture::setCompareMode() "*Texture::setCompareMode()", \n @ref Texture::setCompareFunction() "*Texture::setCompareFunction()", \n @ref Texture::setDepthStencilMode() "*Texture::setDepthStencilMode()" @fn_gl{TexStorage1D}, \n `glTextureStorage1D()`, \n @fn_gl_extension{TextureStorage1D,EXT,direct_state_access}, \n @fn_gl{TexStorage2D}, \n `glTextureStorage2D()`, \n @fn_gl_extension{TextureStorage2D,EXT,direct_state_access}, \n @fn_gl{TexStorage3D}, \n `glTextureStorage3D()`, \n @fn_gl_extension{TextureStorage3D,EXT,direct_state_access} | @ref Texture::setStorage(), \n @ref TextureArray::setStorage(), \n @ref CubeMapTexture::setStorage(), \n @ref CubeMapTextureArray::setStorage(), \n @ref RectangleTexture::setStorage() diff --git a/src/Magnum/AbstractTexture.cpp b/src/Magnum/AbstractTexture.cpp index 48eea2eb3..a1ef9ec3c 100644 --- a/src/Magnum/AbstractTexture.cpp +++ b/src/Magnum/AbstractTexture.cpp @@ -903,9 +903,9 @@ void AbstractTexture::storageImplementationFallback(const GLenum target, const G const ColorFormat format = imageFormatForInternalFormat(internalFormat); const ColorType type = imageTypeForInternalFormat(internalFormat); - for(GLsizei level = 0; level != levels; ++level) { - (this->*Context::current()->state().texture->image1DImplementation)(target, level, internalFormat, Math::max(Math::Vector<1, GLsizei>(1), size >> level), format, type, nullptr); - } + for(GLsizei level = 0; level != levels; ++level) + DataHelper<1>::setImage(*this, target, level, internalFormat, + ImageReference1D{format, type, Math::max(Math::Vector<1, GLsizei>(1), size >> level)}); } void AbstractTexture::storageImplementationDefault(GLenum target, GLsizei levels, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size) { @@ -930,9 +930,9 @@ void AbstractTexture::storageImplementationFallback(const GLenum target, const G if(target == GL_TEXTURE_2D) #endif { - for(GLsizei level = 0; level != levels; ++level) { - (this->*Context::current()->state().texture->image2DImplementation)(target, level, internalFormat, Math::max(Vector2i(1), size >> level), format, type, nullptr); - } + for(GLsizei level = 0; level != levels; ++level) + DataHelper<2>::setImage(*this, target, level, internalFormat, + ImageReference2D{format, type, Math::max(Vector2i(1), size >> level)}); /* Cube map additionally needs to specify all faces */ } else if(target == GL_TEXTURE_CUBE_MAP) { @@ -943,15 +943,16 @@ void AbstractTexture::storageImplementationFallback(const GLenum target, const G GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z}) - (this->*Context::current()->state().texture->image2DImplementation)(face, level, internalFormat, Math::max(Vector2i(1), size >> level), format, type, nullptr); + DataHelper<2>::setImage(*this, face, level, internalFormat, + ImageReference2D{format, type, Math::max(Vector2i(1), size >> level)}); } #ifndef MAGNUM_TARGET_GLES /* Array texture is not scaled in "layer" dimension */ } else if(target == GL_TEXTURE_1D_ARRAY) { - for(GLsizei level = 0; level != levels; ++level) { - (this->*Context::current()->state().texture->image2DImplementation)(target, level, internalFormat, Math::max(Vector2i(1), size >> level), format, type, nullptr); - } + for(GLsizei level = 0; level != levels; ++level) + DataHelper<2>::setImage(*this, target, level, internalFormat, + ImageReference2D{format, type, Math::max(Vector2i(1), size >> level)}); #endif /* No other targets are available */ @@ -990,27 +991,24 @@ void AbstractTexture::storageImplementationFallback(GLenum target, GLsizei level #else if(target == GL_TEXTURE_3D_OES) #endif - { - for(GLsizei level = 0; level != levels; ++level) { - (this->*Context::current()->state().texture->image3DImplementation)(target, level, internalFormat, Math::max(Vector3i(1), size >> level), format, type, nullptr); - } + for(GLsizei level = 0; level != levels; ++level) + DataHelper<3>::setImage(*this, target, level, internalFormat, + ImageReference3D{format, type, Math::max(Vector3i(1), size >> level)}); #ifndef MAGNUM_TARGET_GLES2 /* Array texture is not scaled in "layer" dimension */ - } #ifndef MAGNUM_TARGET_GLES else if(target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_CUBE_MAP_ARRAY) #else else if(target == GL_TEXTURE_2D_ARRAY) #endif - { - for(GLsizei level = 0; level != levels; ++level) { - (this->*Context::current()->state().texture->image3DImplementation)(target, level, internalFormat, Math::max(Vector3i(1), size >> level), format, type, nullptr); - } + for(GLsizei level = 0; level != levels; ++level) + DataHelper<3>::setImage(*this, target, level, internalFormat, + ImageReference3D{format, type, Math::max(Vector3i(1), size >> level)}); #endif /* No other targets are available */ - } else CORRADE_ASSERT_UNREACHABLE(); + else CORRADE_ASSERT_UNREACHABLE(); } void AbstractTexture::storageImplementationDefault(GLenum target, GLsizei levels, TextureFormat internalFormat, const Vector3i& size) { @@ -1088,55 +1086,6 @@ void AbstractTexture::getImageImplementationRobustness(const GLenum target, cons } #endif -#ifndef MAGNUM_TARGET_GLES -void AbstractTexture::imageImplementationDefault(GLenum target, GLint level, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size, ColorFormat format, ColorType type, const GLvoid* data) { - bindInternal(); - glTexImage1D(target, level, GLint(internalFormat), size[0], 0, GLenum(format), GLenum(type), data); -} - -void AbstractTexture::imageImplementationDSAEXT(GLenum target, GLint level, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size, ColorFormat format, ColorType type, const GLvoid* data) { - _created = true; - glTextureImage1DEXT(_id, target, level, GLint(internalFormat), size[0], 0, GLenum(format), GLenum(type), data); -} -#endif - -void AbstractTexture::imageImplementationDefault(GLenum target, GLint level, TextureFormat internalFormat, const Vector2i& size, ColorFormat format, ColorType type, const GLvoid* data) { - bindInternal(); - glTexImage2D(target, level, GLint(internalFormat), size.x(), size.y(), 0, GLenum(format), GLenum(type), data); -} - -#ifndef MAGNUM_TARGET_GLES -void AbstractTexture::imageImplementationDSAEXT(GLenum target, GLint level, TextureFormat internalFormat, const Vector2i& size, ColorFormat format, ColorType type, const GLvoid* data) { - _created = true; - glTextureImage2DEXT(_id, target, level, GLint(internalFormat), size.x(), size.y(), 0, GLenum(format), GLenum(type), data); -} -#endif - -void AbstractTexture::imageImplementationDefault(GLenum target, GLint level, TextureFormat internalFormat, const Vector3i& size, ColorFormat format, ColorType type, const GLvoid* data) { - bindInternal(); - #ifndef MAGNUM_TARGET_GLES2 - glTexImage3D(target, level, GLint(internalFormat), size.x(), size.y(), size.z(), 0, GLenum(format), GLenum(type), data); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glTexImage3DOES(target, level, GLint(internalFormat), size.x(), size.y(), size.z(), 0, GLenum(format), GLenum(type), data); - #else - static_cast(target); - static_cast(level); - static_cast(internalFormat); - static_cast(size); - static_cast(format); - static_cast(type); - static_cast(data); - CORRADE_ASSERT_UNREACHABLE(); - #endif -} - -#ifndef MAGNUM_TARGET_GLES -void AbstractTexture::imageImplementationDSAEXT(GLenum target, GLint level, TextureFormat internalFormat, const Vector3i& size, ColorFormat format, ColorType type, const GLvoid* data) { - _created = true; - glTextureImage3DEXT(_id, target, level, GLint(internalFormat), size.x(), size.y(), size.z(), 0, GLenum(format), GLenum(type), data); -} -#endif - #ifndef MAGNUM_TARGET_GLES void AbstractTexture::subImageImplementationDefault(GLenum target, GLint level, const Math::Vector<1, GLint>& offset, const Math::Vector<1, GLsizei>& size, ColorFormat format, ColorType type, const GLvoid* data) { bindInternal(); @@ -1293,12 +1242,14 @@ void AbstractTexture::DataHelper<3>::setStorageMultisample(AbstractTexture& text #ifndef MAGNUM_TARGET_GLES void AbstractTexture::DataHelper<1>::setImage(AbstractTexture& texture, const GLenum target, const GLint level, const TextureFormat internalFormat, const ImageReference1D& image) { Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack); - (texture.*Context::current()->state().texture->image1DImplementation)(target, level, internalFormat, image.size(), image.format(), image.type(), image.data()); + texture.bindInternal(); + glTexImage1D(target, level, GLint(internalFormat), image.size()[0], 0, GLenum(image.format()), GLenum(image.type()), image.data()); } void AbstractTexture::DataHelper<1>::setImage(AbstractTexture& texture, const GLenum target, const GLint level, const TextureFormat internalFormat, BufferImage1D& image) { image.buffer().bindInternal(Buffer::TargetHint::PixelUnpack); - (texture.*Context::current()->state().texture->image1DImplementation)(target, level, internalFormat, image.size(), image.format(), image.type(), nullptr); + texture.bindInternal(); + glTexImage1D(target, level, GLint(internalFormat), image.size()[0], 0, GLenum(image.format()), GLenum(image.type()), nullptr); } void AbstractTexture::DataHelper<1>::setSubImage(AbstractTexture& texture, const GLenum target, const GLint level, const Math::Vector<1, GLint>& offset, const ImageReference1D& image) { @@ -1316,13 +1267,15 @@ void AbstractTexture::DataHelper<2>::setImage(AbstractTexture& texture, const GL #ifndef MAGNUM_TARGET_GLES2 Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack); #endif - (texture.*Context::current()->state().texture->image2DImplementation)(target, level, internalFormat, image.size(), image.format(), image.type(), image.data()); + texture.bindInternal(); + glTexImage2D(target, level, GLint(internalFormat), image.size().x(), image.size().y(), 0, GLenum(image.format()), GLenum(image.type()), image.data()); } #ifndef MAGNUM_TARGET_GLES2 void AbstractTexture::DataHelper<2>::setImage(AbstractTexture& texture, const GLenum target, const GLint level, const TextureFormat internalFormat, BufferImage2D& image) { image.buffer().bindInternal(Buffer::TargetHint::PixelUnpack); - (texture.*Context::current()->state().texture->image2DImplementation)(target, level, internalFormat, image.size(), image.format(), image.type(), nullptr); + texture.bindInternal(); + glTexImage2D(target, level, GLint(internalFormat), image.size().x(), image.size().y(), 0, GLenum(image.format()), GLenum(image.type()), nullptr); } #endif @@ -1344,13 +1297,25 @@ void AbstractTexture::DataHelper<3>::setImage(AbstractTexture& texture, const GL #ifndef MAGNUM_TARGET_GLES2 Buffer::unbindInternal(Buffer::TargetHint::PixelUnpack); #endif - (texture.*Context::current()->state().texture->image3DImplementation)(target, level, internalFormat, image.size(), image.format(), image.type(), image.data()); + texture.bindInternal(); + #ifndef MAGNUM_TARGET_GLES2 + glTexImage3D(target, level, GLint(internalFormat), image.size().x(), image.size().y(), image.size().z(), 0, GLenum(image.format()), GLenum(image.type()), image.data()); + #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) + glTexImage3DOES(target, level, GLint(internalFormat), image.size().x(), image.size().y(), image.size().z(), 0, GLenum(image.format()), GLenum(image.type()), image.data()); + #else + static_cast(target); + static_cast(level); + static_cast(internalFormat); + static_cast(image); + CORRADE_ASSERT_UNREACHABLE(); + #endif } #ifndef MAGNUM_TARGET_GLES2 void AbstractTexture::DataHelper<3>::setImage(AbstractTexture& texture, const GLenum target, const GLint level, const TextureFormat internalFormat, BufferImage3D& image) { image.buffer().bindInternal(Buffer::TargetHint::PixelUnpack); - (texture.*Context::current()->state().texture->image3DImplementation)(target, level, internalFormat, image.size(), image.format(), image.type(), nullptr); + texture.bindInternal(); + glTexImage3D(target, level, GLint(internalFormat), image.size().x(), image.size().y(), image.size().z(), 0, GLenum(image.format()), GLenum(image.type()), nullptr); } #endif diff --git a/src/Magnum/AbstractTexture.h b/src/Magnum/AbstractTexture.h index 4b252ef17..9c05c1240 100644 --- a/src/Magnum/AbstractTexture.h +++ b/src/Magnum/AbstractTexture.h @@ -466,21 +466,6 @@ class MAGNUM_EXPORT AbstractTexture: public AbstractObject { void MAGNUM_LOCAL getImageImplementationRobustness(GLenum target, GLint level, ColorFormat format, ColorType type, std::size_t dataSize, GLvoid* data); #endif - #ifndef MAGNUM_TARGET_GLES - void MAGNUM_LOCAL imageImplementationDefault(GLenum target, GLint level, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size, ColorFormat format, ColorType type, const GLvoid* data); - void MAGNUM_LOCAL imageImplementationDSAEXT(GLenum target, GLint level, TextureFormat internalFormat, const Math::Vector<1, GLsizei>& size, ColorFormat format, ColorType type, const GLvoid* data); - #endif - - void MAGNUM_LOCAL imageImplementationDefault(GLenum target, GLint level, TextureFormat internalFormat, const Vector2i& size, ColorFormat format, ColorType type, const GLvoid* data); - #ifndef MAGNUM_TARGET_GLES - void MAGNUM_LOCAL imageImplementationDSAEXT(GLenum target, GLint level, TextureFormat internalFormat, const Vector2i& size, ColorFormat format, ColorType type, const GLvoid* data); - #endif - - void MAGNUM_LOCAL imageImplementationDefault(GLenum target, GLint level, TextureFormat internalFormat, const Vector3i& size, ColorFormat format, ColorType type, const GLvoid* data); - #ifndef MAGNUM_TARGET_GLES - void MAGNUM_LOCAL imageImplementationDSAEXT(GLenum target, GLint level, TextureFormat internalFormat, const Vector3i& size, ColorFormat format, ColorType type, const GLvoid* data); - #endif - #ifndef MAGNUM_TARGET_GLES void MAGNUM_LOCAL subImageImplementationDefault(GLenum target, GLint level, const Math::Vector<1, GLint>& offset, const Math::Vector<1, GLsizei>& size, ColorFormat format, ColorType type, const GLvoid* data); void MAGNUM_LOCAL subImageImplementationDSAEXT(GLenum target, GLint level, const Math::Vector<1, GLint>& offset, const Math::Vector<1, GLsizei>& size, ColorFormat format, ColorType type, const GLvoid* data); diff --git a/src/Magnum/ColorFormat.h b/src/Magnum/ColorFormat.h index 951b1d72c..d6974b916 100644 --- a/src/Magnum/ColorFormat.h +++ b/src/Magnum/ColorFormat.h @@ -40,7 +40,7 @@ namespace Magnum { Note that some formats can be used only for framebuffer reading (using @ref AbstractFramebuffer::read()) and some only for texture data (using -@ref Texture::setImage() and others), the limitations are mentioned in +@ref Texture::setSubImage() and others), the limitations are mentioned in documentation of each particular value. In most cases you may want to use @ref ColorFormat::Red (for grayscale images), @@ -266,7 +266,7 @@ enum class ColorFormat: GLenum { Note that some formats can be used only for framebuffer reading (using @ref AbstractFramebuffer::read()) and some only for texture data (using -@ref Texture::setImage() and others), the limitations are mentioned in +@ref Texture::setSubImage() and others), the limitations are mentioned in documentation of each particular value. In most cases you may want to use @ref ColorType::UnsignedByte along with diff --git a/src/Magnum/CubeMapTexture.h b/src/Magnum/CubeMapTexture.h index 058213c8d..3a88c01fd 100644 --- a/src/Magnum/CubeMapTexture.h +++ b/src/Magnum/CubeMapTexture.h @@ -306,6 +306,9 @@ class MAGNUM_EXPORT CubeMapTexture: public AbstractTexture { * * See @ref Texture::setImage() for more information. * @see @ref maxSize() + * @deprecated_gl Prefer to use @ref Magnum::CubeMapTexture::setStorage() "setStorage()" + * and @ref Magnum::CubeMapTexture::setSubImage() "setSubImage()" + * instead. */ CubeMapTexture& setImage(Coordinate coordinate, Int level, TextureFormat internalFormat, const ImageReference2D& image) { DataHelper<2>::setImage(*this, GLenum(coordinate), level, internalFormat, image); diff --git a/src/Magnum/CubeMapTextureArray.h b/src/Magnum/CubeMapTextureArray.h index 719407e14..8868b4105 100644 --- a/src/Magnum/CubeMapTextureArray.h +++ b/src/Magnum/CubeMapTextureArray.h @@ -332,6 +332,9 @@ class CubeMapTextureArray: public AbstractTexture { * * See @ref Texture::setImage() for more information. * @see @ref maxSize() + * @deprecated_gl Prefer to use @ref Magnum::CubeMapTextureArray::setStorage() "setStorage()" + * and @ref Magnum::CubeMapTextureArray::setSubImage() "setSubImage()" + * instead. */ CubeMapTextureArray& setImage(Int level, TextureFormat internalFormat, const ImageReference3D& image) { DataHelper<3>::setImage(*this, GL_TEXTURE_CUBE_MAP_ARRAY, level, internalFormat, image); diff --git a/src/Magnum/Implementation/TextureState.cpp b/src/Magnum/Implementation/TextureState.cpp index 0edf4ff3d..b2e3b2db5 100644 --- a/src/Magnum/Implementation/TextureState.cpp +++ b/src/Magnum/Implementation/TextureState.cpp @@ -107,9 +107,6 @@ TextureState::TextureState(Context& context, std::vector& extension getLevelParameterivImplementation = &AbstractTexture::getLevelParameterImplementationDSAEXT; mipmapImplementation = &AbstractTexture::mipmapImplementationDSAEXT; getImageImplementation = &AbstractTexture::getImageImplementationDSAEXT; - image1DImplementation = &AbstractTexture::imageImplementationDSAEXT; - image2DImplementation = &AbstractTexture::imageImplementationDSAEXT; - image3DImplementation = &AbstractTexture::imageImplementationDSAEXT; subImage1DImplementation = &AbstractTexture::subImageImplementationDSAEXT; subImage2DImplementation = &AbstractTexture::subImageImplementationDSAEXT; subImage3DImplementation = &AbstractTexture::subImageImplementationDSAEXT; @@ -135,10 +132,7 @@ TextureState::TextureState(Context& context, std::vector& extension mipmapImplementation = &AbstractTexture::mipmapImplementationDefault; #ifndef MAGNUM_TARGET_GLES getImageImplementation = &AbstractTexture::getImageImplementationDefault; - image1DImplementation = &AbstractTexture::imageImplementationDefault; #endif - image2DImplementation = &AbstractTexture::imageImplementationDefault; - image3DImplementation = &AbstractTexture::imageImplementationDefault; #ifndef MAGNUM_TARGET_GLES subImage1DImplementation = &AbstractTexture::subImageImplementationDefault; #endif diff --git a/src/Magnum/Implementation/TextureState.h b/src/Magnum/Implementation/TextureState.h index fbe4988fd..5c0180776 100644 --- a/src/Magnum/Implementation/TextureState.h +++ b/src/Magnum/Implementation/TextureState.h @@ -69,10 +69,7 @@ struct TextureState { #ifndef MAGNUM_TARGET_GLES void(AbstractTexture::*storage3DMultisampleImplementation)(GLenum, GLsizei, TextureFormat, const Vector3i&, GLboolean); void(AbstractTexture::*getImageImplementation)(GLenum, GLint, ColorFormat, ColorType, std::size_t, GLvoid*); - void(AbstractTexture::*image1DImplementation)(GLenum, GLint, TextureFormat, const Math::Vector<1, GLsizei>&, ColorFormat, ColorType, const GLvoid*); #endif - void(AbstractTexture::*image2DImplementation)(GLenum, GLint, TextureFormat, const Vector2i&, ColorFormat, ColorType, const GLvoid*); - void(AbstractTexture::*image3DImplementation)(GLenum, GLint, TextureFormat, const Vector3i&, ColorFormat, ColorType, const GLvoid*); #ifndef MAGNUM_TARGET_GLES void(AbstractTexture::*subImage1DImplementation)(GLenum, GLint, const Math::Vector<1, GLint>&, const Math::Vector<1, GLsizei>&, ColorFormat, ColorType, const GLvoid*); #endif diff --git a/src/Magnum/RectangleTexture.h b/src/Magnum/RectangleTexture.h index 79862fe9b..b7e112b63 100644 --- a/src/Magnum/RectangleTexture.h +++ b/src/Magnum/RectangleTexture.h @@ -325,14 +325,16 @@ class MAGNUM_EXPORT RectangleTexture: public AbstractTexture { * @ref Trade::ImageData2D * @return Reference to self (for method chaining) * - * For better performance when calling @ref setImage() more than once - * use @ref setStorage() and @ref setSubImage() instead. - * - * If @extension{EXT,direct_state_access} is not available, the - * texture is bound to some texture unit before the operation. + * On platforms that support it prefer to use @ref setStorage() and + * @ref setSubImage() instead, as it avoids unnecessary reallocations + * and has better performance characteristics. This call also has no + * equivalent in @extension{ARB,direct_state_access}, thus the texture + * needs to be bound to some texture unit before the operation. * @see @ref maxSize(), @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and - * @fn_gl{TexImage2D} or - * @fn_gl_extension{TextureImage2D,EXT,direct_state_access} + * @fn_gl{TexImage2D} + * @deprecated_gl Prefer to use @ref Magnum::RectangleTexture::setStorage() "setStorage()" + * and @ref Magnum::RectangleTexture::setSubImage() "setSubImage()" + * instead. */ RectangleTexture& setImage(TextureFormat internalFormat, const ImageReference2D& image) { DataHelper<2>::setImage(*this, _target, 0, internalFormat, image); diff --git a/src/Magnum/Texture.h b/src/Magnum/Texture.h index 94f983581..4ba823ea1 100644 --- a/src/Magnum/Texture.h +++ b/src/Magnum/Texture.h @@ -647,17 +647,16 @@ template class Texture: public AbstractTexture { * @ref Trade::ImageData of the same dimension count * @return Reference to self (for method chaining) * - * For better performance when generating mipmaps using - * @ref generateMipmap() or calling @ref setImage() more than once use - * @ref setStorage() and @ref setSubImage() instead. - * - * If @extension{EXT,direct_state_access} is not available, the - * texture is bound to some texture unit before the operation. + * On platforms that support it prefer to use @ref setStorage() and + * @ref setSubImage() instead, as it avoids unnecessary reallocations + * and has better performance characteristics. This call also has no + * equivalent in @extension{ARB,direct_state_access}, thus the texture + * needs to be bound to some texture unit before the operation. * @see @ref maxSize(), @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and - * @fn_gl{TexImage1D}/@fn_gl{TexImage2D}/@fn_gl{TexImage3D} or - * @fn_gl_extension{TextureImage1D,EXT,direct_state_access}/ - * @fn_gl_extension{TextureImage2D,EXT,direct_state_access}/ - * @fn_gl_extension{TextureImage3D,EXT,direct_state_access} + * @fn_gl{TexImage1D}/@fn_gl{TexImage2D}/@fn_gl{TexImage3D} + * @deprecated_gl Prefer to use @ref Magnum::Texture::setStorage() "setStorage()" + * and @ref Magnum::Texture::setSubImage() "setSubImage()" + * instead. */ Texture& setImage(Int level, TextureFormat internalFormat, const ImageReference& image) { DataHelper::setImage(*this, _target, level, internalFormat, image); @@ -693,10 +692,9 @@ template class Texture: public AbstractTexture { * in @ref setImage(). It means that you might not be able to use * @ref setStorage() as it uses implicit @ref ColorType value. * - * @see @ref setStorage(), @ref setImage(), @fn_gl{ActiveTexture}, - * @fn_gl{BindTexture} and @fn_gl{TexSubImage1D}/ - * @fn_gl{TexSubImage2D}/@fn_gl{TexSubImage3D} or - * @fn_gl_extension{TextureSubImage1D,EXT,direct_state_access}/ + * @see @ref setStorage(), @fn_gl{ActiveTexture}, @fn_gl{BindTexture} + * and @fn_gl{TexSubImage1D}/@fn_gl{TexSubImage2D}/@fn_gl{TexSubImage3D} + * or @fn_gl_extension{TextureSubImage1D,EXT,direct_state_access}/ * @fn_gl_extension{TextureSubImage2D,EXT,direct_state_access}/ * @fn_gl_extension{TextureSubImage3D,EXT,direct_state_access} */ diff --git a/src/Magnum/TextureArray.h b/src/Magnum/TextureArray.h index 8968fb912..c6f1d67f1 100644 --- a/src/Magnum/TextureArray.h +++ b/src/Magnum/TextureArray.h @@ -309,16 +309,16 @@ template class TextureArray: public AbstractTexture { * @ref Trade::ImageData of the same dimension count * @return Reference to self (for method chaining) * - * For better performance when generating mipmaps using - * @ref generateMipmap() or calling @ref setImage() more than once use - * @ref setStorage() and @ref setSubImage() instead. - * - * If @extension{EXT,direct_state_access} is not available, the - * texture is bound to some texture unit before the operation. + * On platforms that support it prefer to use @ref setStorage() and + * @ref setSubImage() instead, as it avoids unnecessary reallocations + * and has better performance characteristics. This call also has no + * equivalent in @extension{ARB,direct_state_access}, thus the texture + * needs to be bound to some texture unit before the operation. * @see @ref maxSize(), @fn_gl{ActiveTexture}, @fn_gl{BindTexture} and - * @fn_gl{TexImage2D}/@fn_gl{TexImage3D} or - * @fn_gl_extension{TextureImage2D,EXT,direct_state_access}/ - * @fn_gl_extension{TextureImage3D,EXT,direct_state_access} + * @fn_gl{TexImage2D}/@fn_gl{TexImage3D} + * @deprecated_gl Prefer to use @ref Magnum::TextureArray::setStorage() "setStorage()" + * and @ref Magnum::TextureArray::setSubImage() "setSubImage()" + * instead. */ TextureArray& setImage(Int level, TextureFormat internalFormat, const ImageReference& image) { DataHelper::setImage(*this, _target, level, internalFormat, image); @@ -348,9 +348,9 @@ template class TextureArray: public AbstractTexture { * * If @extension{EXT,direct_state_access} is not available, the * texture is bound to some texture unit before the operation. - * @see @ref setStorage(), @ref setImage(), @fn_gl{ActiveTexture}, - * @fn_gl{BindTexture} and @fn_gl{TexSubImage2D}/@fn_gl{TexSubImage3D} - * or @fn_gl_extension{TextureSubImage2D,EXT,direct_state_access}/ + * @see @ref setStorage(), @fn_gl{ActiveTexture}, @fn_gl{BindTexture} + * and @fn_gl{TexSubImage2D}/@fn_gl{TexSubImage3D} or + * @fn_gl_extension{TextureSubImage2D,EXT,direct_state_access}/ * @fn_gl_extension{TextureSubImage3D,EXT,direct_state_access} */ TextureArray& setSubImage(Int level, const VectorTypeFor& offset, const ImageReference& image) { diff --git a/src/Magnum/TextureTools/distancefieldconverter.cpp b/src/Magnum/TextureTools/distancefieldconverter.cpp index 2e8bf4992..6afc078dd 100644 --- a/src/Magnum/TextureTools/distancefieldconverter.cpp +++ b/src/Magnum/TextureTools/distancefieldconverter.cpp @@ -149,7 +149,8 @@ int DistanceFieldConverter::exec() { input.setMinificationFilter(Sampler::Filter::Linear) .setMagnificationFilter(Sampler::Filter::Linear) .setWrapping(Sampler::Wrapping::ClampToEdge) - .setImage(0, internalFormat, *image); + .setStorage(1, internalFormat, image->size()) + .setSubImage(0, {}, *image); /* Output texture */ Texture2D output;