diff --git a/src/glimports.h b/src/glimports.h index 7dd5616b6..35e1ba445 100644 --- a/src/glimports.h +++ b/src/glimports.h @@ -18,6 +18,7 @@ GL_IMPORT(false, PFNGLTEXIMAGE2DPROC, glTexImage2D); GL_IMPORT(false, PFNGLTEXSUBIMAGE2DPROC, glTexSubImage2D); GL_IMPORT(false, PFNGLPIXELSTOREI, glPixelStorei); GL_IMPORT(false, PFNGLTEXPARAMETERIPROC, glTexParameteri); +GL_IMPORT(false, PFNGLTEXPARAMETERFPROC, glTexParameterf); GL_IMPORT(false, PFNGLBINDTEXTUREPROC, glBindTexture); GL_IMPORT(false, PFNGLGENTEXTURESPROC, glGenTextures); GL_IMPORT(false, PFNGLDELETETEXTURESPROC, glDeleteTextures); @@ -27,6 +28,7 @@ GL_IMPORT(false, PFNGLDISABLEPROC, glDisable); GL_IMPORT(false, PFNGLVIEWPORTPROC, glViewport); GL_IMPORT(false, PFNGLDRAWELEMENTSPROC, glDrawElements); GL_IMPORT(false, PFNGLGETINTEGERVPROC, glGetIntegerv); +GL_IMPORT(false, PFNGLGETFLOATVPROC, glGetFloatv); GL_IMPORT(false, PFNGLGETSTRINGPROC, glGetString); GL_IMPORT(false, PFNGLDRAWARRAYSPROC, glDrawArrays); GL_IMPORT(false, PFNGLBLENDFUNCPROC, glBlendFunc); diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index cf545a28c..645222fb9 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -77,7 +77,8 @@ namespace bgfx struct RendererContext { RendererContext() - : m_dxtSupport(false) + : m_maxAnisotropy(0.0f) + , m_dxtSupport(false) , m_programBinarySupport(false) , m_flip(false) , m_postSwapBuffers(NULL) @@ -530,6 +531,7 @@ namespace bgfx TextVideoMem m_textVideoMem; Resolution m_resolution; + float m_maxAnisotropy; bool m_dxtSupport; bool m_programBinarySupport; bool m_flip; @@ -615,6 +617,7 @@ namespace bgfx { enum Enum { + EXT_texture_filter_anisotropic, EXT_texture_format_BGRA8888, EXT_texture_compression_s3tc, EXT_texture_compression_dxt1, @@ -659,6 +662,7 @@ namespace bgfx static Extension s_extension[Extension::Count] = { + { "GL_EXT_texture_filter_anisotropic", false, true }, // Nvidia BGRA on Linux bug: // https://groups.google.com/a/chromium.org/forum/?fromgroups#!topic/chromium-reviews/yFfbUdyeUCQ { "GL_EXT_texture_format_BGRA8888", false, !BX_PLATFORM_LINUX }, @@ -1567,6 +1571,11 @@ namespace bgfx GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, s_textureFilter[(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT]) ); GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, s_textureFilter[(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT]) ); GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, 1 < numMips ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR) ); + if (0 != (_flags & (BGFX_TEXTURE_MIN_ANISOTROPIC|BGFX_TEXTURE_MAG_ANISOTROPIC) ) + && 0.0f < s_renderCtx.m_maxAnisotropy) + { + glTexParameterf(m_target, GL_TEXTURE_MAX_ANISOTROPY_EXT, s_renderCtx.m_maxAnisotropy); + } GL_CHECK(glBindTexture(m_target, 0) ); } @@ -2086,6 +2095,11 @@ namespace bgfx || s_extension[Extension::ARB_get_program_binary].m_supported || s_extension[Extension::OES_get_program_binary].m_supported ; + + if (s_extension[Extension::EXT_texture_filter_anisotropic].m_supported) + { + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &s_renderCtx.m_maxAnisotropy); + } } } diff --git a/src/renderer_gl.h b/src/renderer_gl.h index 4747031d5..6adcb865a 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -119,6 +119,14 @@ # define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 # endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE +# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT +# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +# endif // GL_TEXTURE_MAX_ANISOTROPY_EXT + +# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT +# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +# endif // GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT + typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); #endif // BGFX_CONFIG_RENDERER_OPENGL @@ -150,6 +158,7 @@ typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, G typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLPIXELSTOREI) (GLenum pname, GLint param); typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); @@ -160,6 +169,7 @@ typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap); typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *params); typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);