Add options to save per-core/game shaders

This commit is contained in:
radius 2016-07-27 18:07:19 -05:00
parent fa0932e20e
commit 3f0223e311
6 changed files with 158 additions and 29 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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),

View File

@ -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;
}

View File

@ -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:

View File

@ -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,