diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index 1fcf938cb7..31974c0ed3 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -414,6 +414,7 @@ void shader_manager_get_str(struct gfx_shader *shader, char *type_str, size_t type_str_size, unsigned type); void shader_manager_set_preset(struct gfx_shader *shader, enum rarch_shader_type type, const char *path); +void shader_manager_save_preset(void *data, const char *basename, bool apply); #endif void menu_ticker_line(char *buf, size_t len, unsigned tick, const char *str, bool selected); diff --git a/frontend/menu/menu_input_line_cb.c b/frontend/menu/menu_input_line_cb.c index d3c0bc5b35..4e92ebfec9 100644 --- a/frontend/menu/menu_input_line_cb.c +++ b/frontend/menu/menu_input_line_cb.c @@ -93,26 +93,15 @@ void rsound_ipaddress_callback(void *userdata, const char *str) } #endif +#ifdef HAVE_SHADER_MANAGER void preset_filename_callback(void *userdata, const char *str) { rgui_handle_t *rgui = (rgui_handle_t*)userdata; - if (str && *str) - { - char filepath[PATH_MAX]; - - fill_pathname_join(filepath, g_settings.video.shader_dir, str, sizeof(filepath)); - strlcat(filepath, ".cgp", sizeof(filepath)); - config_file_t *conf = config_file_new(NULL); - if (conf) - { - gfx_shader_write_conf_cgp(conf, &rgui->shader); - config_file_write(conf, filepath); - config_file_free(conf); - } - } + shader_manager_save_preset(rgui, str && *str ? str : NULL, false); menu_key_end_line(rgui); } +#endif void menu_key_event(bool down, unsigned keycode, uint32_t character, uint16_t mod) { diff --git a/frontend/menu/menu_settings.c b/frontend/menu/menu_settings.c index e59f063da7..59305446df 100644 --- a/frontend/menu/menu_settings.c +++ b/frontend/menu/menu_settings.c @@ -171,6 +171,74 @@ static enum rarch_shader_type shader_manager_get_type(const struct gfx_shader *s return type; } +void shader_manager_save_preset(void *data, const char *basename, bool apply) +{ + rgui_handle_t *rgui = (rgui_handle_t*)data; + enum rarch_shader_type type = shader_manager_get_type(&rgui->shader); + if (type == RARCH_SHADER_NONE) + return; + + const char *conf_path = NULL; + char buffer[PATH_MAX]; + if (basename) + { + strlcpy(buffer, basename, sizeof(buffer)); + // Append extension automatically as appropriate. + if (!strstr(basename, ".cgp") && !strstr(basename, ".glslp")) + { + if (type == RARCH_SHADER_GLSL) + strlcat(buffer, ".glslp", sizeof(buffer)); + else if (type == RARCH_SHADER_CG) + strlcat(buffer, ".cgp", sizeof(buffer)); + } + conf_path = buffer; + } + else + conf_path = type == RARCH_SHADER_GLSL ? rgui->default_glslp : rgui->default_cgp; + + char config_directory[PATH_MAX]; + if (*g_extern.config_path) + fill_pathname_basedir(config_directory, g_extern.config_path, sizeof(config_directory)); + else + *config_directory = '\0'; + + char cgp_path[PATH_MAX]; + const char *dirs[] = { + g_settings.video.shader_dir, + g_settings.rgui_config_directory, + config_directory, + }; + + config_file_t *conf = config_file_new(NULL); + if (!conf) + return; + gfx_shader_write_conf_cgp(conf, &rgui->shader); + + bool ret = false; + unsigned d; + for (d = 0; d < ARRAY_SIZE(dirs); d++) + { + if (!*dirs[d]) + continue; + + fill_pathname_join(cgp_path, dirs[d], conf_path, sizeof(cgp_path)); + if (config_file_write(conf, cgp_path)) + { + RARCH_LOG("Saved shader preset to %s.\n", cgp_path); + if (apply) + shader_manager_set_preset(NULL, type, cgp_path); + ret = true; + break; + } + else + RARCH_LOG("Failed writing shader preset to %s.\n", cgp_path); + } + + config_file_free(conf); + if (!ret) + RARCH_ERR("Failed to save shader preset. Make sure config directory and/or shader dir are writable.\n"); +} + static int shader_manager_toggle_setting(void *data, unsigned setting, unsigned action) { unsigned dist_shader, dist_filter, dist_scale; @@ -1585,74 +1653,31 @@ int menu_set_settings(void *data, unsigned setting, unsigned action) #endif break; case RGUI_SETTINGS_SHADER_APPLY: + { + if (!driver.video || !driver.video->set_shader || action != RGUI_ACTION_OK) + return 0; + + RARCH_LOG("Applying shader ...\n"); + + enum rarch_shader_type type = shader_manager_get_type(&rgui->shader); + + if (rgui->shader.passes && type != RARCH_SHADER_NONE) + shader_manager_save_preset(rgui, NULL, true); + else { - if (!driver.video || !driver.video->set_shader || action != RGUI_ACTION_OK) - return 0; - - RARCH_LOG("Applying shader ...\n"); - - enum rarch_shader_type type = shader_manager_get_type(&rgui->shader); - - if (rgui->shader.passes && type != RARCH_SHADER_NONE) + type = gfx_shader_parse_type("", DEFAULT_SHADER_TYPE); + if (type == RARCH_SHADER_NONE) { - const char *conf_path = type == RARCH_SHADER_GLSL ? rgui->default_glslp : rgui->default_cgp; - - char config_directory[PATH_MAX]; - if (*g_extern.config_path) - fill_pathname_basedir(config_directory, g_extern.config_path, sizeof(config_directory)); - else - *config_directory = '\0'; - - char cgp_path[PATH_MAX]; - const char *dirs[] = { - g_settings.video.shader_dir, - g_settings.rgui_config_directory, - config_directory, - }; - - config_file_t *conf = config_file_new(NULL); - if (!conf) - return 0; - gfx_shader_write_conf_cgp(conf, &rgui->shader); - - bool ret = false; - unsigned d; - for (d = 0; d < ARRAY_SIZE(dirs); d++) - { - if (!*dirs[d]) - continue; - - fill_pathname_join(cgp_path, dirs[d], conf_path, sizeof(cgp_path)); - if (config_file_write(conf, cgp_path)) - { - RARCH_LOG("Saved shader preset to %s.\n", cgp_path); - shader_manager_set_preset(NULL, type, cgp_path); - ret = true; - break; - } - else - RARCH_LOG("Failed writing shader preset to %s.\n", cgp_path); - } - - config_file_free(conf); - if (!ret) - RARCH_ERR("Failed to save shader preset. Make sure config directory and/or shader dir are writable.\n"); - } - else - { - type = gfx_shader_parse_type("", DEFAULT_SHADER_TYPE); - if (type == RARCH_SHADER_NONE) - { #if defined(HAVE_GLSL) - type = RARCH_SHADER_GLSL; + type = RARCH_SHADER_GLSL; #elif defined(HAVE_CG) || defined(HAVE_HLSL) - type = RARCH_SHADER_CG; + type = RARCH_SHADER_CG; #endif - } - shader_manager_set_preset(NULL, type, NULL); } + shader_manager_set_preset(NULL, type, NULL); } break; + } #endif #ifdef _XBOX1 case RGUI_SETTINGS_FLICKER_FILTER: