mirror of
https://github.com/libretro/RetroArch.git
synced 2025-02-10 11:22:47 +00:00
Merge pull request #3289 from fr500/master
Per-core & Per-game shader presets #2
This commit is contained in:
commit
a739b7e60c
26
command.c
26
command.c
@ -1170,6 +1170,7 @@ static void command_event_deinit_core(bool reinit)
|
||||
}
|
||||
|
||||
command_event(CMD_EVENT_DISABLE_OVERRIDES, NULL);
|
||||
command_event(CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET, NULL);
|
||||
}
|
||||
|
||||
static void command_event_init_cheats(void)
|
||||
@ -1346,6 +1347,11 @@ static bool command_event_init_core(enum rarch_core_type *data)
|
||||
runloop_ctl(RUNLOOP_CTL_UNSET_OVERRIDES_ACTIVE, NULL);
|
||||
}
|
||||
|
||||
/* Auto-remap: apply shader preset files */
|
||||
if(settings->auto_shaders_enable)
|
||||
config_load_shader_preset();
|
||||
|
||||
|
||||
/* reset video format to libretro's default */
|
||||
video_driver_set_pixel_format(RETRO_PIXEL_FORMAT_0RGB1555);
|
||||
|
||||
@ -1381,6 +1387,22 @@ static void command_event_disable_overrides(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void command_event_restore_default_shader_preset(void)
|
||||
{
|
||||
/* auto shader preset: reload the original shader */
|
||||
|
||||
char *preset = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
if (runloop_ctl(RUNLOOP_CTL_GET_DEFAULT_SHADER_PRESET, &preset) &&
|
||||
!string_is_empty(preset))
|
||||
{
|
||||
RARCH_LOG("Shaders: restoring default shader preset to %s\n",
|
||||
preset);
|
||||
strlcpy(settings->path.shader, preset, sizeof(settings->path.shader));
|
||||
}
|
||||
runloop_ctl(RUNLOOP_CTL_CLEAR_DEFAULT_SHADER_PRESET, NULL);
|
||||
}
|
||||
|
||||
static bool command_event_save_auto_state(void)
|
||||
{
|
||||
bool ret;
|
||||
@ -1905,6 +1927,7 @@ bool command_event(enum event_command cmd, void *data)
|
||||
case CMD_EVENT_QUIT:
|
||||
command_event(CMD_EVENT_AUTOSAVE_STATE, NULL);
|
||||
command_event(CMD_EVENT_DISABLE_OVERRIDES, NULL);
|
||||
command_event(CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET, NULL);
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
@ -2569,6 +2592,9 @@ bool command_event(enum event_command cmd, void *data)
|
||||
case CMD_EVENT_DISABLE_OVERRIDES:
|
||||
command_event_disable_overrides();
|
||||
break;
|
||||
case CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET:
|
||||
command_event_restore_default_shader_preset();
|
||||
break;
|
||||
case CMD_EVENT_NONE:
|
||||
default:
|
||||
return false;
|
||||
|
@ -212,7 +212,8 @@ enum event_command
|
||||
CMD_EVENT_PERFCNT_REPORT_FRONTEND_LOG,
|
||||
CMD_EVENT_VOLUME_UP,
|
||||
CMD_EVENT_VOLUME_DOWN,
|
||||
CMD_EVENT_DISABLE_OVERRIDES
|
||||
CMD_EVENT_DISABLE_OVERRIDES,
|
||||
CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET
|
||||
};
|
||||
|
||||
#ifdef HAVE_COMMAND
|
||||
|
@ -561,6 +561,7 @@ static bool default_block_config_read = false;
|
||||
static bool default_game_specific_options = false;
|
||||
static bool default_auto_overrides_enable = true;
|
||||
static bool default_auto_remaps_enable = true;
|
||||
static bool default_auto_shaders_enable = true;
|
||||
|
||||
static bool default_sort_savefiles_enable = false;
|
||||
static bool default_sort_savestates_enable = false;
|
||||
|
136
configuration.c
136
configuration.c
@ -785,6 +785,7 @@ static void config_set_defaults(void)
|
||||
settings->game_specific_options = default_game_specific_options;
|
||||
settings->auto_overrides_enable = default_auto_overrides_enable;
|
||||
settings->auto_remaps_enable = default_auto_remaps_enable;
|
||||
settings->auto_shaders_enable = default_auto_shaders_enable;
|
||||
|
||||
settings->sort_savefiles_enable = default_sort_savefiles_enable;
|
||||
settings->sort_savestates_enable = default_sort_savestates_enable;
|
||||
@ -1267,6 +1268,7 @@ static bool config_load_file(const char *path, bool set_defaults)
|
||||
{ "game_specific_options", &settings->game_specific_options},
|
||||
{ "auto_overrides_enable", &settings->auto_overrides_enable},
|
||||
{ "auto_remaps_enable", &settings->auto_remaps_enable},
|
||||
{ "auto_shaders_enable", &settings->auto_shaders_enable},
|
||||
{ "sort_savefiles_enable", &settings->sort_savefiles_enable},
|
||||
{ "sort_savestates_enable", &settings->sort_savestates_enable},
|
||||
{ "config_save_on_exit", &settings->config_save_on_exit},
|
||||
@ -2294,6 +2296,139 @@ bool config_load_remap(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool check_shader_compatibility(enum file_path_enum enum_idx)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
if (!strcmp("vulkan", settings->video.driver))
|
||||
{
|
||||
if (enum_idx != FILE_PATH_SLANGP_EXTENSION)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
if (!strcmp("gl", settings->video.driver) ||
|
||||
!strcmp("d3d9", settings->video.driver))
|
||||
{
|
||||
if (enum_idx == FILE_PATH_SLANGP_EXTENSION)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* config_load_shader_preset:
|
||||
*
|
||||
* Tries to append game-specific and core-specific shader presets.
|
||||
*
|
||||
* This function only has an effect if a game-specific or core-specific
|
||||
* configuration file exists at respective locations.
|
||||
*
|
||||
* core-specific: $SHADER_DIR/presets/$CORE_NAME/$CORE_NAME.cfg
|
||||
* game-specific: $SHADER_DIR/presets/$CORE_NAME/$GAME_NAME.cfg
|
||||
*
|
||||
* Returns: false if there was an error or no action was performed.
|
||||
*/
|
||||
bool config_load_shader_preset(void)
|
||||
{
|
||||
char shader_directory[PATH_MAX_LENGTH] = {0}; /* path to the directory containing retroarch.cfg (prefix) */
|
||||
char core_path[PATH_MAX_LENGTH] = {0}; /* final path for core-specific configuration (prefix+suffix) */
|
||||
char game_path[PATH_MAX_LENGTH] = {0}; /* final path for game-specific configuration (prefix+suffix) */
|
||||
config_file_t *new_conf = NULL;
|
||||
const char *core_name = NULL;
|
||||
const char *game_name = NULL;
|
||||
global_t *global = global_get_ptr();
|
||||
settings_t *settings = config_get_ptr();
|
||||
rarch_system_info_t *system = NULL;
|
||||
int idx;
|
||||
|
||||
runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system);
|
||||
|
||||
if (system)
|
||||
core_name = system->info.library_name;
|
||||
if (global)
|
||||
game_name = path_basename(global->name.base);
|
||||
|
||||
if (string_is_empty(core_name) || string_is_empty(game_name))
|
||||
return false;
|
||||
|
||||
/* Shader directory: shader_directory.
|
||||
* Try shader directory setting, no fallbacks defined */
|
||||
if (string_is_empty(settings->directory.video_shader))
|
||||
return false;
|
||||
|
||||
fill_pathname_join (shader_directory, settings->directory.video_shader,
|
||||
"presets", sizeof(shader_directory));
|
||||
|
||||
RARCH_LOG("Shaders: preset directory: %s\n", shader_directory);
|
||||
|
||||
for(idx = FILE_PATH_CGP_EXTENSION; idx < FILE_PATH_SLANGP_EXTENSION; idx++)
|
||||
{
|
||||
if (!check_shader_compatibility(idx))
|
||||
continue;
|
||||
/* Concatenate strings into full paths for core_path, game_path */
|
||||
fill_pathname_join_special_ext(core_path,
|
||||
shader_directory, core_name,
|
||||
core_name,
|
||||
file_path_str(idx),
|
||||
sizeof(core_path));
|
||||
|
||||
fill_pathname_join_special_ext(game_path,
|
||||
shader_directory, core_name,
|
||||
game_name,
|
||||
file_path_str(idx),
|
||||
sizeof(game_path));
|
||||
|
||||
/* Create a new config file from game_path */
|
||||
new_conf = config_file_new(game_path);
|
||||
|
||||
/* If a game shader preset exists, load it. */
|
||||
if (new_conf)
|
||||
{
|
||||
RARCH_LOG("Shaders: game-specific shader preset found at %s.\n", game_path);
|
||||
runloop_ctl(RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, settings->path.shader);
|
||||
strlcpy(settings->path.shader, game_path, sizeof(settings->path.shader));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
RARCH_LOG("Shaders: no game-specific preset found at %s.\n", game_path);
|
||||
}
|
||||
}
|
||||
|
||||
for(idx = FILE_PATH_CGP_EXTENSION; idx < FILE_PATH_SLANGP_EXTENSION; idx++)
|
||||
{
|
||||
if (!check_shader_compatibility(idx))
|
||||
continue;
|
||||
/* Concatenate strings into full paths for core_path, game_path */
|
||||
fill_pathname_join_special_ext(core_path,
|
||||
shader_directory, core_name,
|
||||
core_name,
|
||||
file_path_str(idx),
|
||||
sizeof(core_path));
|
||||
|
||||
/* Create a new config file from core_path */
|
||||
new_conf = config_file_new(core_path);
|
||||
|
||||
/* If a core shader preset exists, load it. */
|
||||
if (new_conf)
|
||||
{
|
||||
RARCH_LOG("Shaders: core-specific shader preset found at %s.\n", core_path);
|
||||
runloop_ctl(RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET, settings->path.shader);
|
||||
strlcpy(settings->path.shader, core_path, sizeof(settings->path.shader));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
RARCH_LOG("Shaders: no core-specific preset found at %s.\n", core_path);
|
||||
}
|
||||
new_conf = NULL;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void parse_config_file(void)
|
||||
{
|
||||
global_t *global = global_get_ptr();
|
||||
@ -2719,6 +2854,7 @@ bool config_save_file(const char *path)
|
||||
{ "game_specific_options", settings->game_specific_options},
|
||||
{ "auto_overrides_enable", settings->auto_overrides_enable},
|
||||
{ "auto_remaps_enable", settings->auto_remaps_enable},
|
||||
{ "auto_shaders_enable", settings->auto_shaders_enable},
|
||||
{ "sort_savefiles_enable", settings->sort_savefiles_enable},
|
||||
{ "sort_savestates_enable", settings->sort_savestates_enable},
|
||||
{ "config_save_on_exit", settings->config_save_on_exit},
|
||||
|
@ -468,6 +468,7 @@ typedef struct settings
|
||||
bool game_specific_options;
|
||||
bool auto_overrides_enable;
|
||||
bool auto_remaps_enable;
|
||||
bool auto_shaders_enable;
|
||||
|
||||
bool sort_savefiles_enable;
|
||||
bool sort_savestates_enable;
|
||||
@ -620,6 +621,16 @@ bool config_unload_override(void);
|
||||
*/
|
||||
bool config_load_remap(void);
|
||||
|
||||
/**
|
||||
* config_load_shader_preset:
|
||||
*
|
||||
* Tries to append game-specific and core-specific shader presets.
|
||||
*
|
||||
* Returns: false if there was an error or no action was performed.
|
||||
*
|
||||
*/
|
||||
bool config_load_shader_preset(void);
|
||||
|
||||
/**
|
||||
* config_save_autoconf_profile:
|
||||
* @path : Path that shall be written to.
|
||||
|
@ -2410,6 +2410,8 @@ static const char *menu_hash_to_str_us_label_enum(enum msg_hash_enums msg)
|
||||
return "fastforward_ratio";
|
||||
case MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE:
|
||||
return "auto_remaps_enable";
|
||||
case MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE:
|
||||
return "auto_shaders_enable";
|
||||
case MENU_ENUM_LABEL_SLOWMOTION_RATIO:
|
||||
return "slowmotion_ratio";
|
||||
case MENU_ENUM_LABEL_CORE_SPECIFIC_CONFIG:
|
||||
@ -2944,8 +2946,12 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg)
|
||||
return "Several patches are explicitly defined, ignoring all...";
|
||||
case MSG_REMAP_FILE_SAVED_SUCCESSFULLY:
|
||||
return "Remap file saved successfully.";
|
||||
case MSG_SHADER_PRESET_SAVED_SUCCESSFULLY:
|
||||
return "Shader preset saved successfully.";
|
||||
case MSG_ERROR_SAVING_REMAP_FILE:
|
||||
return "Error saving remap file.";
|
||||
case MSG_ERROR_SAVING_SHADER_PRESET:
|
||||
return "Error saving shader preset.";
|
||||
case MSG_INPUT_CHEAT_FILENAME:
|
||||
return "Cheat Filename";
|
||||
case MSG_INPUT_PRESET_FILENAME:
|
||||
@ -3696,6 +3702,8 @@ const char *msg_hash_to_str_us(enum msg_hash_enums msg)
|
||||
return "Maximum Run Speed";
|
||||
case MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE:
|
||||
return "Load Remap Files Automatically";
|
||||
case MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE:
|
||||
return "Load Shader Presets Automatically";
|
||||
case MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO:
|
||||
return "Slow-Motion Ratio";
|
||||
case MENU_ENUM_LABEL_VALUE_CORE_SPECIFIC_CONFIG:
|
||||
@ -4025,7 +4033,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:
|
||||
|
@ -1479,6 +1479,7 @@ static void menu_input_st_string_cb_save_preset(void *userdata,
|
||||
{
|
||||
rarch_setting_t *setting = NULL;
|
||||
const char *label = NULL;
|
||||
bool ret = false;
|
||||
|
||||
menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL_SETTING, &label);
|
||||
|
||||
@ -1491,7 +1492,16 @@ 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);
|
||||
ret = menu_shader_manager_save_preset(str, false, false);
|
||||
|
||||
if(ret)
|
||||
runloop_msg_queue_push(
|
||||
msg_hash_to_str(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY),
|
||||
1, 100, true);
|
||||
else
|
||||
runloop_msg_queue_push(
|
||||
msg_hash_to_str(MSG_ERROR_SAVING_SHADER_PRESET),
|
||||
1, 100, true);
|
||||
}
|
||||
|
||||
menu_input_key_end_line();
|
||||
@ -1513,6 +1523,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_SHADER_PRESET_SAVED_SUCCESSFULLY),
|
||||
1, 100, true);
|
||||
else
|
||||
runloop_msg_queue_push(
|
||||
msg_hash_to_str(MSG_ERROR_SAVING_SHADER_PRESET),
|
||||
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)
|
||||
{
|
||||
@ -3356,6 +3446,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),
|
||||
|
@ -4710,6 +4710,22 @@ static bool setting_append_list(
|
||||
SD_FLAG_NONE);
|
||||
menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE);
|
||||
|
||||
CONFIG_BOOL(
|
||||
list, list_info,
|
||||
&settings->auto_shaders_enable,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE),
|
||||
default_auto_shaders_enable,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ON),
|
||||
&group_info,
|
||||
&subgroup_info,
|
||||
parent_group,
|
||||
general_write_handler,
|
||||
general_read_handler,
|
||||
SD_FLAG_NONE);
|
||||
menu_settings_list_current_add_enum_idx(list, list_info, MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE);
|
||||
|
||||
END_SUB_GROUP(list, list_info, parent_group);
|
||||
END_GROUP(list, list_info, parent_group);
|
||||
break;
|
||||
|
@ -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:
|
||||
|
@ -196,7 +196,9 @@ enum msg_hash_enums
|
||||
MSG_INPUT_PRESET_FILENAME,
|
||||
MSG_INPUT_CHEAT_FILENAME,
|
||||
MSG_REMAP_FILE_SAVED_SUCCESSFULLY,
|
||||
MSG_SHADER_PRESET_SAVED_SUCCESSFULLY,
|
||||
MSG_ERROR_SAVING_REMAP_FILE,
|
||||
MSG_ERROR_SAVING_SHADER_PRESET,
|
||||
MSG_FAILED_TO_CREATE_THE_DIRECTORY,
|
||||
MSG_ERROR_SAVING_CORE_OPTIONS_FILE,
|
||||
MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY,
|
||||
@ -1025,6 +1027,8 @@ enum msg_hash_enums
|
||||
MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE,
|
||||
MENU_ENUM_LABEL_AUTO_REMAPS_ENABLE,
|
||||
MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE,
|
||||
MENU_ENUM_LABEL_AUTO_SHADERS_ENABLE,
|
||||
MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE,
|
||||
MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN,
|
||||
MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN,
|
||||
MENU_ENUM_LABEL_SCREENSHOT,
|
||||
@ -1549,7 +1553,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,
|
||||
|
21
runloop.c
21
runloop.c
@ -100,6 +100,7 @@ typedef struct event_cmd_state
|
||||
|
||||
static rarch_dir_list_t runloop_shader_dir;
|
||||
static char runloop_fullpath[PATH_MAX_LENGTH];
|
||||
static char runloop_default_shader_preset[PATH_MAX_LENGTH];
|
||||
static rarch_system_info_t runloop_system;
|
||||
static unsigned runloop_pending_windowed_scale;
|
||||
static struct retro_frame_time_callback runloop_frame_time;
|
||||
@ -931,6 +932,26 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
|
||||
strlcpy(runloop_fullpath, fullpath, sizeof(runloop_fullpath));
|
||||
}
|
||||
break;
|
||||
case RUNLOOP_CTL_CLEAR_DEFAULT_SHADER_PRESET:
|
||||
*runloop_default_shader_preset = '\0';
|
||||
break;
|
||||
case RUNLOOP_CTL_GET_DEFAULT_SHADER_PRESET:
|
||||
{
|
||||
char **preset = (char**)data;
|
||||
if (!preset)
|
||||
return false;
|
||||
*preset = (char*)runloop_default_shader_preset;
|
||||
}
|
||||
break;
|
||||
case RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET:
|
||||
{
|
||||
const char *preset = (const char*)data;
|
||||
if (!preset)
|
||||
return false;
|
||||
strlcpy(runloop_default_shader_preset, preset,
|
||||
sizeof(runloop_default_shader_preset));
|
||||
}
|
||||
break;
|
||||
case RUNLOOP_CTL_FRAME_TIME_FREE:
|
||||
memset(&runloop_frame_time, 0, sizeof(struct retro_frame_time_callback));
|
||||
runloop_frame_time_last = 0;
|
||||
|
@ -61,6 +61,10 @@ enum runloop_ctl_state
|
||||
RUNLOOP_CTL_SET_CONTENT_PATH,
|
||||
RUNLOOP_CTL_CLEAR_CONTENT_PATH,
|
||||
|
||||
RUNLOOP_CTL_GET_DEFAULT_SHADER_PRESET,
|
||||
RUNLOOP_CTL_SET_DEFAULT_SHADER_PRESET,
|
||||
RUNLOOP_CTL_CLEAR_DEFAULT_SHADER_PRESET,
|
||||
|
||||
RUNLOOP_CTL_SET_LIBRETRO_PATH,
|
||||
|
||||
RUNLOOP_CTL_IS_SLOWMOTION,
|
||||
|
Loading…
x
Reference in New Issue
Block a user