diff --git a/command.c b/command.c index c6702983ce..d4ac644e04 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) @@ -1346,6 +1347,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); @@ -1381,6 +1387,22 @@ static void command_event_disable_overrides(void) } } +static void command_event_restore_default_shader_preset(void) +{ + /* auto shader preset: reload the original shader */ + + 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); +} + static bool command_event_save_auto_state(void) { bool ret; @@ -1905,6 +1927,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) { @@ -2569,6 +2592,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/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 ca247fdd95..d8cfd12228 100644 --- a/configuration.c +++ b/configuration.c @@ -785,6 +785,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; @@ -1267,6 +1268,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}, @@ -2294,6 +2296,139 @@ 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: + * + * 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; + int idx; + + 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); + + for(idx = FILE_PATH_CGP_EXTENSION; idx < FILE_PATH_SLANGP_EXTENSION; idx++) + { + 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); + } + } + + for(idx = FILE_PATH_CGP_EXTENSION; idx < FILE_PATH_SLANGP_EXTENSION; idx++) + { + 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; +} + static void parse_config_file(void) { global_t *global = global_get_ptr(); @@ -2719,6 +2854,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 daa209594f..18c0e90be2 100644 --- a/configuration.h +++ b/configuration.h @@ -468,6 +468,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; @@ -620,6 +621,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. diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 8c5a0e3e44..c575d2052f 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -2410,6 +2410,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: @@ -2944,8 +2946,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: @@ -3696,6 +3702,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: @@ -4025,7 +4033,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 d20b137d07..806a42d8f2 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1479,6 +1479,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); @@ -1491,7 +1492,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); + 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(); @@ -1513,6 +1523,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_SHADER_PRESET_SAVED_SUCCESSFULLY), + 1, 100, true); + else + runloop_msg_queue_push( + msg_hash_to_str(MSG_ERROR_SAVING_SHADER_PRESET), + 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) { @@ -3356,6 +3446,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 008098659d..07cfed0430 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_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/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 420f3ace1f..85a709ce63 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, @@ -1025,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, @@ -1549,7 +1553,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, 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,