From ccf1bad426deae7c795df7a92fbea71f8ea322fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=B6glund?= Date: Wed, 10 Dec 2014 20:16:40 +0100 Subject: [PATCH] Make mipmap filters other than GL_LINEAR_MIPMAP_LINEAR work GLTexture would set both the minification and magnification filters to GL_NEAREST if the texture filter was set to any mipmap filter other than GL_LINEAR_MIPMAP_LINEAR. --- libkwineffects/kwingltexture.cpp | 46 +++++++++++++++++++------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/libkwineffects/kwingltexture.cpp b/libkwineffects/kwingltexture.cpp index 6a56474f0a..8eb8a82984 100644 --- a/libkwineffects/kwingltexture.cpp +++ b/libkwineffects/kwingltexture.cpp @@ -306,26 +306,34 @@ void GLTexture::bind() d->onDamage(); } if (d->m_filterChanged) { - if (d->m_filter == GL_LINEAR_MIPMAP_LINEAR) { - // trilinear filtering requested, but is it possible? - if (d->s_supportsFramebufferObjects && d->m_canUseMipmaps) { - glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } else { - // can't use trilinear, so use bilinear - d->m_filter = GL_LINEAR; - glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } - } else if (d->m_filter == GL_LINEAR) { - glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } else { - // if neither trilinear nor bilinear, default to fast filtering - d->m_filter = GL_NEAREST; - glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + GLenum minFilter = GL_NEAREST; + GLenum magFilter = GL_NEAREST; + + switch (d->m_filter) { + case GL_NEAREST: + minFilter = magFilter = GL_NEAREST; + break; + + case GL_LINEAR: + minFilter = magFilter = GL_LINEAR; + break; + + case GL_NEAREST_MIPMAP_NEAREST: + case GL_NEAREST_MIPMAP_LINEAR: + magFilter = GL_NEAREST; + minFilter = d->m_canUseMipmaps ? d->m_filter : GL_NEAREST; + break; + + case GL_LINEAR_MIPMAP_NEAREST: + case GL_LINEAR_MIPMAP_LINEAR: + magFilter = GL_LINEAR; + minFilter = d->m_canUseMipmaps ? d->m_filter : GL_LINEAR; + break; } + + glTexParameteri(d->m_target, GL_TEXTURE_MIN_FILTER, minFilter); + glTexParameteri(d->m_target, GL_TEXTURE_MAG_FILTER, magFilter); + d->m_filterChanged = false; } if (d->m_wrapModeChanged) {