From 2b59f18b83c1ff00432fc4da285e8b6195e26797 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 9 Nov 2015 22:12:32 +0100 Subject: [PATCH] Add function pointer for font_init_first --- menu/drivers_display/menu_display_d3d.cpp | 36 +++++++++++++++++++++++ menu/drivers_display/menu_display_gl.c | 36 +++++++++++++++++++++++ menu/drivers_display/menu_display_null.c | 8 +++++ menu/menu_display.c | 10 +++++-- menu/menu_display.h | 3 ++ 5 files changed, 91 insertions(+), 2 deletions(-) diff --git a/menu/drivers_display/menu_display_d3d.cpp b/menu/drivers_display/menu_display_d3d.cpp index 44436cd8a1..bb176be6ca 100644 --- a/menu/drivers_display/menu_display_d3d.cpp +++ b/menu/drivers_display/menu_display_d3d.cpp @@ -234,6 +234,41 @@ static const float *menu_display_d3d_get_tex_coords(void) return &d3d_tex_coords[0]; } +static bool menu_display_d3d_font_init_first(const void **font_driver, + void **font_handle, void *video_data, const char *font_path, + float font_size) +{ + settings_t *settings = config_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); + + if (settings->video.threaded && !hw_render->context_type) + { + thread_packet_t pkt; + driver_t *driver = driver_get_ptr(); + thread_video_t *thr = (thread_video_t*)driver->video_data; + + if (!thr) + return false; + + pkt.type = CMD_FONT_INIT; + pkt.data.font_init.method = font_init_first; + pkt.data.font_init.font_driver = (const void**)font_driver; + pkt.data.font_init.font_handle = font_handle; + pkt.data.font_init.video_data = video_data; + pkt.data.font_init.font_path = font_path; + pkt.data.font_init.font_size = font_size; + pkt.data.font_init.api = FONT_DRIVER_RENDER_DIRECT3D_API; + + thr->send_and_wait(thr, &pkt); + + return pkt.data.font_init.return_value; + } + + return font_init_first(font_driver, font_handle, video_data, + font_path, font_size, FONT_DRIVER_RENDER_DIRECT3D_API); +} + menu_display_ctx_driver_t menu_display_ctx_d3d = { menu_display_d3d_draw, menu_display_d3d_draw_bg, @@ -245,6 +280,7 @@ menu_display_ctx_driver_t menu_display_ctx_d3d = { menu_display_d3d_get_tex_coords, menu_display_d3d_texture_load, menu_display_d3d_texture_unload, + menu_display_d3d_font_init_first, MENU_VIDEO_DRIVER_DIRECT3D, "menu_display_d3d", }; diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 417c28838a..bc8dcade2f 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -207,6 +207,41 @@ static const float *menu_display_gl_get_tex_coords(void) return &gl_tex_coords[0]; } +static bool menu_display_gl_font_init_first(const void **font_driver, + void **font_handle, void *video_data, const char *font_path, + float font_size) +{ + settings_t *settings = config_get_ptr(); + const struct retro_hw_render_callback *hw_render = + (const struct retro_hw_render_callback*)video_driver_callback(); + + if (settings->video.threaded && !hw_render->context_type) + { + thread_packet_t pkt; + driver_t *driver = driver_get_ptr(); + thread_video_t *thr = (thread_video_t*)driver->video_data; + + if (!thr) + return false; + + pkt.type = CMD_FONT_INIT; + pkt.data.font_init.method = font_init_first; + pkt.data.font_init.font_driver = (const void**)font_driver; + pkt.data.font_init.font_handle = font_handle; + pkt.data.font_init.video_data = video_data; + pkt.data.font_init.font_path = font_path; + pkt.data.font_init.font_size = font_size; + pkt.data.font_init.api = FONT_DRIVER_RENDER_OPENGL_API; + + thr->send_and_wait(thr, &pkt); + + return pkt.data.font_init.return_value; + } + + return font_init_first(font_driver, font_handle, video_data, + font_path, font_size, FONT_DRIVER_RENDER_OPENGL_API); +} + menu_display_ctx_driver_t menu_display_ctx_gl = { menu_display_gl_draw, menu_display_gl_draw_bg, @@ -218,6 +253,7 @@ menu_display_ctx_driver_t menu_display_ctx_gl = { menu_display_gl_get_tex_coords, menu_display_gl_texture_load, menu_display_gl_texture_unload, + menu_display_gl_font_init_first, MENU_VIDEO_DRIVER_OPENGL, "menu_display_gl", }; diff --git a/menu/drivers_display/menu_display_null.c b/menu/drivers_display/menu_display_null.c index d10bfe58b2..8f4b1ca632 100644 --- a/menu/drivers_display/menu_display_null.c +++ b/menu/drivers_display/menu_display_null.c @@ -88,6 +88,13 @@ static const float *menu_display_null_get_tex_coords(void) return &floats[0]; } +static bool menu_display_null_font_init_first(const void **font_driver, + void **font_handle, void *video_data, const char *font_path, + float font_size) +{ + return true; +} + menu_display_ctx_driver_t menu_display_ctx_null = { menu_display_null_draw, menu_display_null_draw_bg, @@ -99,6 +106,7 @@ menu_display_ctx_driver_t menu_display_ctx_null = { menu_display_null_get_tex_coords, menu_display_null_texture_load, menu_display_null_texture_unload, + menu_display_null_font_init_first, MENU_VIDEO_DRIVER_GENERIC, "menu_display_null", }; diff --git a/menu/menu_display.c b/menu/menu_display.c index 3af39b127a..360d723d66 100644 --- a/menu/menu_display.c +++ b/menu/menu_display.c @@ -134,6 +134,13 @@ bool menu_display_font_init_first(const void **font_driver, void **font_handle, void *video_data, const char *font_path, float font_size) { + menu_display_ctx_driver_t *menu_disp = menu_display_context_get_ptr(); + if (!menu_disp || !menu_disp->font_init_first) + return false; + + return menu_disp->font_init_first(font_driver, font_handle, video_data, + font_path, font_size); + settings_t *settings = config_get_ptr(); const struct retro_hw_render_callback *hw_render = (const struct retro_hw_render_callback*)video_driver_callback(); @@ -577,8 +584,7 @@ void menu_display_blend_end(void) if (!menu_disp || !menu_disp->blend_end) return; - if (menu_disp) - menu_disp->blend_end(); + menu_disp->blend_end(); } void menu_display_matrix_4x4_rotate_z(void *data, float rotation, diff --git a/menu/menu_display.h b/menu/menu_display.h index 7d978e2fc9..93859dace0 100644 --- a/menu/menu_display.h +++ b/menu/menu_display.h @@ -107,6 +107,9 @@ typedef struct menu_display_ctx_driver const float *(*get_tex_coords)(void); unsigned (*texture_load)(void *data, enum texture_filter_type type); void (*texture_unload)(uintptr_t *id); + bool (*font_init_first)(const void **font_driver, + void **font_handle, void *video_data, const char *font_path, + float font_size); enum menu_display_driver_type type; const char *ident; } menu_display_ctx_driver_t;