Runahead error messages

* Add error messages for: Core not having savestates, load/save state failure, secondary core create failure
* Added messages for us locale, can be localized elsewhere
* Add a configuration setting to hide the initial warning message for core not having savestates
* Small code changes and cleanup for secondary core
* Fixed typo "destory" in dirty input code
This commit is contained in:
Dwedit 2018-05-09 19:08:16 -05:00
parent 46f7742afc
commit 6154a843e0
13 changed files with 111 additions and 42 deletions

View File

@ -601,6 +601,9 @@ static const unsigned run_ahead_frames = 1;
/* When using the Run Ahead feature, use a secondary instance of the core. */
static const bool run_ahead_secondary_instance = true;
/* Hide warning messages when using the Run Ahead feature. */
static const bool run_ahead_hide_warnings = false;
/* Enable stdin/network command interface. */
static const bool network_cmd_enable = false;
static const uint16_t network_cmd_port = 55355;

View File

@ -1225,6 +1225,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("rewind_enable", &settings->bools.rewind_enable, true, rewind_enable, false);
SETTING_BOOL("run_ahead_enabled", &settings->bools.run_ahead_enabled, true, false, false);
SETTING_BOOL("run_ahead_secondary_instance", &settings->bools.run_ahead_secondary_instance, true, false, false);
SETTING_BOOL("run_ahead_hide_warnings", &settings->bools.run_ahead_hide_warnings, true, false, false);
SETTING_BOOL("audio_sync", &settings->bools.audio_sync, true, audio_sync, false);
SETTING_BOOL("video_shader_enable", &settings->bools.video_shader_enable, true, shader_enable, false);
SETTING_BOOL("video_shader_watch_files", &settings->bools.video_shader_watch_files, true, video_shader_watch_files, false);

View File

@ -237,6 +237,7 @@ typedef struct settings
bool rewind_enable;
bool run_ahead_enabled;
bool run_ahead_secondary_instance;
bool run_ahead_hide_warnings;
bool pause_nonactive;
bool block_sram_overwrite;
bool savestate_auto_index;

View File

@ -999,6 +999,8 @@ MSG_HASH(MENU_ENUM_LABEL_RUN_AHEAD_ENABLED,
"run_ahead_enabled")
MSG_HASH(MENU_ENUM_LABEL_RUN_AHEAD_SECONDARY_INSTANCE,
"run_ahead_secondary_instance")
MSG_HASH(MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS,
"run_ahead_hide_warnings")
MSG_HASH(MENU_ENUM_LABEL_RUN_AHEAD_FRAMES,
"run_ahead_frames")
MSG_HASH(MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE,

View File

@ -1454,7 +1454,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_ENABLED,
MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_FRAMES,
"Number of Frames to Run Ahead")
MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_SECONDARY_INSTANCE,
"Runahead Use Second Instance")
"RunAhead Use Second Instance")
MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_AHEAD_HIDE_WARNINGS,
"RunAhead Hide Warnings")
MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE,
"Sort Saves In Folders")
MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE,
@ -2760,6 +2762,10 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_RUN_AHEAD_SECONDARY_INSTANCE,
"Use a second instance of the RetroArch core to run ahead. Prevents audio problems due to loading state."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_RUN_AHEAD_HIDE_WARNINGS,
"Hides the warning message that appears when using RunAhead and the core does not support savestates."
)
MSG_HASH(
MENU_ENUM_SUBLABEL_REWIND_ENABLE,
"Enable rewinding. This will take a performance hit when playing."
@ -3472,6 +3478,14 @@ MSG_HASH(MSG_GAME_REMAP_FILE_LOADED,
"Game remap file loaded.")
MSG_HASH(MSG_CORE_REMAP_FILE_LOADED,
"Core remap file loaded.")
MSG_HASH(MSG_RUNAHEAD_CORE_DOES_NOT_SUPPORT_SAVESTATES,
"RunAhead has been disabled because this core does not support save states.")
MSG_HASH(MSG_RUNAHEAD_FAILED_TO_SAVE_STATE,
"Failed to save state. RunAhead has been disabled.")
MSG_HASH(MSG_RUNAHEAD_FAILED_TO_LOAD_STATE,
"Failed to load state. RunAhead has been disabled.")
MSG_HASH(MSG_RUNAHEAD_FAILED_TO_CREATE_SECONDARY_INSTANCE,
"Failed to create second instance. RunAhead will now use only one instance.")
MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST,
"Automatically add content to playlist")
MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST,

