diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 842e9ecd8a..4b6750babc 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -279,10 +279,8 @@ static int action_left_shader_num_passes(unsigned type, const char *label, { #ifdef HAVE_SHADER_MANAGER bool refresh = false; - struct video_shader *shader = NULL; + struct video_shader *shader = menu_shader_get(); - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); if (!shader) return menu_cbs_exit(); diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 2286b550e2..384e43ee67 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -36,6 +36,7 @@ #include "../widgets/menu_filebrowser.h" #include "../widgets/menu_input_dialog.h" #include "../menu_content.h" +#include "../menu_shader.h" #include "../../core.h" #include "../../configuration.h" @@ -1097,8 +1098,7 @@ static int generic_action_ok(const char *path, #ifdef HAVE_SHADER_MANAGER case ACTION_OK_LOAD_PRESET: { - struct video_shader *shader = NULL; - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, &shader); + struct video_shader *shader = menu_shader_get(); flush_char = msg_hash_to_str(flush_id); menu_shader_manager_set_preset(shader, video_shader_parse_type(action_path, RARCH_SHADER_NONE), @@ -1107,8 +1107,7 @@ static int generic_action_ok(const char *path, break; case ACTION_OK_LOAD_SHADER_PASS: { - struct video_shader *shader = NULL; - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, &shader); + struct video_shader *shader = menu_shader_get(); flush_char = msg_hash_to_str(flush_id); strlcpy( shader->pass[hack_shader_pass].source.path, diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 936a9a26c3..54547a7c4e 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -291,11 +291,9 @@ static int action_right_shader_num_passes(unsigned type, const char *label, bool wraparound) { #ifdef HAVE_SHADER_MANAGER - bool refresh = false; - struct video_shader *shader = NULL; + bool refresh = false; + struct video_shader *shader = menu_shader_get(); - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); if (!shader) return menu_cbs_exit(); diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 0a2703e037..53514bca5c 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -182,9 +182,6 @@ static bool menu_init(menu_handle_t *menu_data) if (!menu_entries_ctl(MENU_ENTRIES_CTL_INIT, NULL)) return false; - if (!menu_driver_ctl(RARCH_MENU_CTL_SHADER_INIT, NULL)) - return false; - if (settings->menu_show_start_screen) { menu_dialog_push_pending(true, MENU_DIALOG_WELCOME); @@ -487,29 +484,6 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) menu_driver_data->state = 0; break; - case RARCH_MENU_CTL_SHADER_DEINIT: -#ifdef HAVE_SHADER_MANAGER - if (menu_driver_shader) - free(menu_driver_shader); - menu_driver_shader = NULL; -#endif - break; - case RARCH_MENU_CTL_SHADER_INIT: -#ifdef HAVE_SHADER_MANAGER - menu_driver_shader = (struct video_shader*) - calloc(1, sizeof(struct video_shader)); - if (!menu_driver_shader) - return false; -#endif - break; - case RARCH_MENU_CTL_SHADER_GET: - { - struct video_shader **shader = (struct video_shader**)data; - if (!shader) - return false; - *shader = menu_driver_shader; - } - break; case RARCH_MENU_CTL_FRAME: if (!menu_driver_alive) return false; @@ -555,7 +529,8 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) if (menu_driver_ctl(RARCH_MENU_CTL_OWNS_DRIVER, NULL)) return true; menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_FREE, NULL); - menu_driver_ctl(RARCH_MENU_CTL_SHADER_DEINIT, NULL); + menu_shader_manager_free(); + if (menu_driver_data) { menu_input_ctl(MENU_INPUT_CTL_DEINIT, NULL); diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 9957b7f2d3..9d47d1b39c 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -96,9 +96,6 @@ enum rarch_menu_ctl_state RARCH_MENU_CTL_SET_PENDING_SHUTDOWN, RARCH_MENU_CTL_DEINIT, RARCH_MENU_CTL_INIT, - RARCH_MENU_CTL_SHADER_DEINIT, - RARCH_MENU_CTL_SHADER_INIT, - RARCH_MENU_CTL_SHADER_GET, RARCH_MENU_CTL_BLIT_RENDER, RARCH_MENU_CTL_RENDER, RARCH_MENU_CTL_RENDER_MESSAGEBOX, diff --git a/menu/menu_shader.c b/menu/menu_shader.c index 77ace8ef9f..dfdc210954 100644 --- a/menu/menu_shader.c +++ b/menu/menu_shader.c @@ -37,14 +37,16 @@ static char default_glslp[PATH_MAX_LENGTH]; static char default_cgp[PATH_MAX_LENGTH]; static char default_slangp[PATH_MAX_LENGTH]; -#endif +static struct video_shader *menu_driver_shader = NULL; + +struct video_shader *menu_shader_get(void) +{ + return menu_driver_shader; +} struct video_shader_parameter *menu_shader_manager_get_parameters(unsigned i) { - struct video_shader *shader = NULL; - - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); + struct video_shader *shader = menu_shader_get(); if (!shader) return NULL; @@ -54,10 +56,7 @@ struct video_shader_parameter *menu_shader_manager_get_parameters(unsigned i) struct video_shader_pass *menu_shader_manager_get_pass(unsigned i) { - struct video_shader *shader = NULL; - - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); + struct video_shader *shader = menu_shader_get(); if (!shader) return NULL; @@ -67,32 +66,57 @@ struct video_shader_pass *menu_shader_manager_get_pass(unsigned i) unsigned menu_shader_manager_get_amount_passes(void) { - struct video_shader *shader = NULL; - - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); + struct video_shader *shader = menu_shader_get(); if (!shader) return 0; return shader->passes; } +#else +struct video_shader *menu_shader_get(void) +{ + return NULL; +} + +struct video_shader_parameter *menu_shader_manager_get_parameters(unsigned i) +{ + return NULL; +} + +struct video_shader_pass *menu_shader_manager_get_pass(unsigned i) +{ + return NULL; +} + +unsigned menu_shader_manager_get_amount_passes(void) { return 0; } +#endif + +void menu_shader_manager_free(void) +{ +#ifdef HAVE_SHADER_MANAGER + if (menu_driver_shader) + free(menu_driver_shader); + menu_driver_shader = NULL; +#endif +} /** * menu_shader_manager_init: * * Initializes shader manager. **/ -void menu_shader_manager_init(void) +bool menu_shader_manager_init(void) { #ifdef HAVE_SHADER_MANAGER - struct video_shader *shader = NULL; config_file_t *conf = NULL; settings_t *settings = config_get_ptr(); const char *config_path = path_get(RARCH_PATH_CONFIG); - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); + menu_driver_shader = (struct video_shader*) + calloc(1, sizeof(struct video_shader)); + if (!menu_driver_shader) + return false; /* In a multi-config setting, we can't have * conflicts on menu.cgp/menu.glslp. */ @@ -129,11 +153,11 @@ void menu_shader_manager_init(void) conf = config_file_new(settings->path.shader); if (conf) { - if (video_shader_read_conf_cgp(conf, shader)) + if (video_shader_read_conf_cgp(conf, menu_driver_shader)) { - video_shader_resolve_relative(shader, + video_shader_resolve_relative(menu_driver_shader, settings->path.shader); - video_shader_resolve_parameters(conf, shader); + video_shader_resolve_parameters(conf, menu_driver_shader); } config_file_free(conf); } @@ -141,9 +165,9 @@ void menu_shader_manager_init(void) case FILE_TYPE_SHADER_GLSL: case FILE_TYPE_SHADER_CG: case FILE_TYPE_SHADER_SLANG: - strlcpy(shader->pass[0].source.path, settings->path.shader, - sizeof(shader->pass[0].source.path)); - shader->passes = 1; + strlcpy(menu_driver_shader->pass[0].source.path, settings->path.shader, + sizeof(menu_driver_shader->pass[0].source.path)); + menu_driver_shader->passes = 1; break; default: { @@ -174,10 +198,10 @@ void menu_shader_manager_init(void) if (conf) { - if (video_shader_read_conf_cgp(conf, shader)) + if (video_shader_read_conf_cgp(conf, menu_driver_shader)) { - video_shader_resolve_relative(shader, preset_path); - video_shader_resolve_parameters(conf, shader); + video_shader_resolve_relative(menu_driver_shader, preset_path); + video_shader_resolve_parameters(conf, menu_driver_shader); } config_file_free(conf); } @@ -185,6 +209,8 @@ void menu_shader_manager_init(void) break; } #endif + + return true; } /** @@ -259,14 +285,12 @@ bool menu_shader_manager_save_preset( const char *dirs[3] = {0}; config_file_t *conf = NULL; bool ret = false; - struct video_shader *shader = NULL; + struct video_shader *shader = menu_shader_get(); settings_t *settings = config_get_ptr(); buffer[0] = config_directory[0] = '\0'; preset_path[0] = '\0'; - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); if (!shader) return false; @@ -402,13 +426,8 @@ int menu_shader_manager_clear_num_passes(void) { #ifdef HAVE_SHADER_MANAGER bool refresh = false; - struct video_shader *shader = NULL; + struct video_shader *shader = menu_shader_get(); - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); - - if (!shader) - return -1; if (shader->passes) shader->passes = 0; @@ -437,15 +456,8 @@ int menu_shader_manager_clear_parameter(unsigned i) int menu_shader_manager_clear_pass_filter(unsigned i) { #ifdef HAVE_SHADER_MANAGER - struct video_shader *shader = NULL; - struct video_shader_pass *shader_pass = NULL; + struct video_shader_pass *shader_pass = menu_shader_manager_get_pass(i); - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); - - if (!shader) - return -1; - shader_pass = &shader->pass[i]; if (!shader_pass) return -1; @@ -460,35 +472,21 @@ int menu_shader_manager_clear_pass_filter(unsigned i) void menu_shader_manager_clear_pass_scale(unsigned i) { #ifdef HAVE_SHADER_MANAGER - struct video_shader *shader = NULL; - struct video_shader_pass *shader_pass = NULL; + struct video_shader_pass *shader_pass = menu_shader_manager_get_pass(i); - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); + if (!shader_pass) + return; - if (shader) - shader_pass = &shader->pass[i]; - - if (shader_pass) - { - shader_pass->fbo.scale_x = 0; - shader_pass->fbo.scale_y = 0; - shader_pass->fbo.valid = false; - } + shader_pass->fbo.scale_x = 0; + shader_pass->fbo.scale_y = 0; + shader_pass->fbo.valid = false; #endif } void menu_shader_manager_clear_pass_path(unsigned i) { #ifdef HAVE_SHADER_MANAGER - struct video_shader *shader = NULL; - struct video_shader_pass *shader_pass = NULL; - - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); - - if (shader) - shader_pass = &shader->pass[i]; + struct video_shader_pass *shader_pass = menu_shader_manager_get_pass(i); if (shader_pass) *shader_pass->source.path = '\0'; @@ -548,10 +546,7 @@ void menu_shader_manager_apply_changes(void) { #ifdef HAVE_SHADER_MANAGER unsigned shader_type; - struct video_shader *shader = NULL; - - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, - &shader); + struct video_shader *shader = menu_shader_get(); if (!shader) return; diff --git a/menu/menu_shader.h b/menu/menu_shader.h index 37a1f2906a..929f79f730 100644 --- a/menu/menu_shader.h +++ b/menu/menu_shader.h @@ -23,18 +23,22 @@ RETRO_BEGIN_DECLS +struct video_shader *menu_shader_get(); + struct video_shader_parameter *menu_shader_manager_get_parameters(unsigned i); struct video_shader_pass *menu_shader_manager_get_pass(unsigned i); unsigned menu_shader_manager_get_amount_passes(void); +void menu_shader_manager_free(void); + /** * menu_shader_manager_init: * * Initializes shader manager. **/ -void menu_shader_manager_init(void); +bool menu_shader_manager_init(void); /** * menu_shader_manager_set_preset: