From 3f0223e311a033ea0b214ebe1387f0100b592c57 Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 27 Jul 2016 18:07:19 -0500 Subject: [PATCH 01/12] Add options to save per-core/game shaders --- intl/msg_hash_us.c | 6 ++- menu/cbs/menu_cbs_ok.c | 88 ++++++++++++++++++++++++++++++++++++++++- menu/menu_displaylist.c | 10 +++++ menu/menu_shader.c | 75 +++++++++++++++++++++++------------ menu/menu_shader.h | 4 +- msg_hash.h | 4 ++ 6 files changed, 158 insertions(+), 29 deletions(-) diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 78333da4e3..7391df77d5 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -4007,7 +4007,11 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg) case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO: return "Shader Preset"; case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS: - return "Shader Preset Save As"; + return "Save Shader Preset As"; + case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE: + return "Save Core Preset"; + case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME: + return "Save Game Preset"; case MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS: return "No shader parameters."; case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET: diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 757a629c60..d52494f693 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1487,7 +1487,7 @@ static void menu_input_st_string_cb_save_preset(void *userdata, menu_setting_generic(setting, false); } else if (!string_is_empty(label)) - menu_shader_manager_save_preset(str, false); + menu_shader_manager_save_preset(str, false, false); } menu_input_key_end_line(); @@ -1509,6 +1509,86 @@ static int action_ok_shader_preset_save_as(const char *path, return 0; } +enum +{ + ACTION_OK_SHADER_PRESET_SAVE_CORE = 0, + ACTION_OK_SHADER_PRESET_SAVE_GAME +}; + +static int generic_action_ok_shader_preset_save(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx, + unsigned action_type) +{ + char directory[PATH_MAX_LENGTH] = {0}; + char file[PATH_MAX_LENGTH] = {0}; + char tmp[PATH_MAX_LENGTH] = {0}; + settings_t *settings = config_get_ptr(); + rarch_system_info_t *info = NULL; + const char *core_name = NULL; + + runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &info); + + if (info) + core_name = info->info.library_name; + + if (!string_is_empty(core_name)) + { + fill_pathname_join( + tmp, + settings->directory.video_shader, + "presets", + sizeof(tmp)); + fill_pathname_join( + directory, + tmp, + core_name, + sizeof(directory)); + } + if(!path_file_exists(directory)) + path_mkdir(directory); + + switch (action_type) + { + case ACTION_OK_SHADER_PRESET_SAVE_CORE: + fill_pathname_join(file, directory, core_name, sizeof(file)); + break; + case ACTION_OK_SHADER_PRESET_SAVE_GAME: + { + global_t *global = global_get_ptr(); + const char *game_name = path_basename(global->name.base); + fill_pathname_join(file, directory, game_name, sizeof(file)); + } + break; + } + + + + if(menu_shader_manager_save_preset(file, false, true)) + runloop_msg_queue_push( + msg_hash_to_str(MSG_REMAP_FILE_SAVED_SUCCESSFULLY), + 1, 100, true); + else + runloop_msg_queue_push( + msg_hash_to_str(MSG_ERROR_SAVING_REMAP_FILE), + 1, 100, true); + + return 0; +} + +static int action_ok_shader_preset_save_core(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + return generic_action_ok_shader_preset_save(path, label, type, + idx, entry_idx, ACTION_OK_SHADER_PRESET_SAVE_CORE); +} + +static int action_ok_shader_preset_save_game(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + return generic_action_ok_shader_preset_save(path, label, type, + idx, entry_idx, ACTION_OK_SHADER_PRESET_SAVE_GAME); +} + static void menu_input_st_string_cb_cheat_file_save_as( void *userdata, const char *str) { @@ -3341,6 +3421,12 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS: BIND_ACTION_OK(cbs, action_ok_shader_preset_save_as); break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: + BIND_ACTION_OK(cbs, action_ok_shader_preset_save_game); + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE: + BIND_ACTION_OK(cbs, action_ok_shader_preset_save_core); + break; case MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS: BIND_ACTION_OK(cbs, action_ok_cheat_file_save_as); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 2f3e4c77a7..ca1581fd50 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1550,6 +1550,16 @@ static int menu_displaylist_parse_shader_options(menu_displaylist_info_t *info) msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS, MENU_SETTING_ACTION, 0, 0); + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE), + msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE, + MENU_SETTING_ACTION, 0, 0); + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME), + msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME, + MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS), diff --git a/menu/menu_shader.c b/menu/menu_shader.c index f5d5947da3..9b3cf65897 100644 --- a/menu/menu_shader.c +++ b/menu/menu_shader.c @@ -198,8 +198,8 @@ void menu_shader_manager_set_preset(struct video_shader *shader, * * Save a shader preset to disk. **/ -void menu_shader_manager_save_preset( - const char *basename, bool apply) +bool menu_shader_manager_save_preset( + const char *basename, bool apply, bool fullpath) { #ifdef HAVE_SHADER_MANAGER char buffer[PATH_MAX_LENGTH] = {0}; @@ -218,19 +218,19 @@ void menu_shader_manager_save_preset( { RARCH_ERR("Cannot save shader preset, menu handle" " is not initialized.\n"); - return; + return false; } menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, &shader); if (!shader) - return; + return false; type = menu_shader_manager_get_type(shader); if (type == RARCH_SHADER_NONE) - return; + return false; *config_directory = '\0'; @@ -290,38 +290,63 @@ void menu_shader_manager_save_preset( global->path.config, sizeof(config_directory)); - dirs[0] = settings->directory.video_shader; - dirs[1] = settings->directory.menu_config; - dirs[2] = config_directory; + if (!fullpath) + { + dirs[0] = settings->directory.video_shader; + dirs[1] = settings->directory.menu_config; + dirs[2] = config_directory; + } if (!(conf = (config_file_t*)config_file_new(NULL))) - return; + return false; video_shader_write_conf_cgp(conf, shader); - for (d = 0; d < ARRAY_SIZE(dirs); d++) + if (!fullpath) { - if (!*dirs[d]) - continue; - - fill_pathname_join(preset_path, dirs[d], - buffer, sizeof(preset_path)); - - if (config_file_write(conf, preset_path)) + for (d = 0; d < ARRAY_SIZE(dirs); d++) { - RARCH_LOG("Saved shader preset to %s.\n", preset_path); - if (apply) - menu_shader_manager_set_preset(NULL, type, preset_path); - ret = true; - break; + if (!*dirs[d]) + continue; + + fill_pathname_join(preset_path, dirs[d], + buffer, sizeof(preset_path)); + + if (config_file_write(conf, preset_path)) + { + RARCH_LOG("Saved shader preset to %s.\n", preset_path); + if (apply) + menu_shader_manager_set_preset(NULL, type, preset_path); + ret = true; + break; + } + else + RARCH_LOG("Failed writing shader preset to %s.\n", preset_path); } - else - RARCH_LOG("Failed writing shader preset to %s.\n", preset_path); + } + else + { + if (!string_is_empty(basename)) + strlcpy(preset_path, buffer, sizeof(preset_path)); + if (config_file_write(conf, preset_path)) + { + RARCH_LOG("Saved shader preset to %s.\n", preset_path); + if (apply) + menu_shader_manager_set_preset(NULL, type, preset_path); + ret = true; + } + else + RARCH_LOG("Failed writing shader preset to %s.\n", preset_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"); + return false; + } + else + return true; #endif } @@ -390,7 +415,7 @@ void menu_shader_manager_apply_changes(void) if (shader->passes && shader_type != RARCH_SHADER_NONE) { - menu_shader_manager_save_preset(NULL, true); + menu_shader_manager_save_preset(NULL, true, false); return; } diff --git a/menu/menu_shader.h b/menu/menu_shader.h index f571296c3d..b889c57ed7 100644 --- a/menu/menu_shader.h +++ b/menu/menu_shader.h @@ -49,8 +49,8 @@ void menu_shader_manager_set_preset( * * Save a shader preset to disk. **/ -void menu_shader_manager_save_preset( - const char *basename, bool apply); +bool menu_shader_manager_save_preset( + const char *basename, bool apply, bool fullpath); /** * menu_shader_manager_get_type: diff --git a/msg_hash.h b/msg_hash.h index 491c7a9d0d..fefa1acf26 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1538,7 +1538,11 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS, MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS, + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE, + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME, MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE, From e779a3bd1b94620e074a5fce043b1463b511e29b Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 27 Jul 2016 18:11:58 -0500 Subject: [PATCH 02/12] fix messages --- intl/msg_hash_us.c | 4 ++++ menu/cbs/menu_cbs_ok.c | 4 ++-- msg_hash.h | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 7391df77d5..b627b380ab 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -2934,8 +2934,12 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg) return "Several patches are explicitly defined, ignoring all..."; case MSG_REMAP_FILE_SAVED_SUCCESSFULLY: return "Remap file saved successfully."; + case MSG_SHADER_PRESET_SAVED_SUCCESSFULLY: + return "Shader preset saved successfully."; case MSG_ERROR_SAVING_REMAP_FILE: return "Error saving remap file."; + case MSG_ERROR_SAVING_SHADER_PRESET: + return "Error saving shader preset."; case MSG_INPUT_CHEAT_FILENAME: return "Cheat Filename"; case MSG_INPUT_PRESET_FILENAME: diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index d52494f693..062751d6a2 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1565,11 +1565,11 @@ static int generic_action_ok_shader_preset_save(const char *path, if(menu_shader_manager_save_preset(file, false, true)) runloop_msg_queue_push( - msg_hash_to_str(MSG_REMAP_FILE_SAVED_SUCCESSFULLY), + msg_hash_to_str(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY), 1, 100, true); else runloop_msg_queue_push( - msg_hash_to_str(MSG_ERROR_SAVING_REMAP_FILE), + msg_hash_to_str(MSG_ERROR_SAVING_SHADER_PRESET), 1, 100, true); return 0; diff --git a/msg_hash.h b/msg_hash.h index fefa1acf26..a8197e8483 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -196,7 +196,9 @@ enum msg_hash_enums MSG_INPUT_PRESET_FILENAME, MSG_INPUT_CHEAT_FILENAME, MSG_REMAP_FILE_SAVED_SUCCESSFULLY, + MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, MSG_ERROR_SAVING_REMAP_FILE, + MSG_ERROR_SAVING_SHADER_PRESET, MSG_FAILED_TO_CREATE_THE_DIRECTORY, MSG_ERROR_SAVING_CORE_OPTIONS_FILE, MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, From feda665f97446dd1e5ceb948a5737e1f57b843bd Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 27 Jul 2016 18:31:49 -0500 Subject: [PATCH 03/12] add message to save as option too --- menu/cbs/menu_cbs_ok.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 062751d6a2..c96c2bd2fb 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1475,6 +1475,7 @@ static void menu_input_st_string_cb_save_preset(void *userdata, { rarch_setting_t *setting = NULL; const char *label = NULL; + bool ret = false; menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL_SETTING, &label); @@ -1487,7 +1488,16 @@ static void menu_input_st_string_cb_save_preset(void *userdata, menu_setting_generic(setting, false); } else if (!string_is_empty(label)) - menu_shader_manager_save_preset(str, false, false); + ret = menu_shader_manager_save_preset(str, false, false); + + if(ret) + runloop_msg_queue_push( + msg_hash_to_str(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY), + 1, 100, true); + else + runloop_msg_queue_push( + msg_hash_to_str(MSG_ERROR_SAVING_SHADER_PRESET), + 1, 100, true); } menu_input_key_end_line(); From a464d3672ad58e5ca4a9bf88c959279ec7ac12b0 Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 27 Jul 2016 18:07:19 -0500 Subject: [PATCH 04/12] Add options to save per-core/game shaders --- intl/msg_hash_us.c | 6 ++- menu/cbs/menu_cbs_ok.c | 88 ++++++++++++++++++++++++++++++++++++++++- menu/menu_displaylist.c | 10 +++++ menu/menu_shader.c | 75 +++++++++++++++++++++++------------ menu/menu_shader.h | 4 +- msg_hash.h | 4 ++ 6 files changed, 158 insertions(+), 29 deletions(-) diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 0f6c1ca760..27d73ee139 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -4011,7 +4011,11 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg) case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO: return "Shader Preset"; case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS: - return "Shader Preset Save As"; + return "Save Shader Preset As"; + case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE: + return "Save Core Preset"; + case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME: + return "Save Game Preset"; case MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS: return "No shader parameters."; case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET: diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 21744953ac..ea9d3c5697 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1487,7 +1487,7 @@ static void menu_input_st_string_cb_save_preset(void *userdata, menu_setting_generic(setting, false); } else if (!string_is_empty(label)) - menu_shader_manager_save_preset(str, false); + menu_shader_manager_save_preset(str, false, false); } menu_input_key_end_line(); @@ -1509,6 +1509,86 @@ static int action_ok_shader_preset_save_as(const char *path, return 0; } +enum +{ + ACTION_OK_SHADER_PRESET_SAVE_CORE = 0, + ACTION_OK_SHADER_PRESET_SAVE_GAME +}; + +static int generic_action_ok_shader_preset_save(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx, + unsigned action_type) +{ + char directory[PATH_MAX_LENGTH] = {0}; + char file[PATH_MAX_LENGTH] = {0}; + char tmp[PATH_MAX_LENGTH] = {0}; + settings_t *settings = config_get_ptr(); + rarch_system_info_t *info = NULL; + const char *core_name = NULL; + + runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &info); + + if (info) + core_name = info->info.library_name; + + if (!string_is_empty(core_name)) + { + fill_pathname_join( + tmp, + settings->directory.video_shader, + "presets", + sizeof(tmp)); + fill_pathname_join( + directory, + tmp, + core_name, + sizeof(directory)); + } + if(!path_file_exists(directory)) + path_mkdir(directory); + + switch (action_type) + { + case ACTION_OK_SHADER_PRESET_SAVE_CORE: + fill_pathname_join(file, directory, core_name, sizeof(file)); + break; + case ACTION_OK_SHADER_PRESET_SAVE_GAME: + { + global_t *global = global_get_ptr(); + const char *game_name = path_basename(global->name.base); + fill_pathname_join(file, directory, game_name, sizeof(file)); + } + break; + } + + + + if(menu_shader_manager_save_preset(file, false, true)) + runloop_msg_queue_push( + msg_hash_to_str(MSG_REMAP_FILE_SAVED_SUCCESSFULLY), + 1, 100, true); + else + runloop_msg_queue_push( + msg_hash_to_str(MSG_ERROR_SAVING_REMAP_FILE), + 1, 100, true); + + return 0; +} + +static int action_ok_shader_preset_save_core(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + return generic_action_ok_shader_preset_save(path, label, type, + idx, entry_idx, ACTION_OK_SHADER_PRESET_SAVE_CORE); +} + +static int action_ok_shader_preset_save_game(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + return generic_action_ok_shader_preset_save(path, label, type, + idx, entry_idx, ACTION_OK_SHADER_PRESET_SAVE_GAME); +} + static void menu_input_st_string_cb_cheat_file_save_as( void *userdata, const char *str) { @@ -3352,6 +3432,12 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS: BIND_ACTION_OK(cbs, action_ok_shader_preset_save_as); break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: + BIND_ACTION_OK(cbs, action_ok_shader_preset_save_game); + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE: + BIND_ACTION_OK(cbs, action_ok_shader_preset_save_core); + break; case MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS: BIND_ACTION_OK(cbs, action_ok_cheat_file_save_as); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 67830a39bd..1ea13fda01 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1550,6 +1550,16 @@ static int menu_displaylist_parse_shader_options(menu_displaylist_info_t *info) msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS, MENU_SETTING_ACTION, 0, 0); + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE), + msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE, + MENU_SETTING_ACTION, 0, 0); + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME), + msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS), + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME, + MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS), diff --git a/menu/menu_shader.c b/menu/menu_shader.c index f5d5947da3..9b3cf65897 100644 --- a/menu/menu_shader.c +++ b/menu/menu_shader.c @@ -198,8 +198,8 @@ void menu_shader_manager_set_preset(struct video_shader *shader, * * Save a shader preset to disk. **/ -void menu_shader_manager_save_preset( - const char *basename, bool apply) +bool menu_shader_manager_save_preset( + const char *basename, bool apply, bool fullpath) { #ifdef HAVE_SHADER_MANAGER char buffer[PATH_MAX_LENGTH] = {0}; @@ -218,19 +218,19 @@ void menu_shader_manager_save_preset( { RARCH_ERR("Cannot save shader preset, menu handle" " is not initialized.\n"); - return; + return false; } menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, &shader); if (!shader) - return; + return false; type = menu_shader_manager_get_type(shader); if (type == RARCH_SHADER_NONE) - return; + return false; *config_directory = '\0'; @@ -290,38 +290,63 @@ void menu_shader_manager_save_preset( global->path.config, sizeof(config_directory)); - dirs[0] = settings->directory.video_shader; - dirs[1] = settings->directory.menu_config; - dirs[2] = config_directory; + if (!fullpath) + { + dirs[0] = settings->directory.video_shader; + dirs[1] = settings->directory.menu_config; + dirs[2] = config_directory; + } if (!(conf = (config_file_t*)config_file_new(NULL))) - return; + return false; video_shader_write_conf_cgp(conf, shader); - for (d = 0; d < ARRAY_SIZE(dirs); d++) + if (!fullpath) { - if (!*dirs[d]) - continue; - - fill_pathname_join(preset_path, dirs[d], - buffer, sizeof(preset_path)); - - if (config_file_write(conf, preset_path)) + for (d = 0; d < ARRAY_SIZE(dirs); d++) { - RARCH_LOG("Saved shader preset to %s.\n", preset_path); - if (apply) - menu_shader_manager_set_preset(NULL, type, preset_path); - ret = true; - break; + if (!*dirs[d]) + continue; + + fill_pathname_join(preset_path, dirs[d], + buffer, sizeof(preset_path)); + + if (config_file_write(conf, preset_path)) + { + RARCH_LOG("Saved shader preset to %s.\n", preset_path); + if (apply) + menu_shader_manager_set_preset(NULL, type, preset_path); + ret = true; + break; + } + else + RARCH_LOG("Failed writing shader preset to %s.\n", preset_path); } - else - RARCH_LOG("Failed writing shader preset to %s.\n", preset_path); + } + else + { + if (!string_is_empty(basename)) + strlcpy(preset_path, buffer, sizeof(preset_path)); + if (config_file_write(conf, preset_path)) + { + RARCH_LOG("Saved shader preset to %s.\n", preset_path); + if (apply) + menu_shader_manager_set_preset(NULL, type, preset_path); + ret = true; + } + else + RARCH_LOG("Failed writing shader preset to %s.\n", preset_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"); + return false; + } + else + return true; #endif } @@ -390,7 +415,7 @@ void menu_shader_manager_apply_changes(void) if (shader->passes && shader_type != RARCH_SHADER_NONE) { - menu_shader_manager_save_preset(NULL, true); + menu_shader_manager_save_preset(NULL, true, false); return; } diff --git a/menu/menu_shader.h b/menu/menu_shader.h index f571296c3d..b889c57ed7 100644 --- a/menu/menu_shader.h +++ b/menu/menu_shader.h @@ -49,8 +49,8 @@ void menu_shader_manager_set_preset( * * Save a shader preset to disk. **/ -void menu_shader_manager_save_preset( - const char *basename, bool apply); +bool menu_shader_manager_save_preset( + const char *basename, bool apply, bool fullpath); /** * menu_shader_manager_get_type: diff --git a/msg_hash.h b/msg_hash.h index 88d4ce1039..3b4acbe523 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1540,7 +1540,11 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS, MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS, + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE, + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME, MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE, From 9fdaa8b98bdc2ec1bcd857ea36bc265b3e498b5d Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 27 Jul 2016 18:11:58 -0500 Subject: [PATCH 05/12] fix messages --- intl/msg_hash_us.c | 4 ++++ menu/cbs/menu_cbs_ok.c | 4 ++-- msg_hash.h | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 27d73ee139..690e1bda51 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -2936,8 +2936,12 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg) return "Several patches are explicitly defined, ignoring all..."; case MSG_REMAP_FILE_SAVED_SUCCESSFULLY: return "Remap file saved successfully."; + case MSG_SHADER_PRESET_SAVED_SUCCESSFULLY: + return "Shader preset saved successfully."; case MSG_ERROR_SAVING_REMAP_FILE: return "Error saving remap file."; + case MSG_ERROR_SAVING_SHADER_PRESET: + return "Error saving shader preset."; case MSG_INPUT_CHEAT_FILENAME: return "Cheat Filename"; case MSG_INPUT_PRESET_FILENAME: diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index ea9d3c5697..a90ea20601 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1565,11 +1565,11 @@ static int generic_action_ok_shader_preset_save(const char *path, if(menu_shader_manager_save_preset(file, false, true)) runloop_msg_queue_push( - msg_hash_to_str(MSG_REMAP_FILE_SAVED_SUCCESSFULLY), + msg_hash_to_str(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY), 1, 100, true); else runloop_msg_queue_push( - msg_hash_to_str(MSG_ERROR_SAVING_REMAP_FILE), + msg_hash_to_str(MSG_ERROR_SAVING_SHADER_PRESET), 1, 100, true); return 0; diff --git a/msg_hash.h b/msg_hash.h index 3b4acbe523..6da350277b 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -196,7 +196,9 @@ enum msg_hash_enums MSG_INPUT_PRESET_FILENAME, MSG_INPUT_CHEAT_FILENAME, MSG_REMAP_FILE_SAVED_SUCCESSFULLY, + MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, MSG_ERROR_SAVING_REMAP_FILE, + MSG_ERROR_SAVING_SHADER_PRESET, MSG_FAILED_TO_CREATE_THE_DIRECTORY, MSG_ERROR_SAVING_CORE_OPTIONS_FILE, MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, From 0b395a55058cdeab1808a48b4826f4d098ec6cf8 Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 27 Jul 2016 18:31:49 -0500 Subject: [PATCH 06/12] add message to save as option too --- menu/cbs/menu_cbs_ok.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index a90ea20601..99b1a61399 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1475,6 +1475,7 @@ static void menu_input_st_string_cb_save_preset(void *userdata, { rarch_setting_t *setting = NULL; const char *label = NULL; + bool ret = false; menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL_SETTING, &label); @@ -1487,7 +1488,16 @@ static void menu_input_st_string_cb_save_preset(void *userdata, menu_setting_generic(setting, false); } else if (!string_is_empty(label)) - menu_shader_manager_save_preset(str, false, false); + ret = menu_shader_manager_save_preset(str, false, false); + + if(ret) + runloop_msg_queue_push( + msg_hash_to_str(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY), + 1, 100, true); + else + runloop_msg_queue_push( + msg_hash_to_str(MSG_ERROR_SAVING_SHADER_PRESET), + 1, 100, true); } menu_input_key_end_line(); From 0536906e634de451cb5be2cee37d5208cd5b00bf Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 30 Jul 2016 11:16:03 -0500 Subject: [PATCH 07/12] add setting for auto shader presets --- config.def.h | 1 + configuration.c | 3 +++ configuration.h | 1 + intl/msg_hash_us.c | 4 ++++ menu/menu_setting.c | 16 ++++++++++++++++ msg_hash.h | 2 ++ 6 files changed, 27 insertions(+) diff --git a/config.def.h b/config.def.h index 4c49f4db51..a8ce88e325 100644 --- a/config.def.h +++ b/config.def.h @@ -561,6 +561,7 @@ static bool default_block_config_read = false; static bool default_game_specific_options = false; static bool default_auto_overrides_enable = true; static bool default_auto_remaps_enable = true; +static bool default_auto_shaders_enable = true; static bool default_sort_savefiles_enable = false; static bool default_sort_savestates_enable = false; diff --git a/configuration.c b/configuration.c index b77935f285..22bf49275a 100644 --- a/configuration.c +++ b/configuration.c @@ -782,6 +782,7 @@ static void config_set_defaults(void) settings->game_specific_options = default_game_specific_options; settings->auto_overrides_enable = default_auto_overrides_enable; settings->auto_remaps_enable = default_auto_remaps_enable; + settings->auto_shaders_enable = default_auto_shaders_enable; settings->sort_savefiles_enable = default_sort_savefiles_enable; settings->sort_savestates_enable = default_sort_savestates_enable; @@ -1264,6 +1265,7 @@ static bool config_load_file(const char *path, bool set_defaults) { "game_specific_options", &settings->game_specific_options}, { "auto_overrides_enable", &settings->auto_overrides_enable}, { "auto_remaps_enable", &settings->auto_remaps_enable}, + { "auto_shaders_enable", &settings->auto_shaders_enable}, { "sort_savefiles_enable", &settings->sort_savefiles_enable}, { "sort_savestates_enable", &settings->sort_savestates_enable}, { "config_save_on_exit", &settings->config_save_on_exit}, @@ -2655,6 +2657,7 @@ bool config_save_file(const char *path) { "game_specific_options", settings->game_specific_options}, { "auto_overrides_enable", settings->auto_overrides_enable}, { "auto_remaps_enable", settings->auto_remaps_enable}, + { "auto_shaders_enable", settings->auto_shaders_enable}, { "sort_savefiles_enable", settings->sort_savefiles_enable}, { "sort_savestates_enable", settings->sort_savestates_enable}, { "config_save_on_exit", settings->config_save_on_exit}, diff --git a/configuration.h b/configuration.h index fc266e1087..faf684a92e 100644 --- a/configuration.h +++ b/configuration.h @@ -465,6 +465,7 @@ typedef struct settings bool game_specific_options; bool auto_overrides_enable; bool auto_remaps_enable; + bool auto_shaders_enable; bool sort_savefiles_enable; bool sort_savestates_enable; diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 690e1bda51..43f26d2ef0 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -2404,6 +2404,8 @@ static const char *menu_hash_to_str_us_label_enum(enum msg_hash_enums msg) return "fastforward_ratio"; case MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE: return "auto_remaps_enable"; + case MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE: + return "auto_shaders_enable"; case MENU_ENUM_LABEL_SLOWMOTION_RATIO: return "slowmotion_ratio"; case MENU_ENUM_LABEL_CORE_SPECIFIC_CONFIG: @@ -3686,6 +3688,8 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg) return "Maximum Run Speed"; case MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE: return "Load Remap Files Automatically"; + case MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE: + return "Load Shader Presets Automatically"; case MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO: return "Slow-Motion Ratio"; case MENU_ENUM_LABEL_VALUE_CORE_SPECIFIC_CONFIG: diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 3b6194485f..a753a2233c 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -4710,6 +4710,22 @@ static bool setting_append_list( SD_FLAG_NONE); menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE); + CONFIG_BOOL( + list, list_info, + &settings->auto_shaders_enable, + msg_hash_to_str(MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE), + default_auto_shaders_enable, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON), + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE); + menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE); + END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); break; diff --git a/msg_hash.h b/msg_hash.h index 6da350277b..a6d10e4b9f 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1027,6 +1027,8 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE, MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, + MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE, + MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN, MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN, MENU_ENUM_LABEL_SCREENSHOT, From fccb4387d2c7b2715506aaa7270f392c760126c8 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 30 Jul 2016 13:55:50 -0500 Subject: [PATCH 08/12] implement shader overriding --- command.c | 5 +++ configuration.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ configuration.h | 10 ++++++ 3 files changed, 109 insertions(+) diff --git a/command.c b/command.c index 5f79d17da5..286e996128 100644 --- a/command.c +++ b/command.c @@ -1346,6 +1346,11 @@ static bool command_event_init_core(enum rarch_core_type *data) runloop_ctl(RUNLOOP_CTL_UNSET_OVERRIDES_ACTIVE, NULL); } + /* Auto-remap: apply shader preset files */ + if(settings->auto_shaders_enable) + config_load_shader_preset(); + + /* reset video format to libretro's default */ video_driver_set_pixel_format(RETRO_PIXEL_FORMAT_0RGB1555); diff --git a/configuration.c b/configuration.c index 22bf49275a..a51652b0bf 100644 --- a/configuration.c +++ b/configuration.c @@ -2230,6 +2230,100 @@ bool config_load_remap(void) return false; } +/** + * config_load_shader_preset: + * + * Tries to append game-specific and core-specific shader presets. + * + * This function only has an effect if a game-specific or core-specific + * configuration file exists at respective locations. + * + * core-specific: $SHADER_DIR/presets/$CORE_NAME/$CORE_NAME.cfg + * game-specific: $SHADER_DIR/presets/$CORE_NAME/$GAME_NAME.cfg + * + * Returns: false if there was an error or no action was performed. + */ +bool config_load_shader_preset(void) +{ + char shader_directory[PATH_MAX_LENGTH] = {0}; /* path to the directory containing retroarch.cfg (prefix) */ + char core_path[PATH_MAX_LENGTH] = {0}; /* final path for core-specific configuration (prefix+suffix) */ + char game_path[PATH_MAX_LENGTH] = {0}; /* final path for game-specific configuration (prefix+suffix) */ + config_file_t *new_conf = NULL; + const char *core_name = NULL; + const char *game_name = NULL; + global_t *global = global_get_ptr(); + settings_t *settings = config_get_ptr(); + rarch_system_info_t *system = NULL; + struct video_shader *shader = NULL; + + menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, &shader); + runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); + + if (system) + core_name = system->info.library_name; + if (global) + game_name = path_basename(global->name.base); + + if (string_is_empty(core_name) || string_is_empty(game_name)) + return false; + + /* Shader directory: shader_directory. + * Try shader directory setting, no fallbacks defined */ + if (string_is_empty(settings->directory.video_shader)) + return false; + + fill_pathname_join (shader_directory, settings->directory.video_shader, + "presets", sizeof(shader_directory)); + + RARCH_LOG("Shaders: preset directory: %s\n", shader_directory); + + /* Concatenate strings into full paths for core_path, game_path */ + fill_pathname_join_special_ext(core_path, + shader_directory, core_name, + core_name, + ".cgp", + sizeof(core_path)); + + fill_pathname_join_special_ext(game_path, + shader_directory, core_name, + game_name, + ".cgp", + sizeof(game_path)); + + /* Create a new config file from game_path */ + new_conf = config_file_new(game_path); + + /* If a game remap file exists, load it. */ + if (new_conf) + { + RARCH_LOG("Shaders: game-specific shader preset found at %s.\n", game_path); + strlcpy(settings->path.shader, game_path, sizeof(settings->path.shader)); + return true; + } + else + { + RARCH_LOG("Shaders: no game-specific preset found at %s.\n", game_path); + } + + /* Create a new config file from core_path */ + new_conf = config_file_new(core_path); + + /* If a core remap file exists, load it. */ + if (new_conf) + { + RARCH_LOG("Shaders: core-specific shader preset found at %s.\n", core_path); + strlcpy(settings->path.shader, core_path, sizeof(settings->path.shader)); + return true; + } + else + { + RARCH_LOG("Shaders: no core-specific preset found at %s.\n", core_path); + } + new_conf = NULL; + + return false; +} + static void parse_config_file(void) { global_t *global = global_get_ptr(); diff --git a/configuration.h b/configuration.h index faf684a92e..71fe065f92 100644 --- a/configuration.h +++ b/configuration.h @@ -618,6 +618,16 @@ bool config_unload_override(void); */ bool config_load_remap(void); +/** + * config_load_shader_preset: + * + * Tries to append game-specific and core-specific shader presets. + * + * Returns: false if there was an error or no action was performed. + * + */ +bool config_load_shader_preset(void); + /** * config_save_autoconf_profile: * @path : Path that shall be written to. From fcd5507158564a1ebfe59369521cd99871b061ca Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 30 Jul 2016 13:57:53 -0500 Subject: [PATCH 09/12] remove some dead code --- configuration.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/configuration.c b/configuration.c index a51652b0bf..db29a57431 100644 --- a/configuration.c +++ b/configuration.c @@ -2254,9 +2254,7 @@ bool config_load_shader_preset(void) global_t *global = global_get_ptr(); settings_t *settings = config_get_ptr(); rarch_system_info_t *system = NULL; - struct video_shader *shader = NULL; - menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET, &shader); runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); if (system) From d58c802e3bd1bca8ab0b28196de2d7f52078a256 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 30 Jul 2016 14:36:01 -0500 Subject: [PATCH 10/12] restore the original shader on close --- command.c | 11 +++++++++++ command.h | 3 ++- configuration.c | 24 ++++++++++++++++++++++++ configuration.h | 10 ++++++++++ runloop.c | 21 +++++++++++++++++++++ runloop.h | 4 ++++ 6 files changed, 72 insertions(+), 1 deletion(-) diff --git a/command.c b/command.c index 286e996128..af5f331d67 100644 --- a/command.c +++ b/command.c @@ -1170,6 +1170,7 @@ static void command_event_deinit_core(bool reinit) } command_event(CMD_EVENT_DISABLE_OVERRIDES, NULL); + command_event(CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET, NULL); } static void command_event_init_cheats(void) @@ -1386,6 +1387,12 @@ static void command_event_disable_overrides(void) } } +static void command_event_restore_default_shader_preset(void) +{ + /* auto shader preset: reload the original shader */ + config_unload_shader_preset(); +} + static bool command_event_save_auto_state(void) { bool ret; @@ -1910,6 +1917,7 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_QUIT: command_event(CMD_EVENT_AUTOSAVE_STATE, NULL); command_event(CMD_EVENT_DISABLE_OVERRIDES, NULL); + command_event(CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET, NULL); switch (cmd) { @@ -2523,6 +2531,9 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_DISABLE_OVERRIDES: command_event_disable_overrides(); break; + case CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET: + command_event_restore_default_shader_preset(); + break; case CMD_EVENT_NONE: default: return false; diff --git a/command.h b/command.h index 2725022923..5e64daa059 100644 --- a/command.h +++ b/command.h @@ -212,7 +212,8 @@ enum event_command CMD_EVENT_PERFCNT_REPORT_FRONTEND_LOG, CMD_EVENT_VOLUME_UP, CMD_EVENT_VOLUME_DOWN, - CMD_EVENT_DISABLE_OVERRIDES + CMD_EVENT_DISABLE_OVERRIDES, + CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET }; #ifdef HAVE_COMMAND diff --git a/configuration.c b/configuration.c index db29a57431..29531d8842 100644 --- a/configuration.c +++ b/configuration.c @@ -2295,6 +2295,7 @@ bool config_load_shader_preset(void) if (new_conf) { RARCH_LOG("Shaders: game-specific shader preset found at %s.\n", game_path); + runloop_ctl(RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, settings->path.shader); strlcpy(settings->path.shader, game_path, sizeof(settings->path.shader)); return true; } @@ -2310,6 +2311,7 @@ bool config_load_shader_preset(void) if (new_conf) { RARCH_LOG("Shaders: core-specific shader preset found at %s.\n", core_path); + runloop_ctl(RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, settings->path.shader); strlcpy(settings->path.shader, core_path, sizeof(settings->path.shader)); return true; } @@ -2322,6 +2324,28 @@ bool config_load_shader_preset(void) return false; } +/** + * config_unload_shader_preset: + * + * Restores the original preset that was loaded before a core/game. + * preset was loaded + * + * Returns: false if there was an error. + */ +bool config_unload_shader_preset(void) +{ + char *preset = NULL; + settings_t *settings = config_get_ptr(); + if (runloop_ctl(RUNLOOP_CTL_GET_DEFAULT_SHADER_PRESET, &preset) && + preset) + { + RARCH_WARN("Shaders: restoring default shader preset to %s\n", + preset); + strlcpy(settings->path.shader, preset, sizeof(settings->path.shader)); + } +} + + static void parse_config_file(void) { global_t *global = global_get_ptr(); diff --git a/configuration.h b/configuration.h index 71fe065f92..aa92daa3c9 100644 --- a/configuration.h +++ b/configuration.h @@ -628,6 +628,16 @@ bool config_load_remap(void); */ bool config_load_shader_preset(void); +/** + * config_unload_shader_preset: + * + * Restores the original preset that was loaded before a core/game. + * preset was loaded + * + * Returns: false if there was an error. + */ +bool config_unload_shader_preset(void); + /** * config_save_autoconf_profile: * @path : Path that shall be written to. diff --git a/runloop.c b/runloop.c index 6ee95c8a33..2ff9b7d734 100644 --- a/runloop.c +++ b/runloop.c @@ -100,6 +100,7 @@ typedef struct event_cmd_state static rarch_dir_list_t runloop_shader_dir; static char runloop_fullpath[PATH_MAX_LENGTH]; +static char runloop_default_shader_preset[PATH_MAX_LENGTH]; static rarch_system_info_t runloop_system; static unsigned runloop_pending_windowed_scale; static struct retro_frame_time_callback runloop_frame_time; @@ -931,6 +932,26 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data) strlcpy(runloop_fullpath, fullpath, sizeof(runloop_fullpath)); } break; + case RUNLOOP_CTL_CLEAR_DEFAULT_SHADER_PRESET: + *runloop_default_shader_preset = '\0'; + break; + case RUNLOOP_CTL_GET_DEFAULT_SHADER_PRESET: + { + char **preset = (char**)data; + if (!preset) + return false; + *preset = (char*)runloop_default_shader_preset; + } + break; + case RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET: + { + const char *preset = (const char*)data; + if (!preset) + return false; + strlcpy(runloop_default_shader_preset, preset, + sizeof(runloop_default_shader_preset)); + } + break; case RUNLOOP_CTL_FRAME_TIME_FREE: memset(&runloop_frame_time, 0, sizeof(struct retro_frame_time_callback)); runloop_frame_time_last = 0; diff --git a/runloop.h b/runloop.h index 19abb7173f..f31e86e172 100644 --- a/runloop.h +++ b/runloop.h @@ -61,6 +61,10 @@ enum runloop_ctl_state RUNLOOP_CTL_SET_CONTENT_PATH, RUNLOOP_CTL_CLEAR_CONTENT_PATH, + RUNLOOP_CTL_GET_DEFAULT_SHADER_PRESET, + RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, + RUNLOOP_CTL_CLEAR_DEFAULT_SHADER_PRESET, + RUNLOOP_CTL_SET_LIBRETRO_PATH, RUNLOOP_CTL_IS_SLOWMOTION, From 0026a91d62c6843901dc548e0a3993dba5c22f5c Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 30 Jul 2016 14:37:07 -0500 Subject: [PATCH 11/12] clear the runloop variable --- command.c | 1 + 1 file changed, 1 insertion(+) diff --git a/command.c b/command.c index af5f331d67..33618f9a2d 100644 --- a/command.c +++ b/command.c @@ -1391,6 +1391,7 @@ static void command_event_restore_default_shader_preset(void) { /* auto shader preset: reload the original shader */ config_unload_shader_preset(); + runloop_ctl(RUNLOOP_CTL_CLEAR_DEFAULT_SHADER_PRESET, NULL); } static bool command_event_save_auto_state(void) From 785d5519a6c83979f32a579eb58b1c9966d88ecd Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 30 Jul 2016 15:28:47 -0500 Subject: [PATCH 12/12] only load shaders compatible with the current backend --- command.c | 11 +++- configuration.c | 143 +++++++++++++++++++++++++++--------------------- configuration.h | 10 ---- 3 files changed, 90 insertions(+), 74 deletions(-) diff --git a/command.c b/command.c index 33618f9a2d..d08e3b0764 100644 --- a/command.c +++ b/command.c @@ -1390,7 +1390,16 @@ static void command_event_disable_overrides(void) static void command_event_restore_default_shader_preset(void) { /* auto shader preset: reload the original shader */ - config_unload_shader_preset(); + + char *preset = NULL; + settings_t *settings = config_get_ptr(); + if (runloop_ctl(RUNLOOP_CTL_GET_DEFAULT_SHADER_PRESET, &preset) && + !string_is_empty(preset)) + { + RARCH_LOG("Shaders: restoring default shader preset to %s\n", + preset); + strlcpy(settings->path.shader, preset, sizeof(settings->path.shader)); + } runloop_ctl(RUNLOOP_CTL_CLEAR_DEFAULT_SHADER_PRESET, NULL); } diff --git a/configuration.c b/configuration.c index 29531d8842..10df170ac9 100644 --- a/configuration.c +++ b/configuration.c @@ -2230,6 +2230,28 @@ bool config_load_remap(void) return false; } +static bool check_shader_compatibility(enum file_path_enum enum_idx) +{ + settings_t *settings = config_get_ptr(); + if (!strcmp("vulkan", settings->video.driver)) + { + if (enum_idx != FILE_PATH_SLANGP_EXTENSION) + return false; + else + return true; + } + if (!strcmp("gl", settings->video.driver) || + !strcmp("d3d9", settings->video.driver)) + { + if (enum_idx == FILE_PATH_SLANGP_EXTENSION) + return false; + else + return true; + } + else + return false; +} + /** * config_load_shader_preset: * @@ -2254,6 +2276,7 @@ bool config_load_shader_preset(void) global_t *global = global_get_ptr(); settings_t *settings = config_get_ptr(); rarch_system_info_t *system = NULL; + int idx; runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system); @@ -2275,77 +2298,71 @@ bool config_load_shader_preset(void) RARCH_LOG("Shaders: preset directory: %s\n", shader_directory); - /* Concatenate strings into full paths for core_path, game_path */ - fill_pathname_join_special_ext(core_path, - shader_directory, core_name, - core_name, - ".cgp", - sizeof(core_path)); - - fill_pathname_join_special_ext(game_path, - shader_directory, core_name, - game_name, - ".cgp", - sizeof(game_path)); - - /* Create a new config file from game_path */ - new_conf = config_file_new(game_path); - - /* If a game remap file exists, load it. */ - if (new_conf) + for(idx = FILE_PATH_CGP_EXTENSION; idx < FILE_PATH_SLANGP_EXTENSION; idx++) { - RARCH_LOG("Shaders: game-specific shader preset found at %s.\n", game_path); - runloop_ctl(RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, settings->path.shader); - strlcpy(settings->path.shader, game_path, sizeof(settings->path.shader)); - return true; - } - else - { - RARCH_LOG("Shaders: no game-specific preset found at %s.\n", game_path); + if (!check_shader_compatibility(idx)) + continue; + /* Concatenate strings into full paths for core_path, game_path */ + fill_pathname_join_special_ext(core_path, + shader_directory, core_name, + core_name, + file_path_str(idx), + sizeof(core_path)); + + fill_pathname_join_special_ext(game_path, + shader_directory, core_name, + game_name, + file_path_str(idx), + sizeof(game_path)); + + /* Create a new config file from game_path */ + new_conf = config_file_new(game_path); + + /* If a game shader preset exists, load it. */ + if (new_conf) + { + RARCH_LOG("Shaders: game-specific shader preset found at %s.\n", game_path); + runloop_ctl(RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, settings->path.shader); + strlcpy(settings->path.shader, game_path, sizeof(settings->path.shader)); + return true; + } + else + { + RARCH_LOG("Shaders: no game-specific preset found at %s.\n", game_path); + } } - /* Create a new config file from core_path */ - new_conf = config_file_new(core_path); - - /* If a core remap file exists, load it. */ - if (new_conf) + for(idx = FILE_PATH_CGP_EXTENSION; idx < FILE_PATH_SLANGP_EXTENSION; idx++) { - RARCH_LOG("Shaders: core-specific shader preset found at %s.\n", core_path); - runloop_ctl(RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, settings->path.shader); - strlcpy(settings->path.shader, core_path, sizeof(settings->path.shader)); - return true; - } - else - { - RARCH_LOG("Shaders: no core-specific preset found at %s.\n", core_path); - } - new_conf = NULL; + if (!check_shader_compatibility(idx)) + continue; + /* Concatenate strings into full paths for core_path, game_path */ + fill_pathname_join_special_ext(core_path, + shader_directory, core_name, + core_name, + file_path_str(idx), + sizeof(core_path)); + /* Create a new config file from core_path */ + new_conf = config_file_new(core_path); + + /* If a core shader preset exists, load it. */ + if (new_conf) + { + RARCH_LOG("Shaders: core-specific shader preset found at %s.\n", core_path); + runloop_ctl(RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, settings->path.shader); + strlcpy(settings->path.shader, core_path, sizeof(settings->path.shader)); + return true; + } + else + { + RARCH_LOG("Shaders: no core-specific preset found at %s.\n", core_path); + } + new_conf = NULL; + } return false; } -/** - * config_unload_shader_preset: - * - * Restores the original preset that was loaded before a core/game. - * preset was loaded - * - * Returns: false if there was an error. - */ -bool config_unload_shader_preset(void) -{ - char *preset = NULL; - settings_t *settings = config_get_ptr(); - if (runloop_ctl(RUNLOOP_CTL_GET_DEFAULT_SHADER_PRESET, &preset) && - preset) - { - RARCH_WARN("Shaders: restoring default shader preset to %s\n", - preset); - strlcpy(settings->path.shader, preset, sizeof(settings->path.shader)); - } -} - - static void parse_config_file(void) { global_t *global = global_get_ptr(); diff --git a/configuration.h b/configuration.h index aa92daa3c9..71fe065f92 100644 --- a/configuration.h +++ b/configuration.h @@ -628,16 +628,6 @@ bool config_load_remap(void); */ bool config_load_shader_preset(void); -/** - * config_unload_shader_preset: - * - * Restores the original preset that was loaded before a core/game. - * preset was loaded - * - * Returns: false if there was an error. - */ -bool config_unload_shader_preset(void); - /** * config_save_autoconf_profile: * @path : Path that shall be written to.