From 7c37a32897712649fdbeb7b1a37f0957b2fb9fa3 Mon Sep 17 00:00:00 2001 From: clayjohn Date: Mon, 26 Jun 2023 10:45:24 -0700 Subject: [PATCH] Use a filter with mipmaps when initializing textures with mipmaps in GL Compatibility renderer This works around a driver bug in some older devices and should be harmless on any spec-compliant device --- drivers/gles3/storage/texture_storage.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp index 8a57476a739a..305be687064c 100644 --- a/drivers/gles3/storage/texture_storage.cpp +++ b/drivers/gles3/storage/texture_storage.cpp @@ -1249,10 +1249,6 @@ void TextureStorage::_texture_set_data(RID p_texture, const Ref &p_image, glActiveTexture(GL_TEXTURE0); glBindTexture(texture->target, texture->tex_id); - // set filtering and repeat state to default - texture->gl_set_filter(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST); - texture->gl_set_repeat(RS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED); - #ifndef WEB_ENABLED switch (texture->format) { #ifdef GLES_OVER_GL @@ -1294,6 +1290,15 @@ void TextureStorage::_texture_set_data(RID p_texture, const Ref &p_image, int mipmaps = img->has_mipmaps() ? img->get_mipmap_count() + 1 : 1; + // Set filtering and repeat state to default. + if (mipmaps > 1) { + texture->gl_set_filter(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST_WITH_MIPMAPS); + } else { + texture->gl_set_filter(RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST); + } + + texture->gl_set_repeat(RS::CANVAS_ITEM_TEXTURE_REPEAT_ENABLED); + int w = img->get_width(); int h = img->get_height();