From 743aea181033a941f8a13f3196fe2c6cb07ea189 Mon Sep 17 00:00:00 2001 From: jdgleaver Date: Fri, 3 Sep 2021 11:13:55 +0100 Subject: [PATCH] Fix cheats when using second instance runahead --- command.h | 3 ++ menu/menu_setting.c | 25 +++++++++++++ retroarch.c | 85 ++++++++++++++++++++++++++++++++++++++++++- retroarch.h | 5 +++ retroarch_fwd_decls.h | 3 ++ 5 files changed, 120 insertions(+), 1 deletion(-) diff --git a/command.h b/command.h index 27c6d74ac6..da06f01df4 100644 --- a/command.h +++ b/command.h @@ -73,6 +73,9 @@ enum event_command /* Loads core. */ CMD_EVENT_LOAD_CORE, CMD_EVENT_LOAD_CORE_PERSIST, +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + CMD_EVENT_LOAD_SECOND_CORE, +#endif CMD_EVENT_UNLOAD_CORE, CMD_EVENT_CLOSE_CONTENT, CMD_EVENT_LOAD_STATE, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index c5e58c86ae..b14b23a543 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -8192,6 +8192,31 @@ static void general_write_handler(rarch_setting_t *setting) default_aspect; } break; +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + case MENU_ENUM_LABEL_RUN_AHEAD_ENABLED: + case MENU_ENUM_LABEL_RUN_AHEAD_FRAMES: + case MENU_ENUM_LABEL_RUN_AHEAD_SECONDARY_INSTANCE: + { + settings_t *settings = config_get_ptr(); + bool run_ahead_enabled = settings->bools.run_ahead_enabled; + unsigned run_ahead_frames = settings->uints.run_ahead_frames; + bool run_ahead_secondary_instance = settings->bools.run_ahead_secondary_instance; + + /* If any changes here will cause second + * instance runahead to be enabled, must + * re-apply cheats to ensure that they + * propagate to the newly-created secondary + * core */ + if (run_ahead_enabled && + (run_ahead_frames > 0) && + run_ahead_secondary_instance && + !rarch_ctl(RARCH_CTL_IS_SECOND_CORE_LOADED, NULL) && + rarch_ctl(RARCH_CTL_IS_SECOND_CORE_AVAILABLE, NULL) && + command_event(CMD_EVENT_LOAD_SECOND_CORE, NULL)) + command_event(CMD_EVENT_CHEATS_APPLY, NULL); + } + break; +#endif default: /* Special cases */ diff --git a/retroarch.c b/retroarch.c index a95d4f8cf1..95012718de 100644 --- a/retroarch.c +++ b/retroarch.c @@ -12207,6 +12207,21 @@ bool command_event(enum event_command cmd, void *data) #endif break; } +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + case CMD_EVENT_LOAD_SECOND_CORE: + if (!runloop_state.core_running || + !p_rarch->runahead_secondary_core_available) + return false; + if (p_rarch->secondary_lib_handle) + return true; + if (!secondary_core_ensure_exists(p_rarch, settings)) + { + secondary_core_destroy(p_rarch); + p_rarch->runahead_secondary_core_available = false; + return false; + } + return true; +#endif case CMD_EVENT_LOAD_STATE: #ifdef HAVE_BSV_MOVIE /* Immutable - disallow savestate load when @@ -33523,6 +33538,14 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) } } return false; +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + case RARCH_CTL_IS_SECOND_CORE_AVAILABLE: + return runloop_state.core_running && + p_rarch->runahead_secondary_core_available; + case RARCH_CTL_IS_SECOND_CORE_LOADED: + return runloop_state.core_running && + (p_rarch->secondary_lib_handle != NULL); +#endif case RARCH_CTL_HAS_SET_USERNAME: return p_rarch->has_set_username; case RARCH_CTL_IS_INITED: @@ -36546,15 +36569,75 @@ bool core_unset_netplay_callbacks(void) bool core_set_cheat(retro_ctx_cheat_info_t *info) { - struct rarch_state *p_rarch = &rarch_st; + struct rarch_state *p_rarch = &rarch_st; +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + settings_t *settings = p_rarch->configuration_settings; + bool run_ahead_enabled = false; + unsigned run_ahead_frames = 0; + bool run_ahead_secondary_instance = false; + bool want_runahead = false; + + if (settings) + { + run_ahead_enabled = settings->bools.run_ahead_enabled; + run_ahead_frames = settings->uints.run_ahead_frames; + run_ahead_secondary_instance = settings->bools.run_ahead_secondary_instance; + want_runahead = run_ahead_enabled && (run_ahead_frames > 0); +#ifdef HAVE_NETWORKING + if (want_runahead) + want_runahead = !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL); +#endif + } +#endif + p_rarch->current_core.retro_cheat_set(info->index, info->enabled, info->code); + +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + if (want_runahead && + run_ahead_secondary_instance && + p_rarch->runahead_secondary_core_available && + secondary_core_ensure_exists(p_rarch, settings) && + p_rarch->secondary_core.retro_cheat_set) + p_rarch->secondary_core.retro_cheat_set(info->index, info->enabled, info->code); +#endif + return true; } bool core_reset_cheat(void) { struct rarch_state *p_rarch = &rarch_st; +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + settings_t *settings = p_rarch->configuration_settings; + bool run_ahead_enabled = false; + unsigned run_ahead_frames = 0; + bool run_ahead_secondary_instance = false; + bool want_runahead = false; + + if (settings) + { + run_ahead_enabled = settings->bools.run_ahead_enabled; + run_ahead_frames = settings->uints.run_ahead_frames; + run_ahead_secondary_instance = settings->bools.run_ahead_secondary_instance; + want_runahead = run_ahead_enabled && (run_ahead_frames > 0); +#ifdef HAVE_NETWORKING + if (want_runahead) + want_runahead = !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL); +#endif + } +#endif + p_rarch->current_core.retro_cheat_reset(); + +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + if (want_runahead && + run_ahead_secondary_instance && + p_rarch->runahead_secondary_core_available && + secondary_core_ensure_exists(p_rarch, settings) && + p_rarch->secondary_core.retro_cheat_reset) + p_rarch->secondary_core.retro_cheat_reset(); +#endif + return true; } diff --git a/retroarch.h b/retroarch.h index 4d46f39b5c..cddcd16317 100644 --- a/retroarch.h +++ b/retroarch.h @@ -94,6 +94,11 @@ enum rarch_ctl_state RARCH_CTL_IS_DUMMY_CORE, RARCH_CTL_IS_CORE_LOADED, +#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)) + RARCH_CTL_IS_SECOND_CORE_AVAILABLE, + RARCH_CTL_IS_SECOND_CORE_LOADED, +#endif + RARCH_CTL_IS_BPS_PREF, RARCH_CTL_UNSET_BPS_PREF, diff --git a/retroarch_fwd_decls.h b/retroarch_fwd_decls.h index 9851cb57ba..7798e75e58 100644 --- a/retroarch_fwd_decls.h +++ b/retroarch_fwd_decls.h @@ -56,6 +56,9 @@ static void rarch_init_core_options( #if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB) static bool secondary_core_create(struct rarch_state *p_rarch, settings_t *settings); +static void secondary_core_destroy(struct rarch_state *p_rarch); +static bool secondary_core_ensure_exists(struct rarch_state *p_rarch, + settings_t *settings); #endif static int16_t input_state_get_last(unsigned port, unsigned device, unsigned index, unsigned id);