From f19339eb38b7cbb39f51bf439cacb8612604556e Mon Sep 17 00:00:00 2001 From: twinaphex <libretro@gmail.com> Date: Wed, 11 Feb 2015 15:19:21 +0100 Subject: [PATCH] Have menu_texture.c reuse gl_common.c's gl_load_texture_data --- gfx/gl_common.c | 78 ++++++++++++++++++++++++++++++++++----------- gfx/gl_common.h | 6 ++-- gfx/video_driver.h | 7 ++++ menu/drivers/glui.c | 5 +-- menu/drivers/xmb.c | 6 ++-- menu/menu_texture.c | 35 ++++---------------- menu/menu_texture.h | 8 ++--- 7 files changed, 86 insertions(+), 59 deletions(-) diff --git a/gfx/gl_common.c b/gfx/gl_common.c index 9dfbe2aa7d..0d72fd7d2b 100644 --- a/gfx/gl_common.c +++ b/gfx/gl_common.c @@ -16,20 +16,49 @@ #include "gl_common.h" -void gl_load_texture_data(GLuint obj, const struct texture_image *img, - GLenum wrap, bool linear, bool mipmap) +void gl_load_texture_data(GLuint id, + const struct texture_image *img, + enum gfx_wrap_type wrap_type, + enum texture_filter_type filter_type) { - glBindTexture(GL_TEXTURE_2D, obj); + GLint mag_filter, min_filter; + GLenum wrap; + bool want_mipmap = false; + + glBindTexture(GL_TEXTURE_2D, id); + + wrap = driver.video->wrap_type_to_enum(wrap_type); -#ifdef HAVE_PSGL - mipmap = false; -#endif glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap); - GLint mag_filter = linear ? GL_LINEAR : GL_NEAREST; - GLint min_filter = linear ? (mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR) : - (mipmap ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST); + switch (filter_type) + { + case TEXTURE_FILTER_MIPMAP_LINEAR: + min_filter = GL_LINEAR_MIPMAP_LINEAR; + mag_filter = GL_LINEAR; +#ifndef HAVE_PSGL + want_mipmap = true; +#endif + break; + case TEXTURE_FILTER_MIPMAP_NEAREST: + min_filter = GL_NEAREST_MIPMAP_NEAREST; + mag_filter = GL_NEAREST; +#ifndef HAVE_PSGL + want_mipmap = true; +#endif + break; + case TEXTURE_FILTER_NEAREST: + min_filter = GL_NEAREST; + mag_filter = GL_NEAREST; + break; + case TEXTURE_FILTER_LINEAR: + default: + min_filter = GL_LINEAR; + mag_filter = GL_LINEAR; + break; + } + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); @@ -37,14 +66,14 @@ void gl_load_texture_data(GLuint obj, const struct texture_image *img, glPixelStorei(GL_UNPACK_ALIGNMENT, 4); #endif glTexImage2D(GL_TEXTURE_2D, - 0, driver.gfx_use_rgba ? GL_RGBA : RARCH_GL_INTERNAL_FORMAT32, - img->width, img->height, - 0, driver.gfx_use_rgba ? GL_RGBA : RARCH_GL_TEXTURE_TYPE32, + 0, + driver.gfx_use_rgba ? GL_RGBA : RARCH_GL_INTERNAL_FORMAT32, + img->width, img->height, 0, + driver.gfx_use_rgba ? GL_RGBA : RARCH_GL_TEXTURE_TYPE32, RARCH_GL_FORMAT32, img->pixels); -#ifndef HAVE_PSGL - if (mipmap) + + if (want_mipmap) glGenerateMipmap(GL_TEXTURE_2D); -#endif } bool gl_load_luts(const struct video_shader *generic_shader, @@ -60,9 +89,12 @@ bool gl_load_luts(const struct video_shader *generic_shader, * texture handle. I assume it was a bug, but if not, * replace num_luts with 1 when GLSL is used. */ glGenTextures(num_luts, textures_lut); + for (i = 0; i < num_luts; i++) { struct texture_image img = {0}; + enum texture_filter_type filter_type = TEXTURE_FILTER_LINEAR; + RARCH_LOG("Loading texture image from: \"%s\" ...\n", generic_shader->lut[i].path); @@ -73,10 +105,20 @@ bool gl_load_luts(const struct video_shader *generic_shader, return false; } + if (generic_shader->lut[i].filter == RARCH_FILTER_NEAREST) + filter_type = TEXTURE_FILTER_NEAREST; + + if (generic_shader->lut[i].mipmap) + { + if (filter_type == TEXTURE_FILTER_NEAREST) + filter_type = TEXTURE_FILTER_MIPMAP_NEAREST; + else + filter_type = TEXTURE_FILTER_MIPMAP_LINEAR; + } + gl_load_texture_data(textures_lut[i], &img, - driver.video->wrap_type_to_enum(generic_shader->lut[i].wrap), - generic_shader->lut[i].filter != RARCH_FILTER_NEAREST, - generic_shader->lut[i].mipmap); + generic_shader->lut[i].wrap, + filter_type); texture_image_free(&img); } diff --git a/gfx/gl_common.h b/gfx/gl_common.h index dd589d9f5b..a7b0261ee7 100644 --- a/gfx/gl_common.h +++ b/gfx/gl_common.h @@ -403,8 +403,10 @@ static inline bool gl_check_error(void) void gl_set_viewport(gl_t *gl, unsigned width, unsigned height, bool force_full, bool allow_rotate); -void gl_load_texture_data(GLuint obj, const struct texture_image *img, - GLenum wrap, bool linear, bool mipmap); +void gl_load_texture_data(GLuint id, + const struct texture_image *img, + enum gfx_wrap_type wrap_type, + enum texture_filter_type filter_type); bool gl_load_luts(const struct video_shader *generic_shader, GLuint *lut_textures); diff --git a/gfx/video_driver.h b/gfx/video_driver.h index dfacbc979c..bde75854ce 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -74,6 +74,13 @@ struct font_params bool align_right; }; +enum texture_filter_type +{ + TEXTURE_FILTER_LINEAR = 0, + TEXTURE_FILTER_NEAREST, + TEXTURE_FILTER_MIPMAP_LINEAR, + TEXTURE_FILTER_MIPMAP_NEAREST, +}; #define FONT_COLOR_RGBA(r, g, b, a) (((r) << 0) | ((g) << 8) | ((b) << 16) | ((a) << 24)) #define FONT_COLOR_GET_RED(col) (((col) >> 0) & 0xff) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index e08fef8d01..fecb46fbb8 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -492,8 +492,9 @@ static void glui_context_reset(void *data) fill_pathname_join(bgpath, bgpath, "bg.png", sizeof(bgpath)); if (path_file_exists(bgpath)) - glui->bg = (GLuint)menu_texture_load(bgpath, TEXTURE_BACKEND_OPENGL, - TEXTURE_FILTER_DEFAULT); + glui->bg = (GLuint)menu_texture_load(bgpath, + TEXTURE_BACKEND_OPENGL, + TEXTURE_FILTER_LINEAR); } static void glui_navigation_clear(void *data, bool pending_push) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index f82d83704e..56e7e8373d 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1272,7 +1272,7 @@ static void xmb_context_reset(void *data) for (k = 0; k < XMB_TEXTURE_LAST; k++) xmb->textures[k].id = menu_texture_load(xmb->textures[k].path, - TEXTURE_BACKEND_OPENGL, TEXTURE_FILTER_MIPMAP); + TEXTURE_BACKEND_OPENGL, TEXTURE_FILTER_MIPMAP_LINEAR); xmb->settings_node.icon = xmb->textures[XMB_TEXTURE_SETTINGS].id; xmb->settings_node.alpha = xmb->c_active_alpha; @@ -1318,9 +1318,9 @@ static void xmb_context_reset(void *data) node->alpha = 0; node->zoom = xmb->c_passive_zoom; node->icon = menu_texture_load(texturepath, - TEXTURE_BACKEND_OPENGL, TEXTURE_FILTER_MIPMAP); + TEXTURE_BACKEND_OPENGL, TEXTURE_FILTER_MIPMAP_LINEAR); node->content_icon = menu_texture_load(content_texturepath, - TEXTURE_BACKEND_OPENGL, TEXTURE_FILTER_MIPMAP); + TEXTURE_BACKEND_OPENGL, TEXTURE_FILTER_MIPMAP_LINEAR); if (i == xmb->active_category) diff --git a/menu/menu_texture.c b/menu/menu_texture.c index 817d032029..2b875cf6c8 100644 --- a/menu/menu_texture.c +++ b/menu/menu_texture.c @@ -28,30 +28,8 @@ static void menu_texture_png_load_gl(struct texture_image *ti, { /* Generate the OpenGL texture object */ glGenTextures(1, id); - glBindTexture(GL_TEXTURE_2D, (GLuint)*id); - glTexImage2D(GL_TEXTURE_2D, 0, driver.gfx_use_rgba ? - GL_RGBA : RARCH_GL_INTERNAL_FORMAT32, - ti->width, ti->height, 0, - driver.gfx_use_rgba ? GL_RGBA : RARCH_GL_TEXTURE_TYPE32, - RARCH_GL_FORMAT32, ti->pixels); - - switch (filter_type) - { - case TEXTURE_FILTER_MIPMAP: - glTexParameterf(GL_TEXTURE_2D, - GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); - glTexParameterf(GL_TEXTURE_2D, - GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glGenerateMipmap(GL_TEXTURE_2D); - break; - case TEXTURE_FILTER_DEFAULT: - default: - glTexParameterf(GL_TEXTURE_2D, - GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, - GL_TEXTURE_MAG_FILTER, GL_LINEAR); - break; - } + gl_load_texture_data((GLuint)*id, + ti, RARCH_WRAP_EDGE, filter_type); } #endif @@ -89,7 +67,7 @@ static int menu_texture_png_load_wrap(void *data) if (!filename) return 0; return menu_texture_png_load(filename, TEXTURE_BACKEND_DEFAULT, - TEXTURE_FILTER_DEFAULT); + TEXTURE_FILTER_LINEAR); } static int menu_texture_png_load_wrap_gl_mipmap(void *data) @@ -98,7 +76,7 @@ static int menu_texture_png_load_wrap_gl_mipmap(void *data) if (!filename) return 0; return menu_texture_png_load(filename, TEXTURE_BACKEND_OPENGL, - TEXTURE_FILTER_MIPMAP); + TEXTURE_FILTER_MIPMAP_LINEAR); } static int menu_texture_png_load_wrap_gl(void *data) @@ -107,7 +85,7 @@ static int menu_texture_png_load_wrap_gl(void *data) if (!filename) return 0; return menu_texture_png_load(filename, TEXTURE_BACKEND_OPENGL, - TEXTURE_FILTER_DEFAULT); + TEXTURE_FILTER_LINEAR); } unsigned menu_texture_load(const char *path, @@ -125,7 +103,8 @@ unsigned menu_texture_load(const char *path, switch (type) { case TEXTURE_BACKEND_OPENGL: - if (filter_type == TEXTURE_FILTER_MIPMAP) + if (filter_type == TEXTURE_FILTER_MIPMAP_LINEAR || + filter_type == TEXTURE_FILTER_MIPMAP_NEAREST) thr->cmd_data.custom_command.method = menu_texture_png_load_wrap_gl_mipmap; else thr->cmd_data.custom_command.method = menu_texture_png_load_wrap_gl; diff --git a/menu/menu_texture.h b/menu/menu_texture.h index d5ef3ffd22..202eac5006 100644 --- a/menu/menu_texture.h +++ b/menu/menu_texture.h @@ -17,18 +17,14 @@ #ifndef _MENU_TEXTURE_MANAGER_H #define _MENU_TEXTURE_MANAGER_H +#include "../gfx/video_driver.h" + enum texture_backend_type { TEXTURE_BACKEND_DEFAULT = 0, TEXTURE_BACKEND_OPENGL, }; -enum texture_filter_type -{ - TEXTURE_FILTER_DEFAULT = 0, - TEXTURE_FILTER_MIPMAP, -}; - #ifdef __cplusplus extern "C" { #endif