mirror of
https://github.com/libretro/RetroArch
synced 2025-04-10 06:44:27 +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
|
else
|
||||||
{
|
{
|
||||||
const char *dirs[3] = {0};
|
const char *dirs[3] = {0};
|
||||||
char config_directory[PATH_MAX_LENGTH];
|
char config_directory[PATH_MAX_LENGTH];
|
||||||
|
char basedir[PATH_MAX_LENGTH];
|
||||||
|
|
||||||
config_directory[0] = '\0';
|
config_directory[0] = '\0';
|
||||||
|
|
||||||
@ -289,8 +290,8 @@ static bool menu_shader_manager_save_preset_internal(
|
|||||||
path_get(RARCH_PATH_CONFIG),
|
path_get(RARCH_PATH_CONFIG),
|
||||||
sizeof(config_directory));
|
sizeof(config_directory));
|
||||||
|
|
||||||
dirs[0] = dir_video_shader;
|
dirs[0] = dir_menu_config;
|
||||||
dirs[1] = dir_menu_config;
|
dirs[1] = dir_video_shader;
|
||||||
dirs[2] = config_directory;
|
dirs[2] = config_directory;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(dirs); i++)
|
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],
|
fill_pathname_join(buffer, dirs[i],
|
||||||
fullname, sizeof(buffer));
|
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;
|
preset_path = buffer;
|
||||||
|
|
||||||
ret = video_shader_write_preset(preset_path,
|
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 tmp[PATH_MAX_LENGTH];
|
||||||
char directory[PATH_MAX_LENGTH];
|
char directory[PATH_MAX_LENGTH];
|
||||||
char file[PATH_MAX_LENGTH];
|
char file[PATH_MAX_LENGTH];
|
||||||
bool success = false;
|
|
||||||
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;
|
||||||
|
|
||||||
tmp[0] = directory[0] = file[0] = '\0';
|
tmp[0] = directory[0] = file[0] = '\0';
|
||||||
|
|
||||||
if (type == SHADER_PRESET_GLOBAL)
|
if (type != SHADER_PRESET_GLOBAL && string_is_empty(core_name))
|
||||||
fill_pathname_join(
|
|
||||||
directory,
|
|
||||||
dir_video_shader,
|
|
||||||
"presets",
|
|
||||||
sizeof(directory));
|
|
||||||
else if (string_is_empty(core_name))
|
|
||||||
return false;
|
return false;
|
||||||
else
|
|
||||||
{
|
|
||||||
fill_pathname_join(
|
|
||||||
tmp,
|
|
||||||
dir_video_shader,
|
|
||||||
"presets",
|
|
||||||
sizeof(tmp));
|
|
||||||
fill_pathname_join(
|
|
||||||
directory,
|
|
||||||
tmp,
|
|
||||||
core_name,
|
|
||||||
sizeof(directory));
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case SHADER_PRESET_GLOBAL:
|
case SHADER_PRESET_GLOBAL:
|
||||||
fill_pathname_join(file, directory, "global", sizeof(file));
|
fill_pathname_join(file, "presets", "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, directory, 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, directory, tmp, sizeof(file));
|
||||||
@ -384,6 +380,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, directory, game_name, sizeof(file));
|
fill_pathname_join(file, directory, game_name, sizeof(file));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -394,9 +391,6 @@ static bool menu_shader_manager_operate_auto_preset(
|
|||||||
switch (op)
|
switch (op)
|
||||||
{
|
{
|
||||||
case AUTO_SHADER_OP_SAVE:
|
case AUTO_SHADER_OP_SAVE:
|
||||||
if (!path_is_directory(directory))
|
|
||||||
path_mkdir(directory);
|
|
||||||
|
|
||||||
return menu_shader_manager_save_preset_internal(
|
return menu_shader_manager_save_preset_internal(
|
||||||
shader, file,
|
shader, file,
|
||||||
dir_video_shader,
|
dir_video_shader,
|
||||||
@ -405,41 +399,105 @@ static bool menu_shader_manager_operate_auto_preset(
|
|||||||
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 = file + strlen(file);
|
char *end;
|
||||||
size_t i;
|
size_t i, j, n, m;
|
||||||
for (i = 0; i < ARRAY_SIZE(shader_types); i++)
|
|
||||||
{
|
|
||||||
const char *preset_ext;
|
|
||||||
|
|
||||||
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;
|
continue;
|
||||||
|
|
||||||
preset_ext = video_shader_get_preset_extension(shader_types[i]);
|
fill_pathname_join(preset_path, dirs[i], file, sizeof(preset_path));
|
||||||
strlcpy(end, preset_ext, sizeof(file) - (end-file));
|
end = preset_path + strlen(preset_path);
|
||||||
|
|
||||||
if (!filestream_delete(file))
|
for (j = 0; j < ARRAY_SIZE(shader_types); j++)
|
||||||
success = true;
|
{
|
||||||
|
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:
|
case AUTO_SHADER_OP_EXISTS:
|
||||||
{
|
{
|
||||||
/* test if any supported auto-shaders of given type exists */
|
/* test if any supported auto-shaders of given type exists */
|
||||||
char *end = file + strlen(file);
|
char *end;
|
||||||
size_t i;
|
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 (string_is_empty(dirs[i]))
|
||||||
|
|
||||||
if (!video_shader_is_supported(shader_types[i]))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
preset_ext = video_shader_get_preset_extension(shader_types[i]);
|
fill_pathname_join(preset_path, dirs[i], file, sizeof(preset_path));
|
||||||
strlcpy(end, preset_ext, sizeof(file) - (end-file));
|
end = preset_path + strlen(preset_path);
|
||||||
|
|
||||||
if (path_is_valid(file))
|
for (j = 0; j < ARRAY_SIZE(shader_types); j++)
|
||||||
return true;
|
{
|
||||||
|
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;
|
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
|
* folder-specific: $SHADER_DIR/presets/$CORE_NAME/$FOLDER_NAME.$PRESET_EXT
|
||||||
* game-specific: $SHADER_DIR/presets/$CORE_NAME/$GAME_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
|
* Note: Uses video_shader_is_supported() which only works after
|
||||||
* context driver initialization.
|
* context driver initialization.
|
||||||
*
|
*
|
||||||
@ -27327,71 +27334,104 @@ static bool retroarch_load_shader_preset(void)
|
|||||||
{
|
{
|
||||||
settings_t *settings = configuration_settings;
|
settings_t *settings = configuration_settings;
|
||||||
const char *video_shader_directory = settings->paths.directory_video_shader;
|
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 *core_name = runloop_system.info.library_name;
|
||||||
const char *rarch_path_basename = path_get(RARCH_PATH_BASENAME);
|
const char *rarch_path_basename = path_get(RARCH_PATH_BASENAME);
|
||||||
|
|
||||||
const char *game_name = path_basename(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;
|
char *shader_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};
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
if (!auto_shaders_enable)
|
if (!auto_shaders_enable)
|
||||||
return false;
|
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);
|
shader_directory = (char*)malloc(PATH_MAX_LENGTH);
|
||||||
|
|
||||||
if (!shader_directory)
|
if (!shader_directory)
|
||||||
return false;
|
goto end;
|
||||||
|
|
||||||
fill_pathname_join(shader_directory,
|
content_dir_name[0] = '\0';
|
||||||
video_shader_directory,
|
|
||||||
"presets", PATH_MAX_LENGTH);
|
|
||||||
|
|
||||||
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,
|
config_file_directory[0] = '\0';
|
||||||
game_name))
|
|
||||||
|
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");
|
if (string_is_empty(dirs[i]))
|
||||||
goto success;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
{
|
fill_pathname_join(shader_directory,
|
||||||
char content_dir_name[PATH_MAX_LENGTH];
|
dirs[i], "presets", 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));
|
|
||||||
|
|
||||||
if (retroarch_load_shader_preset_internal(shader_directory, core_name,
|
RARCH_LOG("[Shaders]: preset directory: %s\n", shader_directory);
|
||||||
content_dir_name))
|
|
||||||
|
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");
|
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,
|
end:
|
||||||
core_name))
|
free(content_dir_name);
|
||||||
{
|
free(config_file_directory);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(shader_directory);
|
free(shader_directory);
|
||||||
return false;
|
return ret;
|
||||||
|
|
||||||
success:
|
|
||||||
free(shader_directory);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user