From fe2ff3fc89332ddf8374b72e2f05f3f7015f8cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 22 Jun 2017 01:53:51 +0200 Subject: [PATCH] GPUTexture: Support for nearest sampling with mipmaps. --- source/blender/draw/intern/draw_manager.c | 6 ++++-- source/blender/gpu/GPU_texture.h | 2 +- source/blender/gpu/intern/gpu_texture.c | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 6d41893e50e..d01f7f5823e 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -390,11 +390,13 @@ static void drw_texture_get_format(DRWTextureFormat format, GPUTextureFormat *da static void drw_texture_set_parameters(GPUTexture *tex, DRWTextureFlag flags) { GPU_texture_bind(tex, 0); - GPU_texture_filter_mode(tex, flags & DRW_TEX_FILTER); if (flags & DRW_TEX_MIPMAP) { - GPU_texture_mipmap_mode(tex, true); + GPU_texture_mipmap_mode(tex, true, flags & DRW_TEX_FILTER); DRW_texture_generate_mipmaps(tex); } + else { + GPU_texture_filter_mode(tex, flags & DRW_TEX_FILTER); + } GPU_texture_wrap_mode(tex, flags & DRW_TEX_WRAP); GPU_texture_compare_mode(tex, flags & DRW_TEX_COMPARE); GPU_texture_unbind(tex); diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index 01390760beb..6d6c195c175 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -181,7 +181,7 @@ int GPU_texture_bound_number(GPUTexture *tex); void GPU_texture_generate_mipmap(GPUTexture *tex); void GPU_texture_compare_mode(GPUTexture *tex, bool use_compare); void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter); -void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap); +void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter); void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat); struct GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex); diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c index 3ac1571bf82..a8d0dccb896 100644 --- a/source/blender/gpu/intern/gpu_texture.c +++ b/source/blender/gpu/intern/gpu_texture.c @@ -856,7 +856,7 @@ void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter) glActiveTexture(GL_TEXTURE0); } -void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap) +void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap, bool use_filter) { if (tex->number >= GPU_max_textures()) { fprintf(stderr, "Not enough texture slots.\n"); @@ -869,7 +869,9 @@ void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap) if (tex->number != 0) glActiveTexture(GL_TEXTURE0 + tex->number); - GLenum mipmap = use_mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR; + GLenum mipmap = (use_filter) + ? use_mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR + : use_mipmap ? GL_NEAREST_MIPMAP_LINEAR : GL_NEAREST; glTexParameteri(tex->target_base, GL_TEXTURE_MIN_FILTER, mipmap); if (tex->number != 0)