diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 727f54fb04..83e4ee1364 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -102,24 +102,25 @@ static void menu_action_setting_disp_set_label_shader_filter_pass( char *s2, size_t len2) { unsigned pass = 0; - menu_handle_t *menu = menu_driver_get_ptr(); - if (!menu) - return; +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) + struct video_shader *shader = NULL; +#endif (void)pass; - (void)menu; *s = '\0'; *w = 19; strlcpy(s2, path, len2); #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) - if (!menu || !menu->shader) + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); + if (!shader) return; pass = (type - MENU_SETTINGS_SHADER_PASS_FILTER_0); - switch (menu->shader->pass[pass].filter) + switch (shader->pass[pass].filter) { case 0: strlcpy(s, menu_hash_to_str(MENU_VALUE_DONT_CARE), @@ -167,18 +168,18 @@ static void menu_action_setting_disp_set_label_shader_num_passes( const char *path, char *s2, size_t len2) { - menu_handle_t *menu = menu_driver_get_ptr(); - if (!menu) - return; - - (void)menu; +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) + struct video_shader *shader = NULL; +#endif *s = '\0'; *w = 19; strlcpy(s2, path, len2); #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) - if (menu && menu->shader) - snprintf(s, len, "%u", menu->shader->passes); + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); + if (shader) + snprintf(s, len, "%u", shader->passes); #endif } @@ -191,13 +192,12 @@ static void menu_action_setting_disp_set_label_shader_pass( const char *path, char *s2, size_t len2) { +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) + struct video_shader *shader = NULL; +#endif unsigned pass = (type - MENU_SETTINGS_SHADER_PASS_0); - menu_handle_t *menu = menu_driver_get_ptr(); - if (!menu) - return; (void)pass; - (void)menu; *s = '\0'; *w = 19; @@ -205,11 +205,14 @@ static void menu_action_setting_disp_set_label_shader_pass( strlcpy(s, menu_hash_to_str(MENU_VALUE_NOT_AVAILABLE), len); #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_HLSL) - if (!menu->shader) + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); + if (!shader) return; - if (*menu->shader->pass[pass].source.path) + + if (*shader->pass[pass].source.path) fill_pathname_base(s, - menu->shader->pass[pass].source.path, len); + shader->pass[pass].source.path, len); #endif } diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 4fa29ab199..de97432f2c 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -58,9 +58,15 @@ static int shader_action_parameter_left(unsigned type, const char *label, static int shader_action_parameter_preset_left(unsigned type, const char *label, bool wraparound) { - menu_handle_t *menu = menu_driver_get_ptr(); - struct video_shader *shader = menu ? menu->shader : NULL; - struct video_shader_parameter *param = &shader->parameters[type - MENU_SETTINGS_SHADER_PRESET_PARAMETER_0]; + struct video_shader_parameter *param = NULL; + struct video_shader *shader = NULL; + + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); + + param = shader ? + &shader->parameters[type - MENU_SETTINGS_SHADER_PRESET_PARAMETER_0] : + NULL; return generic_shader_action_parameter_left(shader, param, type, label, wraparound); } #endif @@ -172,13 +178,11 @@ static int action_left_shader_scale_pass(unsigned type, const char *label, { #ifdef HAVE_SHADER_MANAGER unsigned pass = type - MENU_SETTINGS_SHADER_PASS_SCALE_0; - struct video_shader *shader = NULL; + struct video_shader *shader = NULL; struct video_shader_pass *shader_pass = NULL; - menu_handle_t *menu = menu_driver_get_ptr(); - if (!menu) - return -1; - shader = menu->shader; + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); if (!shader) return -1; shader_pass = &shader->pass[pass]; @@ -203,14 +207,12 @@ static int action_left_shader_filter_pass(unsigned type, const char *label, { #ifdef HAVE_SHADER_MANAGER unsigned delta = 2; - unsigned pass = type - MENU_SETTINGS_SHADER_PASS_FILTER_0; - struct video_shader *shader = NULL; + unsigned pass = type - MENU_SETTINGS_SHADER_PASS_FILTER_0; + struct video_shader *shader = NULL; struct video_shader_pass *shader_pass = NULL; - menu_handle_t *menu = menu_driver_get_ptr(); - if (!menu) - return -1; - shader = menu->shader; + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); if (!shader) return -1; shader_pass = &shader->pass[pass]; @@ -255,11 +257,9 @@ static int action_left_shader_num_passes(unsigned type, const char *label, { #ifdef HAVE_SHADER_MANAGER struct video_shader *shader = NULL; - menu_handle_t *menu = menu_driver_get_ptr(); - if (!menu) - return -1; - shader = menu->shader; + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); if (!shader) return -1; @@ -267,7 +267,7 @@ static int action_left_shader_num_passes(unsigned type, const char *label, shader->passes--; menu_entries_set_refresh(false); menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); - video_shader_resolve_parameters(NULL, menu->shader); + video_shader_resolve_parameters(NULL, shader); #endif return 0; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 0f3a7aa227..7eba9e0563 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -625,6 +625,7 @@ static int generic_action_ok(const char *path, int ret = 0; const char *menu_path = NULL; const char *flush_char = NULL; + struct video_shader *shader = NULL; global_t *global = global_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); settings_t *settings = config_get_ptr(); @@ -632,6 +633,9 @@ static int generic_action_ok(const char *path, if (!menu) goto error; + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); + menu_entries_get_last_stack(&menu_path, NULL, NULL, NULL); @@ -691,16 +695,16 @@ static int generic_action_ok(const char *path, break; #ifdef HAVE_SHADER_MANAGER case ACTION_OK_LOAD_PRESET: - menu_shader_manager_set_preset(menu->shader, + menu_shader_manager_set_preset(shader, video_shader_parse_type(action_path, RARCH_SHADER_NONE), action_path); break; case ACTION_OK_LOAD_SHADER_PASS: strlcpy( - menu->shader->pass[hack_shader_pass].source.path, + shader->pass[hack_shader_pass].source.path, action_path, - sizeof(menu->shader->pass[hack_shader_pass].source.path)); - video_shader_resolve_parameters(NULL, menu->shader); + sizeof(shader->pass[hack_shader_pass].source.path)); + video_shader_resolve_parameters(NULL, shader); break; #endif case ACTION_OK_LOAD_RECORD_CONFIGFILE: diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 401012912c..6f8d326685 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -61,9 +61,15 @@ int shader_action_parameter_right(unsigned type, const char *label, bool wraparo int shader_action_parameter_preset_right(unsigned type, const char *label, bool wraparound) { - menu_handle_t *menu = menu_driver_get_ptr(); - struct video_shader *shader = menu ? menu->shader : NULL; - struct video_shader_parameter *param = &shader->parameters[type - MENU_SETTINGS_SHADER_PRESET_PARAMETER_0]; + struct video_shader_parameter *param = NULL; + struct video_shader *shader = NULL; + + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); + + param = shader ? + &shader->parameters[type - MENU_SETTINGS_SHADER_PRESET_PARAMETER_0] : + NULL; return generic_shader_action_parameter_right(shader, param, type, label, wraparound); } #endif @@ -190,13 +196,11 @@ static int action_right_shader_scale_pass(unsigned type, const char *label, { #ifdef HAVE_SHADER_MANAGER unsigned pass = type - MENU_SETTINGS_SHADER_PASS_SCALE_0; - struct video_shader *shader = NULL; + struct video_shader *shader = NULL; struct video_shader_pass *shader_pass = NULL; - menu_handle_t *menu = menu_driver_get_ptr(); - if (!menu) - return -1; - shader = menu->shader; + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); if (!shader) return -1; shader_pass = &shader->pass[pass]; @@ -220,15 +224,13 @@ static int action_right_shader_filter_pass(unsigned type, const char *label, bool wraparound) { #ifdef HAVE_SHADER_MANAGER - unsigned pass = type - MENU_SETTINGS_SHADER_PASS_FILTER_0; - struct video_shader *shader = NULL; + unsigned pass = type - MENU_SETTINGS_SHADER_PASS_FILTER_0; + unsigned delta = 1; + struct video_shader *shader = NULL; struct video_shader_pass *shader_pass = NULL; - menu_handle_t *menu = menu_driver_get_ptr(); - unsigned delta = 1; - if (!menu) - return -1; - shader = menu->shader; + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); if (!shader) return -1; shader_pass = &shader->pass[pass]; @@ -272,11 +274,9 @@ static int action_right_shader_num_passes(unsigned type, const char *label, { #ifdef HAVE_SHADER_MANAGER struct video_shader *shader = NULL; - menu_handle_t *menu = menu_driver_get_ptr(); - if (!menu) - return -1; - shader = menu->shader; + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, + &shader); if (!shader) return -1; @@ -284,7 +284,7 @@ static int action_right_shader_num_passes(unsigned type, const char *label, shader->passes++; menu_entries_set_refresh(false); menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); - video_shader_resolve_parameters(NULL, menu->shader); + video_shader_resolve_parameters(NULL, shader); #endif return 0; diff --git a/menu/menu_driver.c b/menu/menu_driver.c index d379c60495..d42ec426a6 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -664,6 +664,14 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) menu_iterate_render(menu_driver_data, menu_driver_data ? menu_driver_data->userdata : NULL); break; + case RARCH_MENU_CTL_SHADER_GET: + { + struct video_shader **shader = (struct video_shader**)data; + if (!shader) + return false; + *shader = menu_driver_data ? menu_driver_data->shader : NULL; + } + return true; case RARCH_MENU_CTL_FRAME: if (!menu_driver_alive) return false; diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 24d3b228cc..3dc1c87a24 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -93,6 +93,7 @@ enum rarch_menu_ctl_state { RARCH_MENU_CTL_NONE = 0, RARCH_MENU_CTL_DEINIT, + RARCH_MENU_CTL_SHADER_GET, RARCH_MENU_CTL_RENDER, RARCH_MENU_CTL_FRAME, RARCH_MENU_CTL_SET_PREVENT_POPULATE,