mirror of
https://github.com/CTCaer/RetroArch.git
synced 2025-02-11 06:25:26 +00:00
Add options to save per-core/game shaders
This commit is contained in:
parent
fa0932e20e
commit
3f0223e311
@ -4007,7 +4007,11 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg)
|
||||
case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO:
|
||||
return "Shader Preset";
|
||||
case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS:
|
||||
return "Shader Preset Save As";
|
||||
return "Save Shader Preset As";
|
||||
case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE:
|
||||
return "Save Core Preset";
|
||||
case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME:
|
||||
return "Save Game Preset";
|
||||
case MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS:
|
||||
return "No shader parameters.";
|
||||
case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET:
|
||||
|
@ -1487,7 +1487,7 @@ static void menu_input_st_string_cb_save_preset(void *userdata,
|
||||
menu_setting_generic(setting, false);
|
||||
}
|
||||
else if (!string_is_empty(label))
|
||||
menu_shader_manager_save_preset(str, false);
|
||||
menu_shader_manager_save_preset(str, false, false);
|
||||
}
|
||||
|
||||
menu_input_key_end_line();
|
||||
@ -1509,6 +1509,86 @@ static int action_ok_shader_preset_save_as(const char *path,
|
||||
return 0;
|
||||
}
|
||||
|
||||
enum
|
||||
{
|
||||
ACTION_OK_SHADER_PRESET_SAVE_CORE = 0,
|
||||
ACTION_OK_SHADER_PRESET_SAVE_GAME
|
||||
};
|
||||
|
||||
static int generic_action_ok_shader_preset_save(const char *path,
|
||||
const char *label, unsigned type, size_t idx, size_t entry_idx,
|
||||
unsigned action_type)
|
||||
{
|
||||
char directory[PATH_MAX_LENGTH] = {0};
|
||||
char file[PATH_MAX_LENGTH] = {0};
|
||||
char tmp[PATH_MAX_LENGTH] = {0};
|
||||
settings_t *settings = config_get_ptr();
|
||||
rarch_system_info_t *info = NULL;
|
||||
const char *core_name = NULL;
|
||||
|
||||
runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &info);
|
||||
|
||||
if (info)
|
||||
core_name = info->info.library_name;
|
||||
|
||||
if (!string_is_empty(core_name))
|
||||
{
|
||||
fill_pathname_join(
|
||||
tmp,
|
||||
settings->directory.video_shader,
|
||||
"presets",
|
||||
sizeof(tmp));
|
||||
fill_pathname_join(
|
||||
directory,
|
||||
tmp,
|
||||
core_name,
|
||||
sizeof(directory));
|
||||
}
|
||||
if(!path_file_exists(directory))
|
||||
path_mkdir(directory);
|
||||
|
||||
switch (action_type)
|
||||
{
|
||||
case ACTION_OK_SHADER_PRESET_SAVE_CORE:
|
||||
fill_pathname_join(file, directory, core_name, sizeof(file));
|
||||
break;
|
||||
case ACTION_OK_SHADER_PRESET_SAVE_GAME:
|
||||
{
|
||||
global_t *global = global_get_ptr();
|
||||
const char *game_name = path_basename(global->name.base);
|
||||
fill_pathname_join(file, directory, game_name, sizeof(file));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(menu_shader_manager_save_preset(file, false, true))
|
||||
runloop_msg_queue_push(
|
||||
msg_hash_to_str(MSG_REMAP_FILE_SAVED_SUCCESSFULLY),
|
||||
1, 100, true);
|
||||
else
|
||||
runloop_msg_queue_push(
|
||||
msg_hash_to_str(MSG_ERROR_SAVING_REMAP_FILE),
|
||||
1, 100, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int action_ok_shader_preset_save_core(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_CORE);
|
||||
}
|
||||
|
||||
static int action_ok_shader_preset_save_game(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_GAME);
|
||||
}
|
||||
|
||||
static void menu_input_st_string_cb_cheat_file_save_as(
|
||||
void *userdata, const char *str)
|
||||
{
|
||||
@ -3341,6 +3421,12 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs,
|
||||
case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS:
|
||||
BIND_ACTION_OK(cbs, action_ok_shader_preset_save_as);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME:
|
||||
BIND_ACTION_OK(cbs, action_ok_shader_preset_save_game);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE:
|
||||
BIND_ACTION_OK(cbs, action_ok_shader_preset_save_core);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS:
|
||||
BIND_ACTION_OK(cbs, action_ok_cheat_file_save_as);
|
||||
break;
|
||||
|
@ -1550,6 +1550,16 @@ static int menu_displaylist_parse_shader_options(menu_displaylist_info_t *info)
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS),
|
||||
MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS,
|
||||
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),
|
||||
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_GAME),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS),
|
||||
MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME,
|
||||
MENU_SETTING_ACTION, 0, 0);
|
||||
menu_entries_append_enum(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VIDEO_SHADER_PARAMETERS),
|
||||
|
@ -198,8 +198,8 @@ void menu_shader_manager_set_preset(struct video_shader *shader,
|
||||
*
|
||||
* Save a shader preset to disk.
|
||||
**/
|
||||
void menu_shader_manager_save_preset(
|
||||
const char *basename, bool apply)
|
||||
bool menu_shader_manager_save_preset(
|
||||
const char *basename, bool apply, bool fullpath)
|
||||
{
|
||||
#ifdef HAVE_SHADER_MANAGER
|
||||
char buffer[PATH_MAX_LENGTH] = {0};
|
||||
@ -218,19 +218,19 @@ void menu_shader_manager_save_preset(
|
||||
{
|
||||
RARCH_ERR("Cannot save shader preset, menu handle"
|
||||
" is not initialized.\n");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
menu_driver_ctl(RARCH_MENU_CTL_SHADER_GET,
|
||||
&shader);
|
||||
|
||||
if (!shader)
|
||||
return;
|
||||
return false;
|
||||
|
||||
type = menu_shader_manager_get_type(shader);
|
||||
|
||||
if (type == RARCH_SHADER_NONE)
|
||||
return;
|
||||
return false;
|
||||
|
||||
*config_directory = '\0';
|
||||
|
||||
@ -290,38 +290,63 @@ void menu_shader_manager_save_preset(
|
||||
global->path.config,
|
||||
sizeof(config_directory));
|
||||
|
||||
dirs[0] = settings->directory.video_shader;
|
||||
dirs[1] = settings->directory.menu_config;
|
||||
dirs[2] = config_directory;
|
||||
if (!fullpath)
|
||||
{
|
||||
dirs[0] = settings->directory.video_shader;
|
||||
dirs[1] = settings->directory.menu_config;
|
||||
dirs[2] = config_directory;
|
||||
}
|
||||
|
||||
if (!(conf = (config_file_t*)config_file_new(NULL)))
|
||||
return;
|
||||
return false;
|
||||
video_shader_write_conf_cgp(conf, shader);
|
||||
|
||||
for (d = 0; d < ARRAY_SIZE(dirs); d++)
|
||||
if (!fullpath)
|
||||
{
|
||||
if (!*dirs[d])
|
||||
continue;
|
||||
|
||||
fill_pathname_join(preset_path, dirs[d],
|
||||
buffer, sizeof(preset_path));
|
||||
|
||||
if (config_file_write(conf, preset_path))
|
||||
for (d = 0; d < ARRAY_SIZE(dirs); d++)
|
||||
{
|
||||
RARCH_LOG("Saved shader preset to %s.\n", preset_path);
|
||||
if (apply)
|
||||
menu_shader_manager_set_preset(NULL, type, preset_path);
|
||||
ret = true;
|
||||
break;
|
||||
if (!*dirs[d])
|
||||
continue;
|
||||
|
||||
fill_pathname_join(preset_path, dirs[d],
|
||||
buffer, sizeof(preset_path));
|
||||
|
||||
if (config_file_write(conf, preset_path))
|
||||
{
|
||||
RARCH_LOG("Saved shader preset to %s.\n", preset_path);
|
||||
if (apply)
|
||||
menu_shader_manager_set_preset(NULL, type, preset_path);
|
||||
ret = true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
RARCH_LOG("Failed writing shader preset to %s.\n", preset_path);
|
||||
}
|
||||
else
|
||||
RARCH_LOG("Failed writing shader preset to %s.\n", preset_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!string_is_empty(basename))
|
||||
strlcpy(preset_path, buffer, sizeof(preset_path));
|
||||
if (config_file_write(conf, preset_path))
|
||||
{
|
||||
RARCH_LOG("Saved shader preset to %s.\n", preset_path);
|
||||
if (apply)
|
||||
menu_shader_manager_set_preset(NULL, type, preset_path);
|
||||
ret = true;
|
||||
}
|
||||
else
|
||||
RARCH_LOG("Failed writing shader preset to %s.\n", preset_path);
|
||||
}
|
||||
|
||||
config_file_free(conf);
|
||||
if (!ret)
|
||||
{
|
||||
RARCH_ERR("Failed to save shader preset. Make sure config directory"
|
||||
" and/or shader dir are writable.\n");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -390,7 +415,7 @@ void menu_shader_manager_apply_changes(void)
|
||||
|
||||
if (shader->passes && shader_type != RARCH_SHADER_NONE)
|
||||
{
|
||||
menu_shader_manager_save_preset(NULL, true);
|
||||
menu_shader_manager_save_preset(NULL, true, false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -49,8 +49,8 @@ void menu_shader_manager_set_preset(
|
||||
*
|
||||
* Save a shader preset to disk.
|
||||
**/
|
||||
void menu_shader_manager_save_preset(
|
||||
const char *basename, bool apply);
|
||||
bool menu_shader_manager_save_preset(
|
||||
const char *basename, bool apply, bool fullpath);
|
||||
|
||||
/**
|
||||
* menu_shader_manager_get_type:
|
||||
|
@ -1538,7 +1538,11 @@ enum msg_hash_enums
|
||||
MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS,
|
||||
MENU_ENUM_LABEL_CHEAT_FILE_SAVE_AS,
|
||||
MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_AS,
|
||||
MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_CORE,
|
||||
MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_SAVE_GAME,
|
||||
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS,
|
||||
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE,
|
||||
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME,
|
||||
MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE,
|
||||
MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME,
|
||||
MENU_ENUM_LABEL_REMAP_FILE_SAVE_CORE,
|
||||
|
Loading…
x
Reference in New Issue
Block a user