mirror of
https://github.com/libretro/RetroArch
synced 2025-02-21 09:39:56 +00:00
Rework overlays as a video driver interface.
This commit is contained in:
parent
c981cb77f8
commit
b4cd58afe7
10
driver.h
10
driver.h
@ -205,6 +205,14 @@ typedef struct input_driver
|
|||||||
|
|
||||||
struct rarch_viewport;
|
struct rarch_viewport;
|
||||||
|
|
||||||
|
typedef struct video_overlay_interface
|
||||||
|
{
|
||||||
|
void (*enable)(void *data, bool state);
|
||||||
|
bool (*load)(void *data, const char *path);
|
||||||
|
void (*tex_geom)(void *data, float x, float y, float w, float h);
|
||||||
|
void (*vertex_geom)(void *data, float x, float y, float w, float h);
|
||||||
|
} video_overlay_interface_t;
|
||||||
|
|
||||||
typedef struct video_driver
|
typedef struct video_driver
|
||||||
{
|
{
|
||||||
void *(*init)(const video_info_t *video, const input_driver_t **input, void **input_data);
|
void *(*init)(const video_info_t *video, const input_driver_t **input, void **input_data);
|
||||||
@ -232,6 +240,8 @@ typedef struct video_driver
|
|||||||
|
|
||||||
// Reads out in BGR byte order (24bpp).
|
// Reads out in BGR byte order (24bpp).
|
||||||
bool (*read_viewport)(void *data, uint8_t *buffer);
|
bool (*read_viewport)(void *data, uint8_t *buffer);
|
||||||
|
|
||||||
|
void (*overlay_interface)(void *data, const video_overlay_interface_t **iface);
|
||||||
} video_driver_t;
|
} video_driver_t;
|
||||||
|
|
||||||
enum rarch_display_type
|
enum rarch_display_type
|
||||||
|
56
gfx/gl.c
56
gfx/gl.c
@ -77,6 +77,12 @@ static const GLfloat tex_coords[] = {
|
|||||||
1, 1
|
1, 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void gl_render_overlay(gl_t *gl);
|
||||||
|
static void gl_overlay_vertex_geom(void *data,
|
||||||
|
float x, float y, float w, float h);
|
||||||
|
static void gl_overlay_tex_geom(void *data,
|
||||||
|
float x, float y, float w, float h);
|
||||||
|
|
||||||
static inline void set_texture_coords(GLfloat *coords, GLfloat xamt, GLfloat yamt)
|
static inline void set_texture_coords(GLfloat *coords, GLfloat xamt, GLfloat yamt)
|
||||||
{
|
{
|
||||||
coords[2] = xamt;
|
coords[2] = xamt;
|
||||||
@ -1185,7 +1191,8 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei
|
|||||||
|
|
||||||
if (gl->ctx_driver->post_render)
|
if (gl->ctx_driver->post_render)
|
||||||
context_post_render_func(gl);
|
context_post_render_func(gl);
|
||||||
//gl_render_overlay(gl);
|
else if (gl->overlay_enable)
|
||||||
|
gl_render_overlay(gl);
|
||||||
|
|
||||||
#if !defined(RARCH_CONSOLE)
|
#if !defined(RARCH_CONSOLE)
|
||||||
context_update_window_title_func(false);
|
context_update_window_title_func(false);
|
||||||
@ -1555,9 +1562,6 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
|
|||||||
|
|
||||||
gl_init_pbo_readback(gl);
|
gl_init_pbo_readback(gl);
|
||||||
|
|
||||||
//gl_load_overlay(gl, "/mnt/extsd/basic_quickmenu.tga");
|
|
||||||
//gl_set_overlay_vertex_coord(gl, 0, 0, 1.0, 1.0);
|
|
||||||
|
|
||||||
if (!gl_check_error())
|
if (!gl_check_error())
|
||||||
{
|
{
|
||||||
context_destroy_func();
|
context_destroy_func();
|
||||||
@ -1788,8 +1792,10 @@ static void gl_set_aspect_ratio(void *data, unsigned aspectratio_index)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool gl_load_overlay(gl_t *gl, const char *path)
|
static bool gl_overlay_load(void *data, const char *path)
|
||||||
{
|
{
|
||||||
|
gl_t *gl = (gl_t*)data;
|
||||||
|
|
||||||
if (!gl->tex_overlay)
|
if (!gl->tex_overlay)
|
||||||
glGenTextures(1, &gl->tex_overlay);
|
glGenTextures(1, &gl->tex_overlay);
|
||||||
|
|
||||||
@ -1812,25 +1818,29 @@ bool gl_load_overlay(gl_t *gl, const char *path)
|
|||||||
RARCH_GL_FORMAT32, img.pixels);
|
RARCH_GL_FORMAT32, img.pixels);
|
||||||
|
|
||||||
free(img.pixels);
|
free(img.pixels);
|
||||||
gl_set_overlay_tex_coord(gl, 0, 0, 1, 1); // Default. Stretch to whole screen.
|
gl_overlay_tex_geom(gl, 0, 0, 1, 1); // Default. Stretch to whole screen.
|
||||||
gl_set_overlay_vertex_coord(gl, 0, 0, 1, 1);
|
gl_overlay_vertex_geom(gl, 0, 0, 1, 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gl_set_overlay_tex_coord(gl_t *gl,
|
static void gl_overlay_tex_geom(void *data,
|
||||||
GLfloat x, GLfloat y,
|
GLfloat x, GLfloat y,
|
||||||
GLfloat w, GLfloat h)
|
GLfloat w, GLfloat h)
|
||||||
{
|
{
|
||||||
|
gl_t *gl = (gl_t*)data;
|
||||||
|
|
||||||
gl->overlay_tex_coord[0] = x; gl->overlay_tex_coord[1] = y;
|
gl->overlay_tex_coord[0] = x; gl->overlay_tex_coord[1] = y;
|
||||||
gl->overlay_tex_coord[2] = x + w; gl->overlay_tex_coord[3] = y;
|
gl->overlay_tex_coord[2] = x + w; gl->overlay_tex_coord[3] = y;
|
||||||
gl->overlay_tex_coord[4] = x; gl->overlay_tex_coord[5] = y + h;
|
gl->overlay_tex_coord[4] = x; gl->overlay_tex_coord[5] = y + h;
|
||||||
gl->overlay_tex_coord[6] = x + w; gl->overlay_tex_coord[7] = y + h;
|
gl->overlay_tex_coord[6] = x + w; gl->overlay_tex_coord[7] = y + h;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gl_set_overlay_vertex_coord(gl_t *gl,
|
static void gl_overlay_vertex_geom(void *data,
|
||||||
GLfloat x, GLfloat y,
|
float x, float y,
|
||||||
GLfloat w, GLfloat h)
|
float w, float h)
|
||||||
{
|
{
|
||||||
|
gl_t *gl = (gl_t*)data;
|
||||||
|
|
||||||
// Flipped, so we preserve top-down semantics.
|
// Flipped, so we preserve top-down semantics.
|
||||||
y = 1.0f - y;
|
y = 1.0f - y;
|
||||||
h = -h;
|
h = -h;
|
||||||
@ -1841,7 +1851,13 @@ void gl_set_overlay_vertex_coord(gl_t *gl,
|
|||||||
gl->overlay_vertex_coord[6] = x + w; gl->overlay_vertex_coord[7] = y + h;
|
gl->overlay_vertex_coord[6] = x + w; gl->overlay_vertex_coord[7] = y + h;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gl_render_overlay(gl_t *gl)
|
static void gl_overlay_enable(void *data, bool state)
|
||||||
|
{
|
||||||
|
gl_t *gl = (gl_t*)data;
|
||||||
|
gl->overlay_enable = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gl_render_overlay(gl_t *gl)
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, gl->tex_overlay);
|
glBindTexture(GL_TEXTURE_2D, gl->tex_overlay);
|
||||||
|
|
||||||
@ -1858,6 +1874,19 @@ void gl_render_overlay(gl_t *gl)
|
|||||||
gl->coords.tex_coord = gl->tex_coords;
|
gl->coords.tex_coord = gl->tex_coords;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const video_overlay_interface_t gl_overlay_interface = {
|
||||||
|
gl_overlay_enable,
|
||||||
|
gl_overlay_load,
|
||||||
|
gl_overlay_tex_geom,
|
||||||
|
gl_overlay_vertex_geom,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void gl_get_overlay_interface(void *data, const video_overlay_interface_t **iface)
|
||||||
|
{
|
||||||
|
(void)data;
|
||||||
|
*iface = &gl_overlay_interface;
|
||||||
|
}
|
||||||
|
|
||||||
const video_driver_t video_gl = {
|
const video_driver_t video_gl = {
|
||||||
gl_init,
|
gl_init,
|
||||||
gl_frame,
|
gl_frame,
|
||||||
@ -1891,5 +1920,8 @@ const video_driver_t video_gl = {
|
|||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
gl_get_overlay_interface,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -281,6 +281,7 @@ typedef struct gl
|
|||||||
bool egl_images;
|
bool egl_images;
|
||||||
|
|
||||||
// Overlay rendering
|
// Overlay rendering
|
||||||
|
bool overlay_enable;
|
||||||
GLuint tex_overlay;
|
GLuint tex_overlay;
|
||||||
GLfloat overlay_tex_coord[8];
|
GLfloat overlay_tex_coord[8];
|
||||||
GLfloat overlay_vertex_coord[8];
|
GLfloat overlay_vertex_coord[8];
|
||||||
@ -366,14 +367,5 @@ void gl_shader_set_coords(gl_t *gl, const struct gl_coords *coords, const math_m
|
|||||||
void gl_init_fbo(gl_t *gl, unsigned width, unsigned height);
|
void gl_init_fbo(gl_t *gl, unsigned width, unsigned height);
|
||||||
void gl_deinit_fbo(gl_t *gl);
|
void gl_deinit_fbo(gl_t *gl);
|
||||||
|
|
||||||
bool gl_load_overlay(gl_t *gl, const char *path);
|
|
||||||
void gl_set_overlay_tex_coord(gl_t *gl,
|
|
||||||
GLfloat x, GLfloat y, // Relative coordinates [0, 1] range for screen.
|
|
||||||
GLfloat w, GLfloat h);
|
|
||||||
void gl_set_overlay_vertex_coord(gl_t *gl,
|
|
||||||
GLfloat x, GLfloat y, // Relative coordinates [0, 1] range for screen.
|
|
||||||
GLfloat w, GLfloat h);
|
|
||||||
void gl_render_overlay(gl_t *gl);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user