Merge pull request #12931 from jdgleaver/runahead-cheats

Fix cheats when using second instance runahead
This commit is contained in:
Autechre 2021-09-03 16:48:30 +02:00 committed by GitHub
commit 588c1305c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 120 additions and 1 deletions

View File

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

View File

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

View File

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

View File

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

View File

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