Fixed rare case that anisotropic filtering feature is not available in graphics drivers.

This commit is contained in:
deve 2016-10-05 10:50:20 +02:00
parent 5e05f1178c
commit bd42f2c2df
5 changed files with 81 additions and 37 deletions

View File

@ -49,6 +49,7 @@ void CentralVideoSettings::init()
hasUBO = false;
hasExplicitAttribLocation = false;
hasGS = false;
hasTextureFilterAnisotropic = false;
#if defined(USE_GLES2)
hasBGRA = false;
@ -170,6 +171,11 @@ void CentralVideoSettings::init()
hasExplicitAttribLocation = true;
Log::info("GLDriver", "ARB Explicit Attrib Location Present");
}
if (!GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_TEXTURE_FILTER_ANISOTROPIC) &&
hasGLExtension("GL_EXT_texture_filter_anisotropic")) {
hasTextureFilterAnisotropic = true;
Log::info("GLDriver", "EXT Texture Filter Anisotropic Present");
}
if (!GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_GEOMETRY_SHADER) &&
(m_gl_major_version > 3 || (m_gl_major_version == 3 && m_gl_minor_version >= 2))) {
hasGS = true;
@ -357,6 +363,11 @@ bool CentralVideoSettings::isARBMultiDrawIndirectUsable() const
return hasMultiDrawIndirect;
}
bool CentralVideoSettings::isEXTTextureFilterAnisotropicUsable() const
{
return hasTextureFilterAnisotropic;
}
#if defined(USE_GLES2)
bool CentralVideoSettings::isEXTTextureFormatBGRA8888Usable() const
{

View File

@ -42,6 +42,7 @@ private:
bool hasSSBO;
bool hasImageLoadStore;
bool hasMultiDrawIndirect;
bool hasTextureFilterAnisotropic;
#if defined(USE_GLES2)
bool hasBGRA;
@ -80,6 +81,7 @@ public:
bool isARBImageLoadStoreUsable() const;
bool isARBMultiDrawIndirectUsable() const;
bool isARBExplicitAttribLocationUsable() const;
bool isEXTTextureFilterAnisotropicUsable() const;
#if defined(USE_GLES2)
bool isEXTTextureFormatBGRA8888Usable() const;

View File

@ -57,6 +57,7 @@ namespace GraphicsRestrictions
"TextureCompressionS3TC",
"AMDVertexShaderLayer",
"ExplicitAttribLocation",
"TextureFilterAnisotropic",
#if defined(USE_GLES2)
"TextureFormatBGRA8888",
"ColorBufferFloat",

View File

@ -51,6 +51,7 @@ namespace GraphicsRestrictions
GR_EXT_TEXTURE_COMPRESSION_S3TC,
GR_AMD_VERTEX_SHADER_LAYER,
GR_EXPLICIT_ATTRIB_LOCATION,
GR_TEXTURE_FILTER_ANISOTROPIC,
#if defined(USE_GLES2)
GR_TEXTURE_FORMAT_BGRA8888,
GR_COLOR_BUFFER_FLOAT,

View File

@ -17,6 +17,7 @@
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "graphics/texture_shader.hpp"
#include "graphics/central_settings.hpp"
#include "config/user_config.hpp"
@ -55,6 +56,7 @@ void TextureShaderBase::bindTextureNearest(GLuint texture_unit, GLuint tex)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureNearest
@ -69,9 +71,13 @@ void TextureShaderBase::bindTextureTrilinearAnisotropic(GLuint tex_unit, GLuint
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
{
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)aniso);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
(float)aniso);
}
} // bindTextureTrilinearAnisotropic
// ----------------------------------------------------------------------------
@ -84,10 +90,13 @@ void TextureShaderBase::bindCubemapTrilinear(unsigned tex_unit, unsigned tex)
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
{
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT,
(float)aniso);
}
} // bindCubemapTrilinear
// ----------------------------------------------------------------------------
@ -100,6 +109,7 @@ void TextureShaderBase::bindTextureNearestClamped(GLuint texture_unit,
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureNearestClamped
@ -114,6 +124,7 @@ void TextureShaderBase::bindTextureBilinear(GLuint texture_unit, GLuint tex)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureBilinear
@ -126,6 +137,7 @@ void TextureShaderBase::bindTextureBilinearClamped(GLuint tex_unit, GLuint tex)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureBilinearClamped
@ -138,6 +150,7 @@ void TextureShaderBase::bindTextureSemiTrilinear(GLuint tex_unit, GLuint tex_id)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureSemiTrilinear
@ -165,9 +178,13 @@ void TextureShaderBase::bindTrilinearClampedArrayTexture(unsigned tex_unit,
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (CVS->isEXTTextureFilterAnisotropicUsable())
{
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)aniso);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT,
(float)aniso);
}
} // bindTrilinearClampedArrayTexture
// ----------------------------------------------------------------------------
@ -179,6 +196,7 @@ void TextureShaderBase::bindTextureVolume(unsigned tex_unit, unsigned tex_id)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureVolume
@ -211,6 +229,7 @@ GLuint TextureShaderBase::createSamplers(SamplerTypeNew sampler_type)
glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return createNearestSampler();
}
@ -234,6 +253,7 @@ GLuint TextureShaderBase::createNearestSampler()
glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GL_REPEAT);
glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return id;
#endif
@ -250,9 +270,12 @@ GLuint TextureShaderBase::createTrilinearSampler()
glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GL_REPEAT);
glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
{
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)aniso);
}
return id;
#endif
} // createTrilinearSampler
@ -267,6 +290,7 @@ GLuint TextureShaderBase::createBilinearSampler()
glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GL_REPEAT);
glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GL_REPEAT);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return id;
#endif
@ -297,6 +321,7 @@ GLuint TextureShaderBase::createBilinearClampedSampler()
glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return id;
#endif
@ -314,9 +339,12 @@ GLuint TextureShaderBase::createTrilinearClampedArray()
glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (CVS->isEXTTextureFilterAnisotropicUsable())
{
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)aniso);
}
return id;
#endif
} // createTrilinearClampedArray
@ -330,6 +358,7 @@ GLuint TextureShaderBase::createSemiTrilinearSampler()
glSamplerParameteri(id, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return id;
#endif