mirror of
https://github.com/libretro/RetroArch
synced 2025-03-28 19:20:35 +00:00
Merge pull request #10627 from johanbcn/shader-presets-fallback-dirs
Fallback directories for shader presets
This commit is contained in:
commit
b7f56fc551
@ -278,8 +278,9 @@ static bool menu_shader_manager_save_preset_internal(
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *dirs[3] = {0};
|
||||
const char *dirs[3] = {0};
|
||||
char config_directory[PATH_MAX_LENGTH];
|
||||
char basedir[PATH_MAX_LENGTH];
|
||||
|
||||
config_directory[0] = '\0';
|
||||
|
||||
@ -289,8 +290,8 @@ static bool menu_shader_manager_save_preset_internal(
|
||||
path_get(RARCH_PATH_CONFIG),
|
||||
sizeof(config_directory));
|
||||
|
||||
dirs[0] = dir_video_shader;
|
||||
dirs[1] = dir_menu_config;
|
||||
dirs[0] = dir_menu_config;
|
||||
dirs[1] = dir_video_shader;
|
||||
dirs[2] = config_directory;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(dirs); i++)
|
||||
@ -301,6 +302,19 @@ static bool menu_shader_manager_save_preset_internal(
|
||||
fill_pathname_join(buffer, dirs[i],
|
||||
fullname, sizeof(buffer));
|
||||
|
||||
strlcpy(basedir, buffer, sizeof(basedir));
|
||||
path_basedir(basedir);
|
||||
|
||||
if (!path_is_directory(basedir)) {
|
||||
ret = path_mkdir(basedir);
|
||||
|
||||
if (!ret)
|
||||
{
|
||||
RARCH_WARN("Failed to create preset directory %s.\n", basedir);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
preset_path = buffer;
|
||||
|
||||
ret = video_shader_write_preset(preset_path,
|
||||
@ -337,43 +351,25 @@ static bool menu_shader_manager_operate_auto_preset(
|
||||
char tmp[PATH_MAX_LENGTH];
|
||||
char directory[PATH_MAX_LENGTH];
|
||||
char file[PATH_MAX_LENGTH];
|
||||
bool success = false;
|
||||
struct retro_system_info *system = runloop_get_libretro_system_info();
|
||||
const char *core_name = system ? system->library_name : NULL;
|
||||
|
||||
tmp[0] = directory[0] = file[0] = '\0';
|
||||
|
||||
if (type == SHADER_PRESET_GLOBAL)
|
||||
fill_pathname_join(
|
||||
directory,
|
||||
dir_video_shader,
|
||||
"presets",
|
||||
sizeof(directory));
|
||||
else if (string_is_empty(core_name))
|
||||
if (type != SHADER_PRESET_GLOBAL && string_is_empty(core_name))
|
||||
return false;
|
||||
else
|
||||
{
|
||||
fill_pathname_join(
|
||||
tmp,
|
||||
dir_video_shader,
|
||||
"presets",
|
||||
sizeof(tmp));
|
||||
fill_pathname_join(
|
||||
directory,
|
||||
tmp,
|
||||
core_name,
|
||||
sizeof(directory));
|
||||
}
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case SHADER_PRESET_GLOBAL:
|
||||
fill_pathname_join(file, directory, "global", sizeof(file));
|
||||
fill_pathname_join(file, "presets", "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));
|
||||
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));
|
||||
@ -384,6 +380,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));
|
||||
break;
|
||||
}
|
||||
@ -394,9 +391,6 @@ static bool menu_shader_manager_operate_auto_preset(
|
||||
switch (op)
|
||||
{
|
||||
case AUTO_SHADER_OP_SAVE:
|
||||
if (!path_is_directory(directory))
|
||||
path_mkdir(directory);
|
||||
|
||||
return menu_shader_manager_save_preset_internal(
|
||||
shader, file,
|
||||
dir_video_shader,
|
||||
@ -405,41 +399,105 @@ static bool menu_shader_manager_operate_auto_preset(
|
||||
case AUTO_SHADER_OP_REMOVE:
|
||||
{
|
||||
/* remove all supported auto-shaders of given type */
|
||||
char *end = file + strlen(file);
|
||||
size_t i;
|
||||
for (i = 0; i < ARRAY_SIZE(shader_types); i++)
|
||||
{
|
||||
const char *preset_ext;
|
||||
char *end;
|
||||
size_t i, j, n, m;
|
||||
|
||||
if (!video_shader_is_supported(shader_types[i]))
|
||||
const char *dirs[3] = {0};
|
||||
char config_directory[PATH_MAX_LENGTH];
|
||||
char preset_path[PATH_MAX_LENGTH];
|
||||
|
||||
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++)
|
||||
{
|
||||
if (string_is_empty(dirs[i]))
|
||||
continue;
|
||||
|
||||
preset_ext = video_shader_get_preset_extension(shader_types[i]);
|
||||
strlcpy(end, preset_ext, sizeof(file) - (end-file));
|
||||
fill_pathname_join(preset_path, dirs[i], file, sizeof(preset_path));
|
||||
end = preset_path + strlen(preset_path);
|
||||
|
||||
if (!filestream_delete(file))
|
||||
success = true;
|
||||
for (j = 0; j < ARRAY_SIZE(shader_types); j++)
|
||||
{
|
||||
const char *preset_ext;
|
||||
|
||||
if (!video_shader_is_supported(shader_types[j]))
|
||||
continue;
|
||||
|
||||
preset_ext = video_shader_get_preset_extension(shader_types[j]);
|
||||
strlcpy(end, preset_ext, sizeof(preset_path) - (end - preset_path));
|
||||
|
||||
if (path_is_valid(preset_path))
|
||||
{
|
||||
n++;
|
||||
|
||||
if (!filestream_delete(preset_path))
|
||||
{
|
||||
m++;
|
||||
RARCH_LOG("Deleted shader preset from %s.\n", preset_path);
|
||||
}
|
||||
else
|
||||
RARCH_WARN("Failed to remove shader preset at %s.\n", preset_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return n == m;
|
||||
}
|
||||
return success;
|
||||
case AUTO_SHADER_OP_EXISTS:
|
||||
{
|
||||
/* test if any supported auto-shaders of given type exists */
|
||||
char *end = file + strlen(file);
|
||||
size_t i;
|
||||
char *end;
|
||||
size_t i, j;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(shader_types); i++)
|
||||
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++)
|
||||
{
|
||||
const char *preset_ext;
|
||||
|
||||
if (!video_shader_is_supported(shader_types[i]))
|
||||
if (string_is_empty(dirs[i]))
|
||||
continue;
|
||||
|
||||
preset_ext = video_shader_get_preset_extension(shader_types[i]);
|
||||
strlcpy(end, preset_ext, sizeof(file) - (end-file));
|
||||
fill_pathname_join(preset_path, dirs[i], file, sizeof(preset_path));
|
||||
end = preset_path + strlen(preset_path);
|
||||
|
||||
if (path_is_valid(file))
|
||||
return true;
|
||||
for (j = 0; j < ARRAY_SIZE(shader_types); j++)
|
||||
{
|
||||
const char *preset_ext;
|
||||
|
||||
if (!video_shader_is_supported(shader_types[j]))
|
||||
continue;
|
||||
|
||||
preset_ext = video_shader_get_preset_extension(shader_types[j]);
|
||||
strlcpy(end, preset_ext, sizeof(preset_path) - (end - preset_path));
|
||||
|
||||
if (path_is_valid(preset_path))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
122
retroarch.c
122
retroarch.c
@ -27318,6 +27318,13 @@ static bool retroarch_load_shader_preset_internal(
|
||||
* folder-specific: $SHADER_DIR/presets/$CORE_NAME/$FOLDER_NAME.$PRESET_EXT
|
||||
* game-specific: $SHADER_DIR/presets/$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):
|
||||
*
|
||||
* 1. The Menu Config directory
|
||||
* 2. The Video Shader directory
|
||||
* 3. The directory where the configuration file is stored
|
||||
*
|
||||
* Note: Uses video_shader_is_supported() which only works after
|
||||
* context driver initialization.
|
||||
*
|
||||
@ -27327,71 +27334,104 @@ static bool retroarch_load_shader_preset(void)
|
||||
{
|
||||
settings_t *settings = configuration_settings;
|
||||
const char *video_shader_directory = settings->paths.directory_video_shader;
|
||||
const char *menu_config_directory = settings->paths.directory_menu_config;
|
||||
const char *core_name = runloop_system.info.library_name;
|
||||
const char *rarch_path_basename = path_get(RARCH_PATH_BASENAME);
|
||||
|
||||
const char *game_name = path_basename(rarch_path_basename);
|
||||
char *content_dir_name = NULL;
|
||||
char *config_file_directory = NULL;
|
||||
char *shader_directory = NULL;
|
||||
bool auto_shaders_enable = settings->bools.auto_shaders_enable;
|
||||
|
||||
const char *dirs[3] = {0};
|
||||
size_t i = 0;
|
||||
|
||||
bool ret = false;
|
||||
|
||||
if (!auto_shaders_enable)
|
||||
return false;
|
||||
if (string_is_empty(video_shader_directory))
|
||||
return false;
|
||||
|
||||
content_dir_name = (char*)malloc(PATH_MAX_LENGTH);
|
||||
if (!content_dir_name)
|
||||
goto end;
|
||||
|
||||
config_file_directory = (char*)malloc(PATH_MAX_LENGTH);
|
||||
if (!config_file_directory)
|
||||
goto end;
|
||||
|
||||
shader_directory = (char*)malloc(PATH_MAX_LENGTH);
|
||||
|
||||
if (!shader_directory)
|
||||
return false;
|
||||
goto end;
|
||||
|
||||
fill_pathname_join(shader_directory,
|
||||
video_shader_directory,
|
||||
"presets", PATH_MAX_LENGTH);
|
||||
content_dir_name[0] = '\0';
|
||||
|
||||
RARCH_LOG("[Shaders]: preset directory: %s\n", shader_directory);
|
||||
if (!string_is_empty(rarch_path_basename))
|
||||
fill_pathname_parent_dir_name(content_dir_name,
|
||||
rarch_path_basename, PATH_MAX_LENGTH);
|
||||
|
||||
if (retroarch_load_shader_preset_internal(shader_directory, core_name,
|
||||
game_name))
|
||||
config_file_directory[0] = '\0';
|
||||
|
||||
if (!path_is_empty(RARCH_PATH_CONFIG))
|
||||
fill_pathname_basedir(config_file_directory,
|
||||
path_get(RARCH_PATH_CONFIG), PATH_MAX_LENGTH);
|
||||
|
||||
dirs[0] = menu_config_directory;
|
||||
dirs[1] = video_shader_directory;
|
||||
dirs[2] = config_file_directory;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(dirs); i++)
|
||||
{
|
||||
RARCH_LOG("[Shaders]: game-specific shader preset found.\n");
|
||||
goto success;
|
||||
}
|
||||
if (string_is_empty(dirs[i]))
|
||||
continue;
|
||||
|
||||
{
|
||||
char content_dir_name[PATH_MAX_LENGTH];
|
||||
content_dir_name[0] = '\0';
|
||||
if (!string_is_empty(rarch_path_basename))
|
||||
fill_pathname_parent_dir_name(content_dir_name,
|
||||
rarch_path_basename, sizeof(content_dir_name));
|
||||
fill_pathname_join(shader_directory,
|
||||
dirs[i], "presets", PATH_MAX_LENGTH);
|
||||
|
||||
if (retroarch_load_shader_preset_internal(shader_directory, core_name,
|
||||
content_dir_name))
|
||||
RARCH_LOG("[Shaders]: preset directory: %s\n", shader_directory);
|
||||
|
||||
ret = retroarch_load_shader_preset_internal(shader_directory, core_name,
|
||||
game_name);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
RARCH_LOG("[Shaders]: game-specific shader preset found.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
ret = retroarch_load_shader_preset_internal(shader_directory, core_name,
|
||||
content_dir_name);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
RARCH_LOG("[Shaders]: folder-specific shader preset found.\n");
|
||||
goto success;
|
||||
break;
|
||||
}
|
||||
|
||||
ret = retroarch_load_shader_preset_internal(shader_directory, core_name,
|
||||
core_name);
|
||||
|
||||
if (ret)
|
||||
{
|
||||
RARCH_LOG("[Shaders]: core-specific shader preset found.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
ret = retroarch_load_shader_preset_internal(shader_directory, NULL,
|
||||
"global");
|
||||
|
||||
if (ret)
|
||||
{
|
||||
RARCH_LOG("[Shaders]: global shader preset found.\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (retroarch_load_shader_preset_internal(shader_directory, core_name,
|
||||
core_name))
|
||||
{
|
||||
RARCH_LOG("[Shaders]: core-specific shader preset found.\n");
|
||||
goto success;
|
||||
}
|
||||
|
||||
if (retroarch_load_shader_preset_internal(shader_directory, NULL,
|
||||
"global"))
|
||||
{
|
||||
RARCH_LOG("[Shaders]: global shader preset found.\n");
|
||||
goto success;
|
||||
}
|
||||
|
||||
end:
|
||||
free(content_dir_name);
|
||||
free(config_file_directory);
|
||||
free(shader_directory);
|
||||
return false;
|
||||
|
||||
success:
|
||||
free(shader_directory);
|
||||
return true;
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user