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(
const struct video_shader *shader, const char *basename,
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;
enum rarch_shader_type type = RARCH_SHADER_NONE;
@ -278,28 +279,14 @@ static bool menu_shader_manager_save_preset_internal(
}
else
{
const char *dirs[3] = {0};
char config_directory[PATH_MAX_LENGTH];
char basedir[PATH_MAX_LENGTH];
config_directory[0] = '\0';
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++)
for (i = 0; i < num_target_dirs; i++)
{
if (string_is_empty(dirs[i]))
if (string_is_empty(target_dirs[i]))
continue;
fill_pathname_join(buffer, dirs[i],
fill_pathname_join(buffer, target_dirs[i],
fullname, sizeof(buffer));
strlcpy(basedir, buffer, sizeof(basedir));
@ -348,31 +335,50 @@ static bool menu_shader_manager_operate_auto_preset(
const char *dir_menu_config,
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 directory[PATH_MAX_LENGTH];
char file[PATH_MAX_LENGTH];
struct retro_system_info *system = runloop_get_libretro_system_info();
const char *core_name = system ? system->library_name : NULL;
struct retro_system_info *system = runloop_get_libretro_system_info();
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))
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)
{
case SHADER_PRESET_GLOBAL:
fill_pathname_join(file, "presets", "global", sizeof(file));
strlcpy(file, "global", sizeof(file));
break;
case SHADER_PRESET_CORE:
fill_pathname_join(directory, "presets", core_name, sizeof(directory));
fill_pathname_join(file, directory, core_name, sizeof(file));
fill_pathname_join(file, core_name, core_name, sizeof(file));
break;
case SHADER_PRESET_PARENT:
fill_pathname_join(directory, "presets", core_name, sizeof(directory));
fill_pathname_parent_dir_name(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;
case SHADER_PRESET_GAME:
{
@ -380,8 +386,7 @@ static bool menu_shader_manager_operate_auto_preset(
path_basename(path_get(RARCH_PATH_BASENAME));
if (string_is_empty(game_name))
return false;
fill_pathname_join(directory, "presets", core_name, sizeof(directory));
fill_pathname_join(file, directory, game_name, sizeof(file));
fill_pathname_join(file, core_name, game_name, sizeof(file));
break;
}
default:
@ -394,38 +399,28 @@ static bool menu_shader_manager_operate_auto_preset(
return menu_shader_manager_save_preset_internal(
shader, file,
dir_video_shader,
dir_menu_config,
apply, true);
apply, true,
auto_preset_dirs,
ARRAY_SIZE(auto_preset_dirs));
case AUTO_SHADER_OP_REMOVE:
{
/* remove all supported auto-shaders of given type */
char *end;
size_t i, j, n, m;
const char *dirs[3] = {0};
char config_directory[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;
config_directory[0] = '\0';
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++)
for (i = 0; i < ARRAY_SIZE(auto_preset_dirs); i++)
{
if (string_is_empty(dirs[i]))
if (string_is_empty(auto_preset_dirs[i]))
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);
for (j = 0; j < ARRAY_SIZE(shader_types); j++)
@ -461,28 +456,15 @@ static bool menu_shader_manager_operate_auto_preset(
char *end;
size_t i, j;
const char *dirs[3] = {0};
char config_directory[PATH_MAX_LENGTH];
char preset_path[PATH_MAX_LENGTH];
config_directory[0] = '\0';
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++)
for (i = 0; i < ARRAY_SIZE(auto_preset_dirs); i++)
{
if (string_is_empty(dirs[i]))
if (string_is_empty(auto_preset_dirs[i]))
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);
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
*
* Save a shader as an auto-shader to it's appropriate path:
* SHADER_PRESET_GLOBAL: <shader dir>/presets/global
* SHADER_PRESET_CORE: <shader dir>/presets/<core name>/<core name>
* SHADER_PRESET_PARENT: <shader dir>/presets/<core name>/<parent>
* SHADER_PRESET_GAME: <shader dir>/presets/<core name>/<game name>
* SHADER_PRESET_GLOBAL: <target dir>/global
* SHADER_PRESET_CORE: <target dir>/<core name>/<core name>
* SHADER_PRESET_PARENT: <target dir>/<core name>/<parent>
* SHADER_PRESET_GAME: <target dir>/<core name>/<game name>
* Needs to be consistent with retroarch_load_shader_preset()
* 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,
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(
shader, basename,
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);
exts = ext_shaders;
}
#endif
break;
#else
return NULL;
#endif
case DIR_LIST_COLLECTIONS:
exts = "lpl";
break;
@ -21467,6 +21469,8 @@ static bool video_driver_init_internal(bool *video_is_threaded)
settings_t *settings = configuration_settings;
struct retro_game_geometry *geom = &video_driver_av_info.geometry;
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))
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();
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
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);
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;
error:
@ -27373,17 +27399,16 @@ static bool retroarch_load_shader_preset_internal(
* 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
* global: $CONFIG_DIR/global.$PRESET_EXT
* core-specific: $CONFIG_DIR/$CORE_NAME/$CORE_NAME.$PRESET_EXT
* folder-specific: $CONFIG_DIR/$CORE_NAME/$FOLDER_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
* in the following order (search will stop on first match):
* $CONFIG_DIR is expected to be Menu Config directory, or failing that, the
* directory where retroarch.cfg is stored.
*
* 1. The Menu Config directory
* 2. The Video Shader directory
* 3. The directory where the configuration file is stored
* For compatibility purposes with versions 1.8.7 and older, the presets
* subdirectory on the Video Shader path is used as a fallback directory.
*
* Note: Uses video_shader_is_supported() which only works after
* context driver initialization.
@ -27401,7 +27426,7 @@ static bool retroarch_load_shader_preset(void)
const char *game_name = path_basename(rarch_path_basename);
char *content_dir_name = NULL;
char *config_file_directory = NULL;
char *shader_directory = NULL;
char *old_presets_directory = NULL;
bool auto_shaders_enable = settings->bools.auto_shaders_enable;
const char *dirs[3] = {0};
@ -27420,8 +27445,8 @@ static bool retroarch_load_shader_preset(void)
if (!config_file_directory)
goto end;
shader_directory = (char*)malloc(PATH_MAX_LENGTH);
if (!shader_directory)
old_presets_directory = (char*)malloc(PATH_MAX_LENGTH);
if (!old_presets_directory)
goto end;
content_dir_name[0] = '\0';
@ -27436,21 +27461,24 @@ static bool retroarch_load_shader_preset(void)
fill_pathname_basedir(config_file_directory,
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[1] = video_shader_directory;
dirs[2] = config_file_directory;
dirs[1] = config_file_directory;
dirs[2] = old_presets_directory;
for (i = 0; i < ARRAY_SIZE(dirs); i++)
{
if (string_is_empty(dirs[i]))
continue;
fill_pathname_join(shader_directory,
dirs[i], "presets", PATH_MAX_LENGTH);
RARCH_LOG("[Shaders]: preset directory: %s\n", dirs[i]);
RARCH_LOG("[Shaders]: preset directory: %s\n", shader_directory);
ret = retroarch_load_shader_preset_internal(shader_directory, core_name,
ret = retroarch_load_shader_preset_internal(dirs[i], core_name,
game_name);
if (ret)
@ -27459,7 +27487,7 @@ static bool retroarch_load_shader_preset(void)
break;
}
ret = retroarch_load_shader_preset_internal(shader_directory, core_name,
ret = retroarch_load_shader_preset_internal(dirs[i], core_name,
content_dir_name);
if (ret)
@ -27468,7 +27496,7 @@ static bool retroarch_load_shader_preset(void)
break;
}
ret = retroarch_load_shader_preset_internal(shader_directory, core_name,
ret = retroarch_load_shader_preset_internal(dirs[i], core_name,
core_name);
if (ret)
@ -27477,7 +27505,7 @@ static bool retroarch_load_shader_preset(void)
break;
}
ret = retroarch_load_shader_preset_internal(shader_directory, NULL,
ret = retroarch_load_shader_preset_internal(dirs[i], NULL,
"global");
if (ret)
@ -27490,7 +27518,7 @@ static bool retroarch_load_shader_preset(void)
end:
free(content_dir_name);
free(config_file_directory);
free(shader_directory);
free(old_presets_directory);
return ret;
}
#endif