diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index cbfab98cfbf..755ddcc07f5 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -176,8 +176,10 @@ void GPU_texture_bind(GPUTexture *tex, int number); void GPU_texture_unbind(GPUTexture *tex); 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_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 6af238aaff4..525a2b3d5dc 100644 --- a/source/blender/gpu/intern/gpu_texture.c +++ b/source/blender/gpu/intern/gpu_texture.c @@ -722,6 +722,25 @@ int GPU_texture_bound_number(GPUTexture *tex) return tex->number; } +void GPU_texture_generate_mipmap(GPUTexture *tex) +{ + if (tex->number >= GPU_max_textures()) { + fprintf(stderr, "Not enough texture slots.\n"); + return; + } + + if (tex->number == -1) + return; + + if (tex->number != 0) + glActiveTexture(GL_TEXTURE0 + tex->number); + + glGenerateMipmap(tex->target_base); + + if (tex->number != 0) + glActiveTexture(GL_TEXTURE0); +} + void GPU_texture_compare_mode(GPUTexture *tex, bool use_compare) { if (tex->number >= GPU_max_textures()) { @@ -764,6 +783,26 @@ void GPU_texture_filter_mode(GPUTexture *tex, bool use_filter) glActiveTexture(GL_TEXTURE0); } +void GPU_texture_mipmap_mode(GPUTexture *tex, bool use_mipmap) +{ + if (tex->number >= GPU_max_textures()) { + fprintf(stderr, "Not enough texture slots.\n"); + return; + } + + if (tex->number == -1) + return; + + if (tex->number != 0) + glActiveTexture(GL_TEXTURE0 + tex->number); + + GLenum mipmap = use_mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR; + glTexParameteri(tex->target_base, GL_TEXTURE_MIN_FILTER, mipmap); + + if (tex->number != 0) + glActiveTexture(GL_TEXTURE0); +} + void GPU_texture_wrap_mode(GPUTexture *tex, bool use_repeat) { if (tex->number >= GPU_max_textures()) {