Merge pull request #3289 from fr500/master

Per-core & Per-game shader presets #2
This commit is contained in:
Twinaphex 2016-07-31 01:42:34 +02:00 committed by GitHub
commit a739b7e60c
14 changed files with 397 additions and 30 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

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

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

View File

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

View File

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