Merge pull request #10671 from johanbcn/improved-shader-preset-dirs

Improved shader preset dirs
This commit is contained in:
Autechre 2020-05-21 17:17:03 +02:00 committed by GitHub
commit 52e8c102fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 123 additions and 97 deletions

View File

@ -220,8 +220,9 @@ clear:
static bool menu_shader_manager_save_preset_internal( static bool menu_shader_manager_save_preset_internal(
const struct video_shader *shader, const char *basename, const struct video_shader *shader, const char *basename,
const char *dir_video_shader, const char *dir_video_shader,
const char *dir_menu_config, bool apply, bool save_reference,
bool apply, bool save_reference) const char **target_dirs,
size_t num_target_dirs)
{ {
bool ret = false; bool ret = false;
enum rarch_shader_type type = RARCH_SHADER_NONE; enum rarch_shader_type type = RARCH_SHADER_NONE;
@ -278,28 +279,14 @@ static bool menu_shader_manager_save_preset_internal(
} }
else else
{ {
const char *dirs[3] = {0};
char config_directory[PATH_MAX_LENGTH];
char basedir[PATH_MAX_LENGTH]; char basedir[PATH_MAX_LENGTH];
config_directory[0] = '\0'; for (i = 0; i < num_target_dirs; i++)
if (!path_is_empty(RARCH_PATH_CONFIG))
fill_pathname_basedir(
config_directory,
path_get(RARCH_PATH_CONFIG),
sizeof(config_directory));
dirs[0] = dir_menu_config;
dirs[1] = dir_video_shader;
dirs[2] = config_directory;
for (i = 0; i < ARRAY_SIZE(dirs); i++)
{ {
if (string_is_empty(dirs[i])) if (string_is_empty(target_dirs[i]))
continue; continue;
fill_pathname_join(buffer, dirs[i], fill_pathname_join(buffer, target_dirs[i],
fullname, sizeof(buffer)); fullname, sizeof(buffer));
strlcpy(basedir, buffer, sizeof(basedir)); strlcpy(basedir, buffer, sizeof(basedir));
@ -348,31 +335,50 @@ static bool menu_shader_manager_operate_auto_preset(
const char *dir_menu_config, const char *dir_menu_config,
enum auto_shader_type type, bool apply) enum auto_shader_type type, bool apply)
{ {
char old_presets_directory[PATH_MAX_LENGTH];
char config_directory[PATH_MAX_LENGTH];
char tmp[PATH_MAX_LENGTH]; char tmp[PATH_MAX_LENGTH];
char directory[PATH_MAX_LENGTH];
char file[PATH_MAX_LENGTH]; char file[PATH_MAX_LENGTH];
struct retro_system_info *system = runloop_get_libretro_system_info(); struct retro_system_info *system = runloop_get_libretro_system_info();
const char *core_name = system ? system->library_name : NULL; const char *core_name = system ? system->library_name : NULL;
const char *auto_preset_dirs[3] = {0};
tmp[0] = directory[0] = file[0] = '\0'; old_presets_directory[0] = config_directory[0] = tmp[0] = file[0] = '\0';
if (type != SHADER_PRESET_GLOBAL && string_is_empty(core_name)) if (type != SHADER_PRESET_GLOBAL && string_is_empty(core_name))
return false; return false;
if (!path_is_empty(RARCH_PATH_CONFIG))
fill_pathname_basedir(
config_directory,
path_get(RARCH_PATH_CONFIG),
sizeof(config_directory));
/* We are only including this directory for compatibility purposes with
* versions 1.8.7 and older. */
if (op != AUTO_SHADER_OP_SAVE && !string_is_empty(dir_video_shader))
fill_pathname_join(
old_presets_directory,
dir_video_shader,
"presets",
sizeof(old_presets_directory));
auto_preset_dirs[0] = dir_menu_config;
auto_preset_dirs[1] = config_directory;
auto_preset_dirs[2] = old_presets_directory;
switch (type) switch (type)
{ {
case SHADER_PRESET_GLOBAL: case SHADER_PRESET_GLOBAL:
fill_pathname_join(file, "presets", "global", sizeof(file)); strlcpy(file, "global", sizeof(file));
break; break;
case SHADER_PRESET_CORE: case SHADER_PRESET_CORE:
fill_pathname_join(directory, "presets", core_name, sizeof(directory)); fill_pathname_join(file, core_name, core_name, sizeof(file));
fill_pathname_join(file, directory, core_name, sizeof(file));
break; break;
case SHADER_PRESET_PARENT: case SHADER_PRESET_PARENT:
fill_pathname_join(directory, "presets", core_name, sizeof(directory));
fill_pathname_parent_dir_name(tmp, fill_pathname_parent_dir_name(tmp,
path_get(RARCH_PATH_BASENAME), sizeof(tmp)); path_get(RARCH_PATH_BASENAME), sizeof(tmp));
fill_pathname_join(file, directory, tmp, sizeof(file)); fill_pathname_join(file, core_name, tmp, sizeof(file));
break; break;
case SHADER_PRESET_GAME: case SHADER_PRESET_GAME:
{ {
@ -380,8 +386,7 @@ static bool menu_shader_manager_operate_auto_preset(
path_basename(path_get(RARCH_PATH_BASENAME)); path_basename(path_get(RARCH_PATH_BASENAME));
if (string_is_empty(game_name)) if (string_is_empty(game_name))
return false; return false;
fill_pathname_join(directory, "presets", core_name, sizeof(directory)); fill_pathname_join(file, core_name, game_name, sizeof(file));
fill_pathname_join(file, directory, game_name, sizeof(file));
break; break;
} }
default: default:
@ -394,38 +399,28 @@ static bool menu_shader_manager_operate_auto_preset(
return menu_shader_manager_save_preset_internal( return menu_shader_manager_save_preset_internal(
shader, file, shader, file,
dir_video_shader, dir_video_shader,
dir_menu_config, apply, true,
apply, true); auto_preset_dirs,
ARRAY_SIZE(auto_preset_dirs));
case AUTO_SHADER_OP_REMOVE: case AUTO_SHADER_OP_REMOVE:
{ {
/* remove all supported auto-shaders of given type */ /* remove all supported auto-shaders of given type */
char *end; char *end;
size_t i, j, n, m; size_t i, j, n, m;
const char *dirs[3] = {0};
char config_directory[PATH_MAX_LENGTH];
char preset_path[PATH_MAX_LENGTH]; char preset_path[PATH_MAX_LENGTH];
/* n = amount of relevant shader presets found
* m = amount of successfully deleted shader presets */
n = m = 0; n = m = 0;
config_directory[0] = '\0'; for (i = 0; i < ARRAY_SIZE(auto_preset_dirs); i++)
if (!path_is_empty(RARCH_PATH_CONFIG))
fill_pathname_basedir(
config_directory,
path_get(RARCH_PATH_CONFIG),
sizeof(config_directory));
dirs[0] = dir_menu_config;
dirs[1] = dir_video_shader;
dirs[2] = config_directory;
for (i = 0; i < ARRAY_SIZE(dirs); i++)
{ {
if (string_is_empty(dirs[i])) if (string_is_empty(auto_preset_dirs[i]))
continue; continue;
fill_pathname_join(preset_path, dirs[i], file, sizeof(preset_path)); fill_pathname_join(preset_path,
auto_preset_dirs[i], file, sizeof(preset_path));
end = preset_path + strlen(preset_path); end = preset_path + strlen(preset_path);
for (j = 0; j < ARRAY_SIZE(shader_types); j++) for (j = 0; j < ARRAY_SIZE(shader_types); j++)
@ -461,28 +456,15 @@ static bool menu_shader_manager_operate_auto_preset(
char *end; char *end;
size_t i, j; size_t i, j;
const char *dirs[3] = {0};
char config_directory[PATH_MAX_LENGTH];
char preset_path[PATH_MAX_LENGTH]; char preset_path[PATH_MAX_LENGTH];
config_directory[0] = '\0'; for (i = 0; i < ARRAY_SIZE(auto_preset_dirs); i++)
if (!path_is_empty(RARCH_PATH_CONFIG))
fill_pathname_basedir(
config_directory,
path_get(RARCH_PATH_CONFIG),
sizeof(config_directory));
dirs[0] = dir_menu_config;
dirs[1] = dir_video_shader;
dirs[2] = config_directory;
for (i = 0; i < ARRAY_SIZE(dirs); i++)
{ {
if (string_is_empty(dirs[i])) if (string_is_empty(auto_preset_dirs[i]))
continue; continue;
fill_pathname_join(preset_path, dirs[i], file, sizeof(preset_path)); fill_pathname_join(preset_path,
auto_preset_dirs[i], file, sizeof(preset_path));
end = preset_path + strlen(preset_path); end = preset_path + strlen(preset_path);
for (j = 0; j < ARRAY_SIZE(shader_types); j++) for (j = 0; j < ARRAY_SIZE(shader_types); j++)
@ -513,10 +495,10 @@ static bool menu_shader_manager_operate_auto_preset(
* @apply : immediately set preset after saving * @apply : immediately set preset after saving
* *
* Save a shader as an auto-shader to it's appropriate path: * Save a shader as an auto-shader to it's appropriate path:
* SHADER_PRESET_GLOBAL: <shader dir>/presets/global * SHADER_PRESET_GLOBAL: <target dir>/global
* SHADER_PRESET_CORE: <shader dir>/presets/<core name>/<core name> * SHADER_PRESET_CORE: <target dir>/<core name>/<core name>
* SHADER_PRESET_PARENT: <shader dir>/presets/<core name>/<parent> * SHADER_PRESET_PARENT: <target dir>/<core name>/<parent>
* SHADER_PRESET_GAME: <shader dir>/presets/<core name>/<game name> * SHADER_PRESET_GAME: <target dir>/<core name>/<game name>
* Needs to be consistent with retroarch_load_shader_preset() * Needs to be consistent with retroarch_load_shader_preset()
* Auto-shaders will be saved as a reference if possible * Auto-shaders will be saved as a reference if possible
**/ **/
@ -549,11 +531,27 @@ bool menu_shader_manager_save_preset(const struct video_shader *shader,
const char *dir_menu_config, const char *dir_menu_config,
bool apply) bool apply)
{ {
char config_directory[PATH_MAX_LENGTH];
const char *preset_dirs[3] = {0};
config_directory[0] = '\0';
if (!path_is_empty(RARCH_PATH_CONFIG))
fill_pathname_basedir(
config_directory,
path_get(RARCH_PATH_CONFIG),
sizeof(config_directory));
preset_dirs[0] = dir_video_shader;
preset_dirs[1] = dir_menu_config;
preset_dirs[2] = config_directory;
return menu_shader_manager_save_preset_internal( return menu_shader_manager_save_preset_internal(
shader, basename, shader, basename,
dir_video_shader, dir_video_shader,
dir_menu_config, apply, false,
apply, false); preset_dirs,
ARRAY_SIZE(preset_dirs));
} }
/** /**

View File

@ -2456,8 +2456,10 @@ struct string_list *dir_list_new_special(const char *input_dir,
string_list_free(str_list); string_list_free(str_list);
exts = ext_shaders; exts = ext_shaders;
} }
#endif
break; break;
#else
return NULL;
#endif
case DIR_LIST_COLLECTIONS: case DIR_LIST_COLLECTIONS:
exts = "lpl"; exts = "lpl";
break; break;
@ -21467,6 +21469,8 @@ static bool video_driver_init_internal(bool *video_is_threaded)
settings_t *settings = configuration_settings; settings_t *settings = configuration_settings;
struct retro_game_geometry *geom = &video_driver_av_info.geometry; struct retro_game_geometry *geom = &video_driver_av_info.geometry;
const char *path_softfilter_plugin = settings->paths.path_softfilter_plugin; const char *path_softfilter_plugin = settings->paths.path_softfilter_plugin;
char *config_file_directory = NULL;
bool dir_list_is_free = true;
if (!string_is_empty(path_softfilter_plugin)) if (!string_is_empty(path_softfilter_plugin))
video_driver_init_filter(video_driver_pix_fmt); video_driver_init_filter(video_driver_pix_fmt);
@ -21668,10 +21672,32 @@ static bool video_driver_init_internal(bool *video_is_threaded)
dir_free_shader(); dir_free_shader();
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
if (!string_is_empty(settings->paths.directory_video_shader)) if (!string_is_empty(settings->paths.directory_video_shader))
dir_init_shader(settings->paths.directory_video_shader, dir_list_is_free = !dir_init_shader(
settings->paths.directory_video_shader,
settings->bools.show_hidden_files); settings->bools.show_hidden_files);
if (dir_list_is_free && !string_is_empty(settings->paths.directory_menu_config))
dir_list_is_free = !dir_init_shader(
settings->paths.directory_menu_config,
settings->bools.show_hidden_files);
if (dir_list_is_free && !path_is_empty(RARCH_PATH_CONFIG))
{
config_file_directory = strdup(path_get(RARCH_PATH_CONFIG));
path_basedir(config_file_directory);
if (config_file_directory)
{
dir_list_is_free = !dir_init_shader(
config_file_directory,
settings->bools.show_hidden_files);
free(config_file_directory);
}
}
#endif
return true; return true;
error: error:
@ -27373,17 +27399,16 @@ static bool retroarch_load_shader_preset_internal(
* Tries to load a supported core-, game-, folder-specific or global * Tries to load a supported core-, game-, folder-specific or global
* shader preset from its respective location: * shader preset from its respective location:
* *
* global: $SHADER_DIR/presets/global.$PRESET_EXT * global: $CONFIG_DIR/global.$PRESET_EXT
* core-specific: $SHADER_DIR/presets/$CORE_NAME/$CORE_NAME.$PRESET_EXT * core-specific: $CONFIG_DIR/$CORE_NAME/$CORE_NAME.$PRESET_EXT
* folder-specific: $SHADER_DIR/presets/$CORE_NAME/$FOLDER_NAME.$PRESET_EXT * folder-specific: $CONFIG_DIR/$CORE_NAME/$FOLDER_NAME.$PRESET_EXT
* game-specific: $SHADER_DIR/presets/$CORE_NAME/$GAME_NAME.$PRESET_EXT * game-specific: $CONFIG_DIR/$CORE_NAME/$GAME_NAME.$PRESET_EXT
* *
* $SHADER_DIR is composed by three different locations which will be searched * $CONFIG_DIR is expected to be Menu Config directory, or failing that, the
* in the following order (search will stop on first match): * directory where retroarch.cfg is stored.
* *
* 1. The Menu Config directory * For compatibility purposes with versions 1.8.7 and older, the presets
* 2. The Video Shader directory * subdirectory on the Video Shader path is used as a fallback directory.
* 3. The directory where the configuration file is stored
* *
* Note: Uses video_shader_is_supported() which only works after * Note: Uses video_shader_is_supported() which only works after
* context driver initialization. * context driver initialization.
@ -27401,7 +27426,7 @@ static bool retroarch_load_shader_preset(void)
const char *game_name = path_basename(rarch_path_basename); const char *game_name = path_basename(rarch_path_basename);
char *content_dir_name = NULL; char *content_dir_name = NULL;
char *config_file_directory = NULL; char *config_file_directory = NULL;
char *shader_directory = NULL; char *old_presets_directory = NULL;
bool auto_shaders_enable = settings->bools.auto_shaders_enable; bool auto_shaders_enable = settings->bools.auto_shaders_enable;
const char *dirs[3] = {0}; const char *dirs[3] = {0};
@ -27420,8 +27445,8 @@ static bool retroarch_load_shader_preset(void)
if (!config_file_directory) if (!config_file_directory)
goto end; goto end;
shader_directory = (char*)malloc(PATH_MAX_LENGTH); old_presets_directory = (char*)malloc(PATH_MAX_LENGTH);
if (!shader_directory) if (!old_presets_directory)
goto end; goto end;
content_dir_name[0] = '\0'; content_dir_name[0] = '\0';
@ -27436,21 +27461,24 @@ static bool retroarch_load_shader_preset(void)
fill_pathname_basedir(config_file_directory, fill_pathname_basedir(config_file_directory,
path_get(RARCH_PATH_CONFIG), PATH_MAX_LENGTH); path_get(RARCH_PATH_CONFIG), PATH_MAX_LENGTH);
old_presets_directory[0] = '\0';
if (!string_is_empty(video_shader_directory))
fill_pathname_join(old_presets_directory,
video_shader_directory, "presets", PATH_MAX_LENGTH);
dirs[0] = menu_config_directory; dirs[0] = menu_config_directory;
dirs[1] = video_shader_directory; dirs[1] = config_file_directory;
dirs[2] = config_file_directory; dirs[2] = old_presets_directory;
for (i = 0; i < ARRAY_SIZE(dirs); i++) for (i = 0; i < ARRAY_SIZE(dirs); i++)
{ {
if (string_is_empty(dirs[i])) if (string_is_empty(dirs[i]))
continue; continue;
fill_pathname_join(shader_directory, RARCH_LOG("[Shaders]: preset directory: %s\n", dirs[i]);
dirs[i], "presets", PATH_MAX_LENGTH);
RARCH_LOG("[Shaders]: preset directory: %s\n", shader_directory); ret = retroarch_load_shader_preset_internal(dirs[i], core_name,
ret = retroarch_load_shader_preset_internal(shader_directory, core_name,
game_name); game_name);
if (ret) if (ret)
@ -27459,7 +27487,7 @@ static bool retroarch_load_shader_preset(void)
break; break;
} }
ret = retroarch_load_shader_preset_internal(shader_directory, core_name, ret = retroarch_load_shader_preset_internal(dirs[i], core_name,
content_dir_name); content_dir_name);
if (ret) if (ret)
@ -27468,7 +27496,7 @@ static bool retroarch_load_shader_preset(void)
break; break;
} }
ret = retroarch_load_shader_preset_internal(shader_directory, core_name, ret = retroarch_load_shader_preset_internal(dirs[i], core_name,
core_name); core_name);
if (ret) if (ret)
@ -27477,7 +27505,7 @@ static bool retroarch_load_shader_preset(void)
break; break;
} }
ret = retroarch_load_shader_preset_internal(shader_directory, NULL, ret = retroarch_load_shader_preset_internal(dirs[i], NULL,
"global"); "global");
if (ret) if (ret)
@ -27490,7 +27518,7 @@ static bool retroarch_load_shader_preset(void)
end: end:
free(content_dir_name); free(content_dir_name);
free(config_file_directory); free(config_file_directory);
free(shader_directory); free(old_presets_directory);
return ret; return ret;
} }
#endif #endif