View File

@ -199,6 +199,7 @@ default_sublabel_macro(action_bind_sublabel_fastforward_ratio, MENU_
default_sublabel_macro(action_bind_sublabel_slowmotion_ratio, MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO)
default_sublabel_macro(action_bind_sublabel_run_ahead_enabled, MENU_ENUM_SUBLABEL_RUN_AHEAD_ENABLED)
default_sublabel_macro(action_bind_sublabel_run_ahead_secondary_instance, MENU_ENUM_SUBLABEL_RUN_AHEAD_SECONDARY_INSTANCE)
default_sublabel_macro(action_bind_sublabel_run_ahead_hide_warnings, MENU_ENUM_SUBLABEL_RUN_AHEAD_HIDE_WARNINGS)
default_sublabel_macro(action_bind_sublabel_run_ahead_frames, MENU_ENUM_SUBLABEL_RUN_AHEAD_FRAMES)
default_sublabel_macro(action_bind_sublabel_rewind, MENU_ENUM_SUBLABEL_REWIND_ENABLE)
default_sublabel_macro(action_bind_sublabel_rewind_granularity, MENU_ENUM_SUBLABEL_REWIND_GRANULARITY)
@ -1319,6 +1320,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_RUN_AHEAD_SECONDARY_INSTANCE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_run_ahead_secondary_instance);
break;
case MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_run_ahead_hide_warnings);
break;
case MENU_ENUM_LABEL_RUN_AHEAD_FRAMES:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_run_ahead_frames);
break;

View File

