diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index ab043664f9..2bd0065293 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3868,6 +3868,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Save Shader Preset As" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GLOBAL, + "Save Global Preset" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, "Save Core Preset" @@ -6592,6 +6596,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, "Save the current shader settings as the default settings for the content." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL, + "Save the current shader settings as the default global setting." + ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS, "Modifies the current shader directly. Changes will not be saved to the preset file." diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 0ebaab5963..6ecb683428 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -2686,9 +2686,10 @@ default_action_dialog_start(action_ok_rename_entry, #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) enum { - ACTION_OK_SHADER_PRESET_SAVE_CORE = 0, - ACTION_OK_SHADER_PRESET_SAVE_GAME, - ACTION_OK_SHADER_PRESET_SAVE_PARENT + ACTION_OK_SHADER_PRESET_SAVE_GLOBAL = 0, + ACTION_OK_SHADER_PRESET_SAVE_CORE, + ACTION_OK_SHADER_PRESET_SAVE_PARENT, + ACTION_OK_SHADER_PRESET_SAVE_GAME }; static int generic_action_ok_shader_preset_save(const char *path, @@ -2704,24 +2705,47 @@ static int generic_action_ok_shader_preset_save(const char *path, directory[0] = file[0] = tmp[0] = '\0'; - if (!string_is_empty(core_name)) + if (action_type != ACTION_OK_SHADER_PRESET_SAVE_GLOBAL) + { + if (!string_is_empty(core_name)) + { + fill_pathname_join( + tmp, + settings->paths.directory_video_shader, + "presets", + sizeof(tmp)); + fill_pathname_join( + directory, + tmp, + core_name, + sizeof(directory)); + } + + if (!path_is_directory(directory)) + path_mkdir(directory); + } + else { fill_pathname_join( - tmp, + directory, settings->paths.directory_video_shader, "presets", - sizeof(tmp)); - fill_pathname_join( - directory, - tmp, - core_name, sizeof(directory)); + + if (!path_is_directory(directory)) + path_mkdir(directory); + + fill_pathname_join( + file, + directory, + "global", + sizeof(file)); } - if (!path_is_directory(directory)) - path_mkdir(directory); switch (action_type) { + case ACTION_OK_SHADER_PRESET_SAVE_GLOBAL: + break; case ACTION_OK_SHADER_PRESET_SAVE_CORE: if (!string_is_empty(core_name)) fill_pathname_join(file, directory, core_name, sizeof(file)); @@ -2752,6 +2776,13 @@ static int generic_action_ok_shader_preset_save(const char *path, return 0; } +static int action_ok_shader_preset_save_global(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_GLOBAL); +} + static int action_ok_shader_preset_save_core(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) { @@ -2759,19 +2790,19 @@ static int action_ok_shader_preset_save_core(const char *path, 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 int action_ok_shader_preset_save_parent(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_PARENT); } + +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); +} #endif static int generic_action_ok_remap_file_operation(const char *path, @@ -6359,9 +6390,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, BIND_ACTION_OK(cbs, action_ok_shader_preset_save_as); #endif break; - case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL: #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) - BIND_ACTION_OK(cbs, action_ok_shader_preset_save_game); + BIND_ACTION_OK(cbs, action_ok_shader_preset_save_global); #endif break; case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE: @@ -6372,6 +6403,11 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_PARENT: #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) BIND_ACTION_OK(cbs, action_ok_shader_preset_save_parent); +#endif + break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: +#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) + BIND_ACTION_OK(cbs, action_ok_shader_preset_save_game); #endif break; case MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS: diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 6b8b176e07..a98dbac378 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -554,6 +554,7 @@ default_sublabel_macro(action_bind_sublabel_shader_watch_for_changes, default_sublabel_macro(action_bind_sublabel_shader_num_passes, MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES) default_sublabel_macro(action_bind_sublabel_shader_preset, MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET) default_sublabel_macro(action_bind_sublabel_shader_preset_save_as, MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_AS) +default_sublabel_macro(action_bind_sublabel_shader_preset_save_global, MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL) default_sublabel_macro(action_bind_sublabel_shader_preset_save_core, MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE) default_sublabel_macro(action_bind_sublabel_shader_preset_save_parent, MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_PARENT) default_sublabel_macro(action_bind_sublabel_shader_preset_save_game, MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME) @@ -1234,6 +1235,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_shader_preset_parameters); break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_shader_preset_save_global); + break; case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_shader_preset_save_core); break; diff --git a/menu/drivers/ozone/ozone_texture.c b/menu/drivers/ozone/ozone_texture.c index 5505f630ca..7d8d6a360c 100644 --- a/menu/drivers/ozone/ozone_texture.c +++ b/menu/drivers/ozone/ozone_texture.c @@ -98,6 +98,7 @@ menu_texture_item ozone_entries_icon_get_texture(ozone_handle_t *ozone, case MENU_ENUM_LABEL_UPDATE_ASSETS: case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: case MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME: + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: return ozone->icons_textures[OZONE_ENTRIES_ICONS_TEXTURE_QUICKMENU]; case MENU_ENUM_LABEL_START_CORE: diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 7aa3a4ee78..f280c6881d 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2397,6 +2397,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, case MENU_ENUM_LABEL_UPDATE_ASSETS: case MENU_ENUM_LABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: case MENU_ENUM_LABEL_REMAP_FILE_SAVE_GAME: + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL: case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: return xmb->textures.list[XMB_TEXTURE_QUICKMENU]; case MENU_ENUM_LABEL_START_CORE: diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index d288f42e34..2114faae3c 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -6025,6 +6025,12 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS, MENU_SETTING_ACTION, 0, 0)) count++; + if (menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GLOBAL), + msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL), + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GLOBAL, + MENU_SETTING_ACTION, 0, 0)) + count++; if (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_CORE), diff --git a/msg_hash.h b/msg_hash.h index d54fc64cc3..a48706075b 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1904,9 +1904,10 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_AS), + MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_GLOBAL), MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_CORE), - MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_GAME), MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_PARENT), + MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_GAME), MENU_LABEL(USER_LANGUAGE), MENU_LABEL(NETPLAY_NICKNAME), MENU_LABEL(VIDEO_VI_WIDTH), diff --git a/retroarch.c b/retroarch.c index 7e785b862f..3b17fdb700 100644 --- a/retroarch.c +++ b/retroarch.c @@ -22713,11 +22713,20 @@ static bool retroarch_load_shader_preset_internal( continue; /* Concatenate strings into full paths */ - fill_pathname_join_special_ext(shader_path, - shader_directory, core_name, - special_name, - video_shader_get_preset_extension(types[i]), - PATH_MAX_LENGTH); + if (core_name) + { + fill_pathname_join_special_ext(shader_path, + shader_directory, core_name, + special_name, + video_shader_get_preset_extension(types[i]), + PATH_MAX_LENGTH); + } + else + { + /* core_name == NULL means we want the global preset */ + fill_pathname_join(shader_path, shader_directory, "global", PATH_MAX_LENGTH); + strlcat(shader_path, video_shader_get_preset_extension(types[i]), PATH_MAX_LENGTH); + } if (!config_file_exists(shader_path)) continue; @@ -22738,9 +22747,10 @@ static bool retroarch_load_shader_preset_internal( /** * retroarch_load_shader_preset: * - * Tries to load a supported core-, game- or folder-specific shader preset - * from its respective location: + * Tries to load a supported core-, game-, folder-specific or global + * shader preset from its respective location: * + * global: $SHADER_DIR/presets/global.$PRESET_EXT * core-specific: $SHADER_DIR/presets/$CORE_NAME/$CORE_NAME.$PRESET_EXT * folder-specific: $SHADER_DIR/presets/$CORE_NAME/$FOLDER_NAME.$PRESET_EXT * game-specific: $SHADER_DIR/presets/$CORE_NAME/$GAME_NAME.$PRESET_EXT @@ -22805,6 +22815,13 @@ static bool retroarch_load_shader_preset(void) goto success; } + if (retroarch_load_shader_preset_internal(shader_directory, NULL, + core_name)) + { + RARCH_LOG("[Shaders]: global shader preset found.\n"); + goto success; + } + free(shader_directory); return false; diff --git a/ui/drivers/qt/shaderparamsdialog.cpp b/ui/drivers/qt/shaderparamsdialog.cpp index 561da72724..da3f56e122 100644 --- a/ui/drivers/qt/shaderparamsdialog.cpp +++ b/ui/drivers/qt/shaderparamsdialog.cpp @@ -54,6 +54,7 @@ enum SHADER_PRESET_SAVE_CORE = 0, SHADER_PRESET_SAVE_GAME, SHADER_PRESET_SAVE_PARENT, + SHADER_PRESET_SAVE_GLOBAL, SHADER_PRESET_SAVE_NORMAL }; @@ -687,22 +688,42 @@ void ShaderParamsDialog::saveShaderPreset(const char *path, unsigned action_type directory[0] = file[0] = tmp[0] = '\0'; - if (!string_is_empty(core_name)) + if (action_type != SHADER_PRESET_SAVE_GLOBAL) + { + if (!string_is_empty(core_name)) + { + fill_pathname_join( + tmp, + settings->paths.directory_video_shader, + "presets", + sizeof(tmp)); + fill_pathname_join( + directory, + tmp, + core_name, + sizeof(directory)); + } + + if (!path_is_directory(directory)) + path_mkdir(directory); + } + else { fill_pathname_join( - tmp, + directory, settings->paths.directory_video_shader, "presets", - sizeof(tmp)); - fill_pathname_join( - directory, - tmp, - core_name, sizeof(directory)); - } - if (!path_is_directory(directory)) - path_mkdir(directory); + if (!path_is_directory(directory)) + path_mkdir(directory); + + fill_pathname_join( + file, + directory, + "global", + sizeof(file)); + } switch (action_type) { @@ -743,6 +764,11 @@ void ShaderParamsDialog::saveShaderPreset(const char *path, unsigned action_type ); } +void ShaderParamsDialog::onShaderSaveGlobalPresetClicked() +{ + saveShaderPreset(NULL, SHADER_PRESET_SAVE_GLOBAL); +} + void ShaderParamsDialog::onShaderSaveCorePresetClicked() { saveShaderPreset(NULL, SHADER_PRESET_SAVE_CORE); @@ -913,6 +939,7 @@ void ShaderParamsDialog::buildLayout() saveMenu = new QMenu(saveButton); saveMenu->addAction(QString(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS)) + "...", this, SLOT(onShaderSavePresetAsClicked())); + saveMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GLOBAL), this, SLOT(onShaderSaveGlobalPresetClicked())); saveMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE), this, SLOT(onShaderSaveCorePresetClicked())); saveMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_PARENT), this, SLOT(onShaderSaveParentPresetClicked())); saveMenu->addAction(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME), this, SLOT(onShaderSaveGamePresetClicked())); diff --git a/ui/drivers/qt/shaderparamsdialog.h b/ui/drivers/qt/shaderparamsdialog.h index 06b8844aff..49ccdf692a 100644 --- a/ui/drivers/qt/shaderparamsdialog.h +++ b/ui/drivers/qt/shaderparamsdialog.h @@ -61,6 +61,7 @@ private slots: void onShaderSaveCorePresetClicked(); void onShaderSaveParentPresetClicked(); void onShaderSaveGamePresetClicked(); + void onShaderSaveGlobalPresetClicked(); void onShaderClearAllPassesClicked(); void onShaderRemovePassClicked(); void onShaderApplyClicked();