From 6154a843e0b8c575e594df2cfd9fa4b7ae6bcab1 Mon Sep 17 00:00:00 2001 From: Dwedit Date: Wed, 9 May 2018 19:08:16 -0500 Subject: [PATCH] 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 --- config.def.h | 3 ++ configuration.c | 1 + configuration.h | 1 + intl/msg_hash_lbl.h | 2 + intl/msg_hash_us.h | 16 +++++++- menu/cbs/menu_cbs_sublabel.c | 4 ++ menu/menu_displaylist.c | 4 ++ menu/menu_setting.c | 18 ++++++++- msg_hash.h | 6 ++- runahead/dirty_input.c | 4 +- runahead/run_ahead.c | 73 +++++++++++++++++++++--------------- runahead/secondary_core.c | 20 +++++++--- runahead/secondary_core.h | 1 + 13 files changed, 111 insertions(+), 42 deletions(-) diff --git a/config.def.h b/config.def.h index 155fa181b6..f33198cd4c 100644 --- a/config.def.h +++ b/config.def.h @@ -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; diff --git a/configuration.c b/configuration.c index 4433f53ad6..0243e6a38b 100644 --- a/configuration.c +++ b/configuration.c @@ -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); diff --git a/configuration.h b/configuration.h index 64cf46e2d6..d55220c532 100644 --- a/configuration.h +++ b/configuration.h @@ -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; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index b666ca3b24..75f7e22614 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -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, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index ae24356f32..8bada4ed75 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -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, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 09942ad099..71918beaf5 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -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; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index d69cb46090..91c7af8fa6 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -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, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index e3763dd737..cc41f1647d 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -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, diff --git a/msg_hash.h b/msg_hash.h index 6693d096bc..def5316963 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -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), diff --git a/runahead/dirty_input.c b/runahead/dirty_input.c index 5c2086a53a..184cdcc639 100644 --- a/runahead/dirty_input.c +++ b/runahead/dirty_input.c @@ -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) diff --git a/runahead/run_ahead.c b/runahead/run_ahead.c index 71122ce6e6..3905a6a464 100644 --- a/runahead/run_ahead.c +++ b/runahead/run_ahead.c @@ -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; } diff --git a/runahead/secondary_core.c b/runahead/secondary_core.c index 016f53ca2e..7b804586a7 100644 --- a/runahead/secondary_core.c +++ b/runahead/secondary_core.c @@ -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) diff --git a/runahead/secondary_core.h b/runahead/secondary_core.h index 9eb4190d09..d4da77cdec 100644 --- a/runahead/secondary_core.h +++ b/runahead/secondary_core.h @@ -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);