@ -6275,6 +6275,10 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
MENU_ENUM_LABEL_RUN_AHEAD_SECONDARY_INSTANCE,
PARSE_ONLY_BOOL, false) == 0)
count++;
if (menu_displaylist_parse_settings_enum(menu, info,
MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS,
PARSE_ONLY_BOOL, false) == 0)
count++;
if (count == 0)
menu_entries_append_enum(info->list,

View File

@ -4689,7 +4689,7 @@ static bool setting_append_list(
general_read_handler);
menu_settings_list_current_add_range(list, list_info, 1, 6, 1, true, true);
#ifdef HAVE_DYNAMIC
#if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
CONFIG_BOOL(
list, list_info,
&settings->bools.run_ahead_secondary_instance,
@ -4707,6 +4707,22 @@ static bool setting_append_list(
);
#endif
CONFIG_BOOL(
list, list_info,
&settings->bools.run_ahead_hide_warnings,
MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS,
MENU_ENUM_LABEL_VALUE_RUN_AHEAD_HIDE_WARNINGS,
false,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_ADVANCED
);
CONFIG_BOOL(
list, list_info,
&settings->bools.menu_throttle_framerate,

View File

@ -410,7 +410,10 @@ enum msg_hash_enums
MSG_CONFIG_OVERRIDE_LOADED,
MSG_GAME_REMAP_FILE_LOADED,
MSG_CORE_REMAP_FILE_LOADED,
MSG_RUNAHEAD_CORE_DOES_NOT_SUPPORT_SAVESTATES,
MSG_RUNAHEAD_FAILED_TO_SAVE_STATE,
MSG_RUNAHEAD_FAILED_TO_LOAD_STATE,
MSG_RUNAHEAD_FAILED_TO_CREATE_SECONDARY_INSTANCE,
MENU_LABEL(ADD_TO_MIXER),
MENU_LABEL(ADD_TO_MIXER_AND_PLAY),
MENU_LABEL(ADD_TO_MIXER_AND_COLLECTION),
@ -1296,6 +1299,7 @@ enum msg_hash_enums
MENU_LABEL(SLOWMOTION_RATIO),
MENU_LABEL(RUN_AHEAD_ENABLED),
MENU_LABEL(RUN_AHEAD_SECONDARY_INSTANCE),
MENU_LABEL(RUN_AHEAD_HIDE_WARNINGS),
MENU_LABEL(RUN_AHEAD_FRAMES),
MENU_LABEL(TURBO),

View File

@ -40,7 +40,7 @@ static void* InputListElementConstructor(void)
return ptr;
}
static void input_state_destory(void)
static void input_state_destroy(void)
{
mylist_destroy(&input_state_list);
}
@ -158,7 +158,7 @@ void remove_input_state_hook(void)
retro_ctx.state_cb = input_state_callback_original;
current_core.retro_set_input_state(retro_ctx.state_cb);
input_state_callback_original = NULL;
input_state_destory();
input_state_destroy();
}
if (retro_reset_callback_original)

View File

@ -13,6 +13,8 @@
#include "../dynamic.h"
#include "../audio/audio_driver.h"
#include "../gfx/video_driver.h"
#include "../configuration.h"
#include "../retroarch.h"
static bool runahead_create(void);
static bool runahead_save_state(void);
@ -28,8 +30,8 @@ static void unset_fast_savestate(void);
static void set_hard_disable_audio(void);
static void unset_hard_disable_audio(void);
/* TODO/FIXME - shouldn't this be signed size_t? */
static size_t runahead_save_state_size = -1;
static size_t runahead_save_state_size = 0;
static bool runahead_save_state_size_known = false;
/* Save State List for Run Ahead */
static MyList *runahead_save_state_list;
@ -46,7 +48,7 @@ static void *runahead_save_state_alloc(void)
savestate->data_const = NULL;
savestate->size = 0;
if (runahead_save_state_size > 0 && runahead_save_state_size != -1)
if (runahead_save_state_size > 0 && runahead_save_state_size_known)
{
savestate->data = malloc(runahead_save_state_size);
savestate->data_const = savestate->data;
@ -68,6 +70,7 @@ static void runahead_save_state_free(void *state)
static void runahead_save_state_list_init(size_t saveStateSize)
{
runahead_save_state_size = saveStateSize;
runahead_save_state_size_known = true;
mylist_create(&runahead_save_state_list, 16,
runahead_save_state_alloc, runahead_save_state_free);
}
@ -176,7 +179,8 @@ static uint64_t runahead_last_frame_count = 0;
static void runahead_clear_variables(void)
{
runahead_save_state_size = -1;
runahead_save_state_size = 0;
runahead_save_state_size_known = false;
runahead_video_driver_is_active = true;
runahead_available = true;
runahead_secondary_core_available = true;
@ -216,12 +220,15 @@ void run_ahead(int runahead_count, bool useSecondary)
return;
}
if (runahead_save_state_size == -1)
if (!runahead_save_state_size_known)
{
if (!runahead_create())
{
/* RunAhead has been disabled because the core
* does not support savestates. */
settings_t *settings = config_get_ptr();
if (!settings->bools.run_ahead_hide_warnings)
{
runloop_msg_queue_push(msg_hash_to_str(MSG_RUNAHEAD_CORE_DOES_NOT_SUPPORT_SAVESTATES), 0, 2 * 60, true);
}
core_run();
runahead_force_input_dirty = true;
return;
@ -258,25 +265,34 @@ void run_ahead(int runahead_count, bool useSecondary)
if (frame_number == 0)
{
/* RunAhead has been disabled due
* to save state failure */
if (!runahead_save_state())
{
runloop_msg_queue_push(msg_hash_to_str(MSG_RUNAHEAD_FAILED_TO_SAVE_STATE), 0, 3 * 60, true);
return;
}
}
if (last_frame)
{
/* RunAhead has been disabled due
* to load state failure */
if (!runahead_load_state())
{
runloop_msg_queue_push(msg_hash_to_str(MSG_RUNAHEAD_FAILED_TO_LOAD_STATE), 0, 3 * 60, true);
return;
}
}
}
}
else
{
#if HAVE_DYNAMIC
bool okay = false;
if (!secondary_core_ensure_exists())
{
runahead_secondary_core_available = false;
runloop_msg_queue_push(msg_hash_to_str(MSG_RUNAHEAD_FAILED_TO_CREATE_SECONDARY_INSTANCE), 0, 3 * 60, true);
core_run();
runahead_force_input_dirty = true;
return;
}
/* run main core with video suspended */
runahead_suspend_video();
@ -285,45 +301,36 @@ void run_ahead(int runahead_count, bool useSecondary)
if (input_is_dirty || runahead_force_input_dirty)
{
unsigned frame_count;
input_is_dirty = false;
if (!runahead_save_state())
{
runloop_msg_queue_push(msg_hash_to_str(MSG_RUNAHEAD_FAILED_TO_SAVE_STATE), 0, 3 * 60, true);
return;
}
/* Could not create a secondary core.
* RunAhead wll only use the main core now. */
if (!runahead_load_state_secondary())
{
runloop_msg_queue_push(msg_hash_to_str(MSG_RUNAHEAD_FAILED_TO_LOAD_STATE), 0, 3 * 60, true);
return;
}
for (frame_count = 0; frame_count <
(unsigned)(runahead_count - 1); frame_count++)
for (frame_number = 0; frame_number < runahead_count - 1; frame_number++)
{
runahead_suspend_video();
runahead_suspend_audio();
set_hard_disable_audio();
okay = runahead_run_secondary();
runahead_run_secondary();
unset_hard_disable_audio();
runahead_resume_audio();
runahead_resume_video();
/* Could not create a secondary core. RunAhead
* will only use the main core now. */
if (!okay)
return;
}
}
runahead_suspend_audio();
set_hard_disable_audio();
okay = runahead_run_secondary();
runahead_run_secondary();
unset_hard_disable_audio();
runahead_resume_audio();
/* Could not create a secondary core. RunAhead
* will only use the main core now. */
if (!okay)
return;
#endif
}
runahead_force_input_dirty = false;
@ -335,18 +342,21 @@ static void runahead_error(void)
runahead_save_state_list_destroy();
remove_hooks();
runahead_save_state_size = 0;
runahead_save_state_size_known = true;
}
static bool runahead_create(void)
{
/* get savestate size and allocate buffer */
retro_ctx_size_info_t info;
set_fast_savestate();
core_serialize_size(&info);
unset_fast_savestate();
runahead_save_state_list_init(info.size);
runahead_video_driver_is_active = video_driver_is_active();
if (runahead_save_state_size == 0 || runahead_save_state_size == -1)
if (runahead_save_state_size == 0 || !runahead_save_state_size_known)
{
runahead_error();
return false;
@ -413,6 +423,7 @@ static bool runahead_load_state_secondary(void)
if (!okay)
{
runahead_secondary_core_available = false;
runahead_error();
return false;
}

View File

@ -295,16 +295,24 @@ void secondary_core_set_variable_update(void)
bool secondary_core_run_no_input_polling(void)
{
if (!secondary_module)
if (secondary_core_ensure_exists())
{
if (!secondary_core_create())
return false;
secondary_core.retro_run();
return true;
}
secondary_core.retro_run();
return true;
return false;
}
bool secondary_core_deserialize(const void *buffer, int size)
{
if (secondary_core_ensure_exists())
{
return secondary_core.retro_unserialize(buffer, size);
}
return false;
}
bool secondary_core_ensure_exists(void)
{
if (!secondary_module)
{
@ -314,7 +322,7 @@ bool secondary_core_deserialize(const void *buffer, int size)
return false;
}
}
return secondary_core.retro_unserialize(buffer, size);
return true;
}
void secondary_core_destroy(void)

View File

@ -12,6 +12,7 @@ RETRO_BEGIN_DECLS
bool secondary_core_run_no_input_polling(void);
bool secondary_core_deserialize(const void *buffer, int size);
bool secondary_core_ensure_exists(void);
void secondary_core_destroy(void);
void set_last_core_type(enum rarch_core_type type);
void remember_controller_port_device(long port, long device);