diff --git a/CHANGES.md b/CHANGES.md index 4275c5a181..064a723334 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -36,6 +36,8 @@ - LOCALIZATION: Update Spanish translation. - NETPLAY: Add menu option to select different MITM (relay) server locations. - OSX: Modify HID buttons detection algorithm. +- SHADERS: Allow saving of shader presets based on the parent directory (Saving one for */foo/bar/mario.sfc* would result in *shaders/presets/corename/bar.ext*). We decided it's safer to still isolate the presets to a single core because different cores may treat video output differently. +- SHADERS: Don't save the path to the current preset to the main config. This was causing weird behavior, instead it will try to load *currentconfig.ext* and it will save a preset with that name when select *apply shader preset*. The resulting shader will restore properly after restarting and even after core/parent/game specific presets are loaded - SOLARIS: Initial port. - SWITCH: Initial Nintendo Switch port, based on libtransistor SDK. - PS3: Enable Cheevos. diff --git a/command.c b/command.c index 8b9d903622..27ebfdeb72 100644 --- a/command.c +++ b/command.c @@ -220,6 +220,7 @@ bool command_set_shader(const char *arg) { char msg[256]; enum rarch_shader_type type = RARCH_SHADER_NONE; + struct video_shader *shader = menu_shader_get(); switch (msg_hash_to_file_type(msg_hash_calculate(path_get_extension(arg)))) { @@ -245,7 +246,8 @@ bool command_set_shader(const char *arg) msg_hash_to_str(MSG_APPLYING_SHADER), arg); - return video_driver_set_shader(type, arg); + retroarch_set_shader_preset(arg); + return menu_shader_manager_set_preset(shader, type, arg); } #if defined(HAVE_COMMAND) && defined(HAVE_CHEEVOS) @@ -1295,31 +1297,13 @@ static void command_event_disable_overrides(void) return; /* reload the original config */ - config_unload_override(); rarch_ctl(RARCH_CTL_UNSET_OVERRIDES_ACTIVE, NULL); } static void command_event_restore_default_shader_preset(void) { - if (!path_is_empty(RARCH_PATH_DEFAULT_SHADER_PRESET)) - { - /* auto shader preset: reload the original shader */ - settings_t *settings = config_get_ptr(); - const char *shader_preset = path_get(RARCH_PATH_DEFAULT_SHADER_PRESET); - - if (!string_is_empty(shader_preset)) - { - RARCH_LOG("%s %s\n", - msg_hash_to_str(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO), - shader_preset); - strlcpy(settings->paths.path_shader, - shader_preset, - sizeof(settings->paths.path_shader)); - } - } - - path_clear(RARCH_PATH_DEFAULT_SHADER_PRESET); + retroarch_unset_shader_preset(); } static void command_event_restore_remaps(void) @@ -1440,6 +1424,7 @@ static bool command_event_save_core_config(void) { runloop_msg_queue_push(msg_hash_to_str(MSG_CONFIG_DIRECTORY_NOT_SET), 1, 180, true); RARCH_ERR("[Config]: %s\n", msg_hash_to_str(MSG_CONFIG_DIRECTORY_NOT_SET)); + free (config_dir); return false; } diff --git a/configuration.c b/configuration.c index 6ade326f55..44ca8c52f9 100644 --- a/configuration.c +++ b/configuration.c @@ -2875,29 +2875,29 @@ static bool config_load_file(const char *path, bool set_defaults, config_read_keybinds_conf(conf); + + const char *shader_ext = path_get_extension(settings->paths.path_shader); + + if (!string_is_empty(shader_ext)) + { + for(i = FILE_PATH_CGP_EXTENSION; i <= FILE_PATH_SLANGP_EXTENSION; i++) + { + enum file_path_enum ext = (enum file_path_enum)(i); + if(!strstr(file_path_str(ext), shader_ext)) + continue; + + if (check_shader_compatibility(ext)) + continue; + + RARCH_LOG("Incompatible shader for backend %s, clearing...\n", + settings->arrays.video_driver); + settings->paths.path_shader[0] = '\0'; + break; + } +} + ret = true; - { - const char *shader_ext = path_get_extension(settings->paths.path_shader); - - if (!string_is_empty(shader_ext)) - { - for(i = FILE_PATH_CGP_EXTENSION; i <= FILE_PATH_SLANGP_EXTENSION; i++) - { - enum file_path_enum ext = (enum file_path_enum)(i); - if(!strstr(file_path_str(ext), shader_ext)) - continue; - - if (check_shader_compatibility(ext)) - continue; - - RARCH_LOG("Incompatible shader for backend %s, clearing...\n", - settings->arrays.video_driver); - settings->paths.path_shader[0] = '\0'; - break; - } - } - } end: if (conf) @@ -3227,10 +3227,15 @@ bool config_load_shader_preset(void) char *shader_directory = NULL; char *core_path = NULL; char *game_path = NULL; + char *parent_path = NULL; settings_t *settings = config_get_ptr(); rarch_system_info_t *system = runloop_get_system_info(); const char *core_name = system ? system->info.library_name : NULL; const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME)); + char parent_name[PATH_MAX_LENGTH]; + + if (!string_is_empty(path_get(RARCH_PATH_BASENAME))) + fill_pathname_parent_dir_name(parent_name, path_get(RARCH_PATH_BASENAME), sizeof(parent_name)); if (string_is_empty(core_name) || string_is_empty(game_name)) return false; @@ -3246,6 +3251,9 @@ bool config_load_shader_preset(void) core_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); /* final path for game-specific configuration (prefix+suffix) */ game_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + /* final path for parent-dir-specific configuration (prefix+suffix) */ + parent_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + shader_directory[0] = core_path[0] = game_path[0] = '\0'; fill_pathname_join (shader_directory, settings->paths.directory_video_shader, @@ -3282,9 +3290,33 @@ bool config_load_shader_preset(void) /* Game shader preset exists, load it. */ RARCH_LOG("Shaders: game-specific shader preset found at %s.\n", game_path); + retroarch_set_shader_preset(game_path); + goto success; + } - path_set(RARCH_PATH_DEFAULT_SHADER_PRESET, settings->paths.path_shader); - strlcpy(settings->paths.path_shader, game_path, sizeof(settings->paths.path_shader)); + for(idx = FILE_PATH_CGP_EXTENSION; idx <= FILE_PATH_SLANGP_EXTENSION; idx++) + { + if (!check_shader_compatibility((enum file_path_enum)(idx))) + continue; + /* Concatenate strings into full paths for core_path, parent path */ + fill_pathname_join_special_ext(parent_path, + shader_directory, core_name, + parent_name, + file_path_str((enum file_path_enum)(idx)), + path_size); + + /* Create a new config file from parent path */ + new_conf = config_file_new(parent_path); + + if (!new_conf) + { + RARCH_LOG("Shaders: no parent-dir-specific preset found at %s.\n", parent_path); + continue; + } + + /* Parent-dir shader preset exists, load it. */ + RARCH_LOG("Shaders: parent-dir-specific shader preset found at %s.\n", parent_path); + retroarch_set_shader_preset(parent_path); goto success; } @@ -3310,8 +3342,7 @@ bool config_load_shader_preset(void) /* Core shader preset exists, load it. */ RARCH_LOG("Shaders: core-specific shader preset found at %s.\n", core_path); - path_set(RARCH_PATH_DEFAULT_SHADER_PRESET, settings->paths.path_shader); - strlcpy(settings->paths.path_shader, core_path, sizeof(settings->paths.path_shader)); + retroarch_set_shader_preset(core_path); goto success; } @@ -3324,6 +3355,7 @@ success: free(shader_directory); free(core_path); free(game_path); + free(parent_path); config_file_free(new_conf); return true; } diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index 8a0c81cf83..a95ca5a9aa 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -56,6 +56,7 @@ #include "../../core.h" #include "../../verbosity.h" +#include "../../retroarch.h" static LPDIRECT3D9 g_pD3D9; @@ -1081,7 +1082,7 @@ static bool d3d9_init_internal(d3d_video_t *d3d, if (settings->bools.video_shader_enable) { enum rarch_shader_type type = - video_shader_parse_type(settings->paths.path_shader, + video_shader_parse_type(retroarch_get_shader_preset(), RARCH_SHADER_NONE); switch (type) @@ -1089,8 +1090,8 @@ static bool d3d9_init_internal(d3d_video_t *d3d, case RARCH_SHADER_CG: if (!string_is_empty(d3d->shader_path)) free(d3d->shader_path); - if (!string_is_empty(settings->paths.path_shader)) - d3d->shader_path = strdup(settings->paths.path_shader); + if (!string_is_empty(retroarch_get_shader_preset())) + d3d->shader_path = strdup(retroarch_get_shader_preset()); break; default: break; diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 48a813a675..a1d521ae01 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -379,11 +379,17 @@ static bool gl_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, { video_shader_ctx_init_t init_data; settings_t *settings = config_get_ptr(); - const char *shader_path = (settings->bools.video_shader_enable - && *settings->paths.path_shader) ? settings->paths.path_shader : NULL; - enum rarch_shader_type type = video_shader_parse_type(shader_path, + const char *shader_path = retroarch_get_shader_preset(); + enum rarch_shader_type type; + + if (shader_path) + { + type = video_shader_parse_type(shader_path, gl->core_context_in_use ? RARCH_SHADER_GLSL : DEFAULT_SHADER_TYPE); + } + else + type = DEFAULT_SHADER_TYPE; switch (type) { diff --git a/gfx/drivers/gx2_gfx.c b/gfx/drivers/gx2_gfx.c index 79e3320104..61e3c2408d 100644 --- a/gfx/drivers/gx2_gfx.c +++ b/gfx/drivers/gx2_gfx.c @@ -23,6 +23,7 @@ #include "../../driver.h" #include "../../configuration.h" #include "../../verbosity.h" +#include "../../retroarch.h" #ifdef HAVE_CONFIG_H #include "../../config.h" @@ -446,7 +447,7 @@ static void *wiiu_gfx_init(const video_info_t *video, if(settings->bools.video_shader_enable) { - const char* ext = path_get_extension(settings->paths.path_shader); + const char* ext = retroarch_get_shader_preset(); if(ext && !strncmp(ext, "slang", 5)) wiiu_gfx_set_shader(wiiu, RARCH_SHADER_SLANG, settings->paths.path_shader); diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 4351f5562d..5b2de52fa6 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -810,8 +810,7 @@ static bool vulkan_init_filter_chain_preset(vk_t *vk, const char *shader_path) static bool vulkan_init_filter_chain(vk_t *vk) { settings_t *settings = config_get_ptr(); - const char *shader_path = (settings->bools.video_shader_enable && *settings->paths.path_shader) ? - settings->paths.path_shader : NULL; + const char *shader_path = retroarch_get_shader_preset(); enum rarch_shader_type type = video_shader_parse_type(shader_path, RARCH_SHADER_NONE); diff --git a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c index 4d8b433960..100f6c60d3 100644 --- a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c @@ -296,7 +296,7 @@ static bool hlsl_d3d9_renderchain_init_shader(void *data, init.shader_type = RARCH_SHADER_HLSL; init.data = data; - init.path = settings->paths.path_shader; + init.path = retroarch_get_shader_preset(); init.shader = &hlsl_backend; RARCH_LOG("D3D]: Using HLSL shader backend.\n"); diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 72bc4c36d5..ffa4c310fa 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -31,6 +31,8 @@ #include #include +#include "../menu/menu_shader.h" + #ifdef HAVE_CONFIG_H #include "../config.h" #endif @@ -672,9 +674,11 @@ retro_proc_address_t video_driver_get_proc_address(const char *sym) bool video_driver_set_shader(enum rarch_shader_type type, const char *path) { + bool ret = false; if (current_video->set_shader) - return current_video->set_shader(video_driver_data, type, path); - return false; + ret = current_video->set_shader(video_driver_data, type, path); + + return ret; } static void video_driver_filter_free(void) diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 9fcc387aca..adfb03691a 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -1642,8 +1642,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "預覽Shader參數") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "戴入Shader預設") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "選單Shader參數") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "儲存Shader預設為") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 10449b4f9a..6010143c4b 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -1689,8 +1689,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Vorschau der Shader-Parameter") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Shader-Voreinstellung laden") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Shader-Parameter anpassen") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Shader-Voreinstellung speichern unter...") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index e37169d050..af30b6281d 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -1542,8 +1542,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Preview Shader Parameters") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Load Shader Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Menu Shader Parameters") 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_CORE, diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 58b4e74a5d..1757cb50b7 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -2985,10 +2985,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Cargar preset de shaders" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Parámetros de shaders del menú" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Guardar preset de shaders como.." diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 7e724453d5..33307c51fd 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -1659,8 +1659,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Prévisualiser les paramètres") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Charger un pré-réglage de shader") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Charger un pré-réglage de shader") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Enregistrer le pré-réglage sous") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 9ba49a2bd7..ac899ab0d0 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1687,8 +1687,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Anteprima dei parametri Shader") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Carica Shader Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Parametri Shader del menu") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Salvare Preset Shader come") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 1c257a27bc..b09611a3c6 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -1753,8 +1753,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "シェーダーパラメータのプレビュー") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "シェーダーのプリセットをロード") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "メニューのシェーダーパラメータ") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "シェーダーのプリセットを名前を付けて保存") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 5787dd7154..8fa53c27f2 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -1639,8 +1639,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "쉐이더 매개변수 미리보기") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "쉐이더 프리셋 불러오기") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "메뉴 쉐이더 매개변수") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "쉐이더 프리셋 다른 이름으로 저장") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 2c820d871a..cb37aff900 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -1540,8 +1540,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Voorbeeldweergave Shader Parameters") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Load Shader Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Menu Shader Parameters") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Shader Preset Opslaan Als") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 0d517a6ff3..ef87d2a682 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -1701,8 +1701,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Podgląd parametrów modułu cieniującego") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Załaduj ustawienia Shader") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Parametry menu Shadera") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Zapisz ustawienie Shadera jako") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index e85ec3b3ab..f1a8606fd0 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -2148,9 +2148,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Carregar Predefinição de Shader" ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Menu de Parâmetros de Shader" - ) MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Salvar Predefinição de Shader Como" ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 8fc632719f..23946d10e2 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -1630,9 +1630,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Ver parâmetros de sombreamento") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, - "Carregar sombreamento pré-definido") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Menu de parâmetros de sombramento") + "Carregar Sombreamento Predefinido") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Guardar pré-definições de sombreamento como") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 5fe069db60..46cddaa6f5 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1668,8 +1668,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Предварительный просмотр параметров шейдера") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Загрузить предварительную настройку шейдера") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Параметры меню шейдера") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, "Сохранить предустановку шейдера как") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 9c694e7f55..4afc164c31 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1756,15 +1756,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, "Shader Passes") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, - "Preview Shader Parameters") + "Shader Parameters") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Load Shader Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Menu Shader Parameters") 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_CORE, "Save Core Preset") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_PARENT, + "Save Content Directory Preset") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, "Save Game Preset") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHARED_CONTEXT, @@ -3147,6 +3147,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_AS, "Save the current shader settings as a new shader preset.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE, "Save the current shader settings as the default settings for this application/core.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_PARENT, + "Save the current shader settings as the default settings for all files in the current content directory.") 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_PARAMETERS, diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index c685d4354b..b83eb25d02 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -1653,8 +1653,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, "Preview Shader Parameters") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, "Tải Shader Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Menu Shader Parameters") 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_CORE, diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 3085d9fb52..7e6fb6cb79 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -60,33 +60,25 @@ static int generic_shader_action_parameter_left( return 0; } -static int shader_action_parameter_left(unsigned type, const char *label, - bool wraparound) +static int shader_action_parameter_left(unsigned type, const char *label, bool wraparound) { video_shader_ctx_t shader_info; struct video_shader_parameter *param = NULL; video_shader_driver_get_current_shader(&shader_info); - param = &shader_info.data->parameters[type - - MENU_SETTINGS_SHADER_PARAMETER_0]; + param = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; if (!param) - return 0; - return generic_shader_action_parameter_left(param, - type, label, wraparound); + return menu_cbs_exit(); + generic_shader_action_parameter_left(param, type, label, wraparound); + + param = menu_shader_manager_get_parameters( + type - MENU_SETTINGS_SHADER_PARAMETER_0); + if (!param) + return menu_cbs_exit(); + return generic_shader_action_parameter_left(param, type, label, wraparound); } -static int shader_action_parameter_preset_left(unsigned type, - const char *label, - bool wraparound) -{ - struct video_shader_parameter *param = menu_shader_manager_get_parameters( - type - MENU_SETTINGS_SHADER_PRESET_PARAMETER_0); - if (!param) - return 0; - return generic_shader_action_parameter_left(param, - type, label, wraparound); -} #endif static int action_left_cheat(unsigned type, const char *label, @@ -614,7 +606,7 @@ static int menu_cbs_init_bind_left_compare_type(menu_file_list_cbs_t *cbs, else if (type >= MENU_SETTINGS_SHADER_PRESET_PARAMETER_0 && type <= MENU_SETTINGS_SHADER_PRESET_PARAMETER_LAST) { - BIND_ACTION_LEFT(cbs, shader_action_parameter_preset_left); + BIND_ACTION_LEFT(cbs, shader_action_parameter_left); } #endif else if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index bea9aecdd2..39fa6cfc46 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1868,7 +1868,8 @@ default_action_dialog_start(action_ok_rename_entry, enum { ACTION_OK_SHADER_PRESET_SAVE_CORE = 0, - ACTION_OK_SHADER_PRESET_SAVE_GAME + ACTION_OK_SHADER_PRESET_SAVE_GAME, + ACTION_OK_SHADER_PRESET_SAVE_PARENT }; static int generic_action_ok_shader_preset_save(const char *path, @@ -1915,6 +1916,12 @@ static int generic_action_ok_shader_preset_save(const char *path, fill_pathname_join(file, directory, game_name, sizeof(file)); } break; + case ACTION_OK_SHADER_PRESET_SAVE_PARENT: + { + fill_pathname_parent_dir_name(tmp, path_get(RARCH_PATH_BASENAME), sizeof(tmp)); + fill_pathname_join(file, directory, tmp, sizeof(file)); + } + break; } if(menu_shader_manager_save_preset(file, false, true)) @@ -1943,7 +1950,12 @@ static int action_ok_shader_preset_save_game(const char *path, 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 generic_action_ok_remap_file_operation(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx, @@ -4189,6 +4201,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE: BIND_ACTION_OK(cbs, action_ok_shader_preset_save_core); break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_PARENT: + BIND_ACTION_OK(cbs, action_ok_shader_preset_save_parent); + break; case MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS: BIND_ACTION_OK(cbs, action_ok_cheat_file_save_as); break; diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 61e53eb34c..3ef4948435 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -71,16 +71,12 @@ int shader_action_parameter_right(unsigned type, const char *label, bool wraparo video_shader_driver_get_current_shader(&shader_info); param = &shader_info.data->parameters[type - MENU_SETTINGS_SHADER_PARAMETER_0]; + if (!param) return menu_cbs_exit(); - return generic_shader_action_parameter_right(param, type, label, wraparound); -} - -int shader_action_parameter_preset_right(unsigned type, const char *label, - bool wraparound) -{ - struct video_shader_parameter *param = menu_shader_manager_get_parameters( - type - MENU_SETTINGS_SHADER_PRESET_PARAMETER_0); + generic_shader_action_parameter_right(param, type, label, wraparound); + param = menu_shader_manager_get_parameters( + type - MENU_SETTINGS_SHADER_PARAMETER_0); if (!param) return menu_cbs_exit(); return generic_shader_action_parameter_right(param, type, label, wraparound); @@ -481,7 +477,7 @@ static int menu_cbs_init_bind_right_compare_type(menu_file_list_cbs_t *cbs, else if (type >= MENU_SETTINGS_SHADER_PRESET_PARAMETER_0 && type <= MENU_SETTINGS_SHADER_PRESET_PARAMETER_LAST) { - BIND_ACTION_RIGHT(cbs, shader_action_parameter_preset_right); + BIND_ACTION_RIGHT(cbs, shader_action_parameter_right); } #endif else if (type >= MENU_SETTINGS_INPUT_DESC_BEGIN diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 195a5e05bb..df21786a9e 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -132,7 +132,7 @@ static int shader_action_parameter_select(const char *path, const char *label, u static int shader_action_parameter_preset_select(const char *path, const char *label, unsigned type, size_t idx) { - return shader_action_parameter_preset_right(type, label, true); + return shader_action_parameter_right(type, label, true); } #endif diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index e573cbbbd4..dfc376bf17 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -135,12 +135,7 @@ static int action_start_shader_action_parameter(unsigned type, const char *label #endif - return 0; -} - -static int action_start_shader_action_preset_parameter(unsigned type, const char *label) -{ - unsigned parameter = type - MENU_SETTINGS_SHADER_PRESET_PARAMETER_0; + unsigned parameter = type - MENU_SETTINGS_SHADER_PARAMETER_0; return menu_shader_manager_clear_parameter(parameter); } @@ -337,7 +332,7 @@ static int menu_cbs_init_bind_start_compare_type(menu_file_list_cbs_t *cbs, else if (type >= MENU_SETTINGS_SHADER_PRESET_PARAMETER_0 && type <= MENU_SETTINGS_SHADER_PRESET_PARAMETER_LAST) { - BIND_ACTION_START(cbs, action_start_shader_action_preset_parameter); + BIND_ACTION_START(cbs, action_start_shader_action_parameter); } else if (type >= MENU_SETTINGS_LIBRETRO_PERF_COUNTERS_BEGIN && type <= MENU_SETTINGS_LIBRETRO_PERF_COUNTERS_END) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index e1f01dffe3..4210b08fe9 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -358,6 +358,7 @@ default_sublabel_macro(action_bind_sublabel_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_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) default_sublabel_macro(action_bind_sublabel_shader_parameters, MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS) default_sublabel_macro(action_bind_sublabel_shader_preset_parameters, MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS) @@ -505,6 +506,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_shader_preset_save_core); break; + case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_PARENT: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_shader_preset_save_parent); + break; case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_shader_preset_save_game); break; diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index 11065bbfd9..c8fe8d53c2 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -141,9 +141,6 @@ int action_refresh_default(file_list_t *list, file_list_t *menu_list); int shader_action_parameter_right(unsigned type, const char *label, bool wraparound); -int shader_action_parameter_preset_right(unsigned type, const char *label, - bool wraparound); - int generic_action_ok_displaylist_push(const char *path, const char *new_path, const char *label, unsigned type, size_t idx, size_t entry_idx, unsigned action_type); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index dd5f68718b..a06163bd37 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1384,12 +1384,17 @@ static int menu_displaylist_parse_shader_options(menu_displaylist_info_t *info) 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), + msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE), 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_PARENT), + msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_PARENT), + MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_PARENT, + 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), + msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME), MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME, MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, @@ -1397,11 +1402,6 @@ static int menu_displaylist_parse_shader_options(menu_displaylist_info_t *info) msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS), MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS, MENU_SETTING_ACTION, 0, 0); - menu_entries_append_enum(info->list, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS), - msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS), - MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_PARAMETERS, - MENU_SETTING_ACTION, 0, 0); menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES), msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_NUM_PASSES), diff --git a/menu/menu_shader.c b/menu/menu_shader.c index 2f3982c345..0aa87873e9 100644 --- a/menu/menu_shader.c +++ b/menu/menu_shader.c @@ -30,6 +30,7 @@ #include "../file_path_special.h" #include "../configuration.h" #include "../paths.h" +#include "../retroarch.h" #include "../verbosity.h" #ifdef HAVE_SHADER_MANAGER @@ -130,14 +131,14 @@ bool menu_shader_manager_init(void) #ifdef HAVE_SHADER_MANAGER settings_t *settings = config_get_ptr(); const char *config_path = path_get(RARCH_PATH_CONFIG); - const char *path_shader = settings->paths.path_shader; + const char *path_shader = retroarch_get_shader_preset(); menu_shader_manager_free(); menu_driver_shader = (struct video_shader*) calloc(1, sizeof(struct video_shader)); - if (!menu_driver_shader) + if (!menu_driver_shader || !path_shader) return false; /* In a multi-config setting, we can't have @@ -248,7 +249,7 @@ bool menu_shader_manager_init(void) * * Sets shader preset. **/ -void menu_shader_manager_set_preset(void *data, +bool menu_shader_manager_set_preset(void *data, unsigned type, const char *preset_path) { #ifdef HAVE_SHADER_MANAGER @@ -260,7 +261,7 @@ void menu_shader_manager_set_preset(void *data, if (!video_driver_set_shader((enum rarch_shader_type)type, preset_path)) { configuration_set_bool(settings, settings->bools.video_shader_enable, false); - return; + return false; } /* Makes sure that we use Menu Preset shader on driver reinit. @@ -271,7 +272,7 @@ void menu_shader_manager_set_preset(void *data, configuration_set_bool(settings, settings->bools.video_shader_enable, true); if (!preset_path || !shader) - return; + return false; /* Load stored Preset into menu on success. * Used when a preset is directly loaded. @@ -280,7 +281,7 @@ void menu_shader_manager_set_preset(void *data, conf = config_file_new(preset_path); if (!conf) - return; + return false; RARCH_LOG("Setting Menu shader: %s.\n", preset_path); @@ -292,6 +293,8 @@ void menu_shader_manager_set_preset(void *data, config_file_free(conf); menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); + + return true; #endif } diff --git a/menu/menu_shader.h b/menu/menu_shader.h index 460b65fdea..92a3345dd5 100644 --- a/menu/menu_shader.h +++ b/menu/menu_shader.h @@ -48,7 +48,7 @@ bool menu_shader_manager_init(void); * * Sets shader preset. **/ -void menu_shader_manager_set_preset( +bool menu_shader_manager_set_preset( void *data, unsigned type, const char *preset_path); /** diff --git a/msg_hash.h b/msg_hash.h index 8dbee05bba..94db6d4d59 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1514,6 +1514,7 @@ enum msg_hash_enums MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_AS), MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_CORE), MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_GAME), + MENU_LABEL(VIDEO_SHADER_PRESET_SAVE_PARENT), MENU_LABEL(USER_LANGUAGE), MENU_LABEL(NETPLAY_NICKNAME), MENU_LABEL(VIDEO_VI_WIDTH), diff --git a/retroarch.c b/retroarch.c index a5afe79e6e..2f680c17c6 100644 --- a/retroarch.c +++ b/retroarch.c @@ -182,6 +182,7 @@ static jmp_buf error_sjlj_context; static enum rarch_core_type current_core_type = CORE_TYPE_PLAIN; static enum rarch_core_type explicit_current_core_type = CORE_TYPE_PLAIN; static char error_string[255] = {0}; +static char runtime_shader_preset[255] = {0}; #ifdef HAVE_THREAD_STORAGE static sthread_tls_t rarch_tls; @@ -1924,6 +1925,36 @@ void retroarch_unset_forced_fullscreen(void) rarch_force_fullscreen = false; } +/* set a runtime shader preset without overwriting the settings value */ +void retroarch_set_shader_preset(const char* preset) +{ + if (!string_is_empty(preset)) + strlcpy(runtime_shader_preset, preset, sizeof(runtime_shader_preset)); + else + runtime_shader_preset[0] = '\0'; +} + +/* unset a runtime shader preset */ +void retroarch_unset_shader_preset(void) +{ + runtime_shader_preset[0] = '\0'; +} + +/* get the name of the current shader preset */ +char* retroarch_get_shader_preset(void) +{ + settings_t *settings = config_get_ptr(); + if (!settings->bools.video_shader_enable) + return NULL; + + if (!string_is_empty(runtime_shader_preset)) + return runtime_shader_preset; + else if (!string_is_empty(settings->paths.path_shader)) + return settings->paths.path_shader; + else + return NULL; +} + bool retroarch_override_setting_is_set(enum rarch_override_setting enum_idx, void *data) { switch (enum_idx) diff --git a/retroarch.h b/retroarch.h index 78c0459c0f..63c37428f1 100644 --- a/retroarch.h +++ b/retroarch.h @@ -288,6 +288,12 @@ void retroarch_unset_forced_fullscreen(void); void retroarch_set_current_core_type(enum rarch_core_type type, bool explicitly_set); +void retroarch_set_shader_preset(const char* preset); + +void retroarch_unset_shader_preset(void); + +char* retroarch_get_shader_preset(void); + /** * retroarch_fail: * @error_code : Error code.