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,7 +49,8 @@ void CentralVideoSettings::init()
hasUBO = false;
hasExplicitAttribLocation = false;
hasGS = false;
hasTextureFilterAnisotropic = false;
#if defined(USE_GLES2)
hasBGRA = false;
hasColorBufferFloat = false;
@ -89,7 +90,7 @@ void CentralVideoSettings::init()
std::string card((char*)(glGetString(GL_RENDERER)));
GraphicsRestrictions::init(driver, card);
#if !defined(USE_GLES2)
#if !defined(USE_GLES2)
if (hasGLExtension("GL_AMD_vertex_shader_layer")) {
hasVSLayer = true;
Log::info("GLDriver", "AMD Vertex Shader Layer Present");
@ -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;
@ -223,7 +229,7 @@ void CentralVideoSettings::init()
hasAtomics = true;
hasSSBO = true;
}
if (!GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_TEXTURE_FORMAT_BGRA8888) &&
(hasGLExtension("GL_IMG_texture_format_BGRA8888") ||
hasGLExtension("GL_EXT_texture_format_BGRA8888")))
@ -231,7 +237,7 @@ void CentralVideoSettings::init()
hasBGRA = true;
Log::info("GLDriver", "EXT texture format BGRA8888 Present");
}
if (!GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_COLOR_BUFFER_FLOAT) &&
hasGLExtension("GL_EXT_color_buffer_float"))
{
@ -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,7 +42,8 @@ private:
bool hasSSBO;
bool hasImageLoadStore;
bool hasMultiDrawIndirect;
bool hasTextureFilterAnisotropic;
#if defined(USE_GLES2)
bool hasBGRA;
bool hasColorBufferFloat;
@ -80,7 +81,8 @@ public:
bool isARBImageLoadStoreUsable() const;
bool isARBMultiDrawIndirectUsable() const;
bool isARBExplicitAttribLocationUsable() const;
bool isEXTTextureFilterAnisotropicUsable() const;
#if defined(USE_GLES2)
bool isEXTTextureFormatBGRA8888Usable() const;
bool isEXTColorBufferFloatUsable() const;

View File

@ -57,6 +57,7 @@ namespace GraphicsRestrictions
"TextureCompressionS3TC",
"AMDVertexShaderLayer",
"ExplicitAttribLocation",
"TextureFilterAnisotropic",
#if defined(USE_GLES2)
"TextureFormatBGRA8888",
"ColorBufferFloat",
@ -215,7 +216,7 @@ public:
convertVersionString(s[0]);
return;
}
Log::warn("Graphics", "Can not find version for '%s' '%s' - ignored.",
driver_version.c_str(), card_name.c_str());
@ -299,7 +300,7 @@ public:
{
m_version_test = VERSION_IGNORE;
m_card_test = CARD_IGNORE;
if(rule->get("is", &m_card_name))
{
m_card_test = CARD_IS;

View File

@ -32,7 +32,7 @@ namespace GraphicsRestrictions
* the variable m_names_of_restrictions in the cpp file contains the
* string representation used in the XML files. Any change to this
* type declaration needs a change in that variable as well. */
enum GraphicsRestrictionsType
enum GraphicsRestrictionsType
{
GR_UNIFORM_BUFFER_OBJECT,
GR_GEOMETRY_SHADER,
@ -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"
@ -33,7 +34,7 @@ TextureShaderBase::BindFunction TextureShaderBase::m_all_bind_functions[] =
/* ST_SEMI_TRILINEAR */ &TextureShaderBase::bindTextureSemiTrilinear
};
GLuint TextureShaderBase::m_all_texture_types[] =
GLuint TextureShaderBase::m_all_texture_types[] =
{ /* ST_NEAREST_FILTERED */ GL_TEXTURE_2D,
/* ST_TRILINEAR_ANISOTROPIC_FILTERED */ GL_TEXTURE_2D,
/* ST_TRILINEAR_CUBEMAP */ GL_TEXTURE_CUBE_MAP,
@ -55,7 +56,8 @@ 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);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
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);
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)aniso);
if (CVS->isEXTTextureFilterAnisotropicUsable())
{
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
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);
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT,
(float)aniso);
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,7 +109,8 @@ 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);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureNearestClamped
// ----------------------------------------------------------------------------
@ -114,7 +124,8 @@ 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);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureBilinear
// ----------------------------------------------------------------------------
@ -126,7 +137,8 @@ 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);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureBilinearClamped
// ----------------------------------------------------------------------------
@ -138,7 +150,8 @@ 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);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
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);
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)aniso);
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);
}
} // bindTrilinearClampedArrayTexture
// ----------------------------------------------------------------------------
@ -179,7 +196,8 @@ 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);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
} // bindTextureVolume
// ----------------------------------------------------------------------------
@ -211,7 +229,8 @@ 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);
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return createNearestSampler();
}
case ST_BILINEAR_CLAMPED_FILTERED:
@ -234,7 +253,8 @@ 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);
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return id;
#endif
} // createNearestSampler
@ -250,9 +270,12 @@ GLuint TextureShaderBase::createTrilinearSampler()
glSamplerParameteri(id, GL_TEXTURE_WRAP_S, GL_REPEAT);
glSamplerParameteri(id, GL_TEXTURE_WRAP_T, GL_REPEAT);
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)aniso);
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,7 +290,8 @@ 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);
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return id;
#endif
} // createBilinearSampler
@ -297,7 +321,8 @@ 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);
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return id;
#endif
} // createBilinearClampedSampler
@ -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);
int aniso = UserConfigParams::m_anisotropic;
if (aniso == 0) aniso = 1;
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)aniso);
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,7 +358,8 @@ 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);
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
if (CVS->isEXTTextureFilterAnisotropicUsable())
glSamplerParameterf(id, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.);
return id;
#endif
} // createSemiTrilinearSampler