diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 808d4b572..e200896a9 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -265,7 +265,7 @@ GLSL 4.60 | done @extension{ARB,gl_spirv} | | @extension{ARB,polygon_offset_clamp} | | @extension{ARB,spirv_extensions} | | -@extension{ARB,texture_filter_anisotropic} | | +@extension{ARB,texture_filter_anisotropic} | done @extension{KHR,no_error} | done @subsection opengl-support-extensions ARB / Khronos OpenGL extensions diff --git a/src/Magnum/AbstractTexture.cpp b/src/Magnum/AbstractTexture.cpp index c287ff509..f53996d05 100644 --- a/src/Magnum/AbstractTexture.cpp +++ b/src/Magnum/AbstractTexture.cpp @@ -1181,6 +1181,12 @@ void AbstractTexture::parameterIImplementationDSAEXT(GLenum parameter, const GLi void AbstractTexture::setMaxAnisotropyImplementationNoOp(GLfloat) {} +#ifndef MAGNUM_TARGET_GLES +void AbstractTexture::setMaxAnisotropyImplementationArb(GLfloat anisotropy) { + (this->*Context::current().state().texture->parameterfImplementation)(GL_TEXTURE_MAX_ANISOTROPY, anisotropy); +} +#endif + void AbstractTexture::setMaxAnisotropyImplementationExt(GLfloat anisotropy) { (this->*Context::current().state().texture->parameterfImplementation)(GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropy); } diff --git a/src/Magnum/AbstractTexture.h b/src/Magnum/AbstractTexture.h index c4fb78333..a39d88643 100644 --- a/src/Magnum/AbstractTexture.h +++ b/src/Magnum/AbstractTexture.h @@ -561,6 +561,9 @@ class MAGNUM_EXPORT AbstractTexture: public AbstractObject { #endif void MAGNUM_LOCAL setMaxAnisotropyImplementationNoOp(GLfloat); + #ifndef MAGNUM_TARGET_GLES + void MAGNUM_LOCAL setMaxAnisotropyImplementationArb(GLfloat anisotropy); + #endif void MAGNUM_LOCAL setMaxAnisotropyImplementationExt(GLfloat anisotropy); #if !defined(MAGNUM_TARGET_GLES2) && !defined(MAGNUM_TARGET_WEBGL) diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index 3a7ad2385..1642318b1 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -626,6 +626,7 @@ bool Context::tryCreate() { Version::GL430, Version::GL440, Version::GL450, + Version::GL460, #else Version::GLES200, Version::GLES300, diff --git a/src/Magnum/Implementation/TextureState.cpp b/src/Magnum/Implementation/TextureState.cpp index 87e68a05f..4d11e670a 100644 --- a/src/Magnum/Implementation/TextureState.cpp +++ b/src/Magnum/Implementation/TextureState.cpp @@ -401,6 +401,13 @@ TextureState::TextureState(Context& context, std::vector& extension #endif /* Anisotropic filter implementation */ + #ifndef MAGNUM_TARGET_GLES + if(context.isExtensionSupported()) { + extensions.emplace_back(Extensions::GL::ARB::texture_filter_anisotropic::string()); + + setMaxAnisotropyImplementation = &AbstractTexture::setMaxAnisotropyImplementationArb; + } else + #endif if(context.isExtensionSupported()) { extensions.emplace_back(Extensions::GL::EXT::texture_filter_anisotropic::string()); diff --git a/src/Magnum/Platform/magnum-info.cpp b/src/Magnum/Platform/magnum-info.cpp index 20fb8595a..5a415a39e 100644 --- a/src/Magnum/Platform/magnum-info.cpp +++ b/src/Magnum/Platform/magnum-info.cpp @@ -694,6 +694,13 @@ MagnumInfo::MagnumInfo(const Arguments& arguments): Platform::WindowlessApplicat } #endif + #ifndef MAGNUM_TARGET_GLES + if(c.isExtensionSupported()) { + _h(ARB::texture_filter_anisotropic) + + _l(Sampler::maxMaxAnisotropy()) + } else + #endif if(c.isExtensionSupported()) { _h(EXT::texture_filter_anisotropic) diff --git a/src/Magnum/Sampler.cpp b/src/Magnum/Sampler.cpp index 75177be34..9b099360a 100644 --- a/src/Magnum/Sampler.cpp +++ b/src/Magnum/Sampler.cpp @@ -48,14 +48,18 @@ static_assert((filter_or(Nearest, Base) == GL_NEAREST) && #undef filter_or Float Sampler::maxMaxAnisotropy() { - if(!Context::current().isExtensionSupported()) - return 0.0f; - GLfloat& value = Context::current().state().texture->maxMaxAnisotropy; /* Get the value, if not already cached */ - if(value == 0.0f) - glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &value); + if(value == 0.0f) { + #ifndef MAGNUM_TARGET_GLES + if(Context::current().isExtensionSupported()) + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &value); + else + #endif + if(Context::current().isExtensionSupported()) + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &value); + } return value; } diff --git a/src/Magnum/Sampler.h b/src/Magnum/Sampler.h index 852bf7743..1927f13c8 100644 --- a/src/Magnum/Sampler.h +++ b/src/Magnum/Sampler.h @@ -266,9 +266,11 @@ class MAGNUM_EXPORT Sampler { * @brief Max supported max anisotropy * * The result is cached, repeated queries don't result in repeated - * OpenGL calls. If extension @extension{EXT,texture_filter_anisotropic} + * OpenGL calls. If extension @extension{ARB,texture_filter_anisotropic} + * (part of OpenGL 4.6) or @extension{EXT,texture_filter_anisotropic} * (desktop or ES) is not available, returns @cpp 0.0f @ce. - * @see @fn_gl{Get} with @def_gl_keyword{MAX_TEXTURE_MAX_ANISOTROPY_EXT} + * @see @fn_gl{Get} with @def_gl_keyword{MAX_TEXTURE_MAX_ANISOTROPY} + * @m_keywords{GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT} */ static Float maxMaxAnisotropy(); };