1
0
mirror of https://github.com/libretro/RetroArch synced 2025-03-24 22:43:41 +00:00

Have menu_texture.c reuse gl_common.c's gl_load_texture_data

This commit is contained in:
twinaphex 2015-02-11 15:19:21 +01:00
parent b64584672f
commit f19339eb38
7 changed files with 86 additions and 59 deletions

@ -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);
}

@ -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);

@ -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)

@ -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)

@ -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)

@ -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;

@ -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