Browse Source

Support for ARB_texture_filter_anisotropic.

pull/231/head
Vladimír Vondruš 8 years ago
parent
commit
0ceb54ed7d
  1. 2
      doc/opengl-support.dox
  2. 6
      src/Magnum/AbstractTexture.cpp
  3. 3
      src/Magnum/AbstractTexture.h
  4. 1
      src/Magnum/Context.cpp
  5. 7
      src/Magnum/Implementation/TextureState.cpp
  6. 7
      src/Magnum/Platform/magnum-info.cpp
  7. 14
      src/Magnum/Sampler.cpp
  8. 6
      src/Magnum/Sampler.h

2
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

6
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);
}

3
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)

1
src/Magnum/Context.cpp

@ -626,6 +626,7 @@ bool Context::tryCreate() {
Version::GL430,
Version::GL440,
Version::GL450,
Version::GL460,
#else
Version::GLES200,
Version::GLES300,

7
src/Magnum/Implementation/TextureState.cpp

@ -401,6 +401,13 @@ TextureState::TextureState(Context& context, std::vector<std::string>& extension
#endif
/* Anisotropic filter implementation */
#ifndef MAGNUM_TARGET_GLES
if(context.isExtensionSupported<Extensions::GL::EXT::texture_filter_anisotropic>()) {
extensions.emplace_back(Extensions::GL::ARB::texture_filter_anisotropic::string());
setMaxAnisotropyImplementation = &AbstractTexture::setMaxAnisotropyImplementationArb;
} else
#endif
if(context.isExtensionSupported<Extensions::GL::EXT::texture_filter_anisotropic>()) {
extensions.emplace_back(Extensions::GL::EXT::texture_filter_anisotropic::string());

7
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<Extensions::GL::ARB::texture_filter_anisotropic>()) {
_h(ARB::texture_filter_anisotropic)
_l(Sampler::maxMaxAnisotropy())
} else
#endif
if(c.isExtensionSupported<Extensions::GL::EXT::texture_filter_anisotropic>()) {
_h(EXT::texture_filter_anisotropic)

14
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<Extensions::GL::EXT::texture_filter_anisotropic>())
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<Extensions::GL::ARB::texture_filter_anisotropic>())
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &value);
else
#endif
if(Context::current().isExtensionSupported<Extensions::GL::EXT::texture_filter_anisotropic>())
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &value);
}
return value;
}

6
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();
};

Loading…
Cancel
Save