From c9d32e14ab93f00829803348cdbb8f52b717531a Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Sun, 2 Nov 2025 01:19:47 +0300 Subject: [PATCH] render: handle mipmaps properly Signed-off-by: NotAShelf Change-Id: I43de088ca17559648d67e728db1179cf6a6a6964 --- src/render.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/render.c b/src/render.c index be9f98a..4a77185 100644 --- a/src/render.c +++ b/src/render.c @@ -10,27 +10,33 @@ // Convert filter quality enum to OpenGL parameters static void get_gl_filter_params(chroma_filter_quality_t quality, - GLint *min_filter, GLint *mag_filter) { + GLint *min_filter, GLint *mag_filter, + bool *needs_mipmaps) { switch (quality) { case CHROMA_FILTER_NEAREST: *min_filter = GL_NEAREST; *mag_filter = GL_NEAREST; + *needs_mipmaps = false; break; case CHROMA_FILTER_LINEAR: *min_filter = GL_LINEAR; *mag_filter = GL_LINEAR; + *needs_mipmaps = false; break; case CHROMA_FILTER_BILINEAR: - *min_filter = GL_LINEAR_MIPMAP_LINEAR; + *min_filter = GL_LINEAR; *mag_filter = GL_LINEAR; + *needs_mipmaps = false; break; case CHROMA_FILTER_TRILINEAR: *min_filter = GL_LINEAR_MIPMAP_LINEAR; *mag_filter = GL_LINEAR; + *needs_mipmaps = true; break; default: *min_filter = GL_LINEAR; *mag_filter = GL_LINEAR; + *needs_mipmaps = false; break; } } @@ -324,7 +330,9 @@ static int update_texture_from_image(chroma_output_t *output, // Use configured filter quality GLint min_filter, mag_filter; - get_gl_filter_params(filter_quality, &min_filter, &mag_filter); + bool needs_mipmaps; + get_gl_filter_params(filter_quality, &min_filter, &mag_filter, + &needs_mipmaps); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); @@ -332,6 +340,12 @@ static int update_texture_from_image(chroma_output_t *output, glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->width, image->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->data); + // Generate mipmaps for trilinear filtering if they're needed + if (needs_mipmaps) { + glGenerateMipmap(GL_TEXTURE_2D); + chroma_log("DEBUG", "Generated mipmaps for trilinear filtering"); + } + glBindTexture(GL_TEXTURE_2D, 0); // Mark this output as having uploaded its texture