Add private environment callback - only used by Flycast

(RetroArch-specific, for threaded rendering)
This commit is contained in:
twinaphex 2019-08-24 19:25:03 +02:00
parent f80d77c06c
commit 42f2d0ffa4
2 changed files with 70 additions and 17 deletions

View File

@ -824,6 +824,16 @@ static settings_t *configuration_settings = NULL;
static enum rarch_core_type current_core_type = CORE_TYPE_PLAIN; static enum rarch_core_type current_core_type = CORE_TYPE_PLAIN;
static enum rarch_core_type explicit_current_core_type = CORE_TYPE_PLAIN; static enum rarch_core_type explicit_current_core_type = CORE_TYPE_PLAIN;
/*
* Override poll type behavior, is set by the core.
*
* 0 - Don't Care
* 1 - Early
* 2 - Normal
* 3 - Late
*/
static unsigned core_poll_type_override = 0;
static bool has_set_username = false; static bool has_set_username = false;
#ifdef HAVE_THREAD_STORAGE #ifdef HAVE_THREAD_STORAGE
@ -7736,15 +7746,6 @@ static bool rarch_environment_cb(unsigned cmd, void *data)
break; break;
} }
case RETRO_ENVIRONMENT_SET_SAVE_STATE_IN_BACKGROUND:
{
bool state = *(const bool*)data;
RARCH_LOG("Environ SET_SAVE_STATE_IN_BACKGROUND: %s.\n", state ? "yes" : "no");
set_save_state_in_background(state);
break;
}
case RETRO_ENVIRONMENT_GET_LIBRETRO_PATH: case RETRO_ENVIRONMENT_GET_LIBRETRO_PATH:
{ {
@ -8294,10 +8295,6 @@ static bool rarch_environment_cb(unsigned cmd, void *data)
*(bool *)data = runloop_fastmotion; *(bool *)data = runloop_fastmotion;
break; break;
case RETRO_ENVIRONMENT_GET_CLEAR_ALL_THREAD_WAITS_CB:
*(retro_environment_t *)data = rarch_clear_all_thread_waits;
break;
case RETRO_ENVIRONMENT_GET_INPUT_BITMASKS: case RETRO_ENVIRONMENT_GET_INPUT_BITMASKS:
/* Just falldown, the function will return true */ /* Just falldown, the function will return true */
break; break;
@ -8321,6 +8318,35 @@ static bool rarch_environment_cb(unsigned cmd, void *data)
break; break;
} }
/* Private environment callbacks.
*
* Should all be properly addressed in version 2.
* */
case RETRO_ENVIRONMENT_POLL_TYPE_OVERRIDE:
{
const unsigned *poll_type_data = (const unsigned*)data;
if (poll_type_data)
core_poll_type_override = *poll_type_data;
}
break;
case RETRO_ENVIRONMENT_GET_CLEAR_ALL_THREAD_WAITS_CB:
*(retro_environment_t *)data = rarch_clear_all_thread_waits;
break;
case RETRO_ENVIRONMENT_SET_SAVE_STATE_IN_BACKGROUND:
{
bool state = *(const bool*)data;
RARCH_LOG("Environ SET_SAVE_STATE_IN_BACKGROUND: %s.\n", state ? "yes" : "no");
set_save_state_in_background(state);
}
break;
default: default:
RARCH_LOG("Environ UNSUPPORTED (#%u).\n", cmd); RARCH_LOG("Environ UNSUPPORTED (#%u).\n", cmd);
return false; return false;
@ -8776,6 +8802,8 @@ static void secondary_core_destroy(void)
/* unload game from core */ /* unload game from core */
if (secondary_core.retro_unload_game) if (secondary_core.retro_unload_game)
secondary_core.retro_unload_game(); secondary_core.retro_unload_game();
core_poll_type_override = 0;
/* deinit */ /* deinit */
if (secondary_core.retro_deinit) if (secondary_core.retro_deinit)
secondary_core.retro_deinit(); secondary_core.retro_deinit();
@ -21098,6 +21126,7 @@ static void unload_hook(void)
secondary_core_destroy(); secondary_core_destroy();
if (current_core.retro_unload_game) if (current_core.retro_unload_game)
current_core.retro_unload_game(); current_core.retro_unload_game();
core_poll_type_override = 0;
} }
static void runahead_deinit_hook(void) static void runahead_deinit_hook(void)
@ -26026,14 +26055,20 @@ static int16_t core_input_state_poll_late(unsigned port,
static retro_input_state_t core_input_state_poll_return_cb(void) static retro_input_state_t core_input_state_poll_return_cb(void)
{ {
if (current_core.poll_type == POLL_TYPE_LATE) unsigned new_poll_type = (core_poll_type_override > 0)
? (core_poll_type_override - 1)
: current_core.poll_type;
if (new_poll_type == POLL_TYPE_LATE)
return core_input_state_poll_late; return core_input_state_poll_late;
return core_input_state_poll; return core_input_state_poll;
} }
static void core_input_state_poll_maybe(void) static void core_input_state_poll_maybe(void)
{ {
if (current_core.poll_type == POLL_TYPE_NORMAL) unsigned new_poll_type = (core_poll_type_override > 0)
? (core_poll_type_override - 1)
: current_core.poll_type;
if (new_poll_type == POLL_TYPE_NORMAL)
input_driver_poll(); input_driver_poll();
} }
@ -26273,6 +26308,7 @@ static bool core_unload_game(void)
if (current_core.game_loaded) if (current_core.game_loaded)
{ {
current_core.retro_unload_game(); current_core.retro_unload_game();
core_poll_type_override = 0;
current_core.game_loaded = false; current_core.game_loaded = false;
} }
@ -26283,8 +26319,11 @@ static bool core_unload_game(void)
bool core_run(void) bool core_run(void)
{ {
bool early_polling = current_core.poll_type == POLL_TYPE_EARLY; unsigned new_poll_type = (core_poll_type_override != 0)
bool late_polling = current_core.poll_type == POLL_TYPE_LATE; ? (core_poll_type_override - 1)
: current_core.poll_type;
bool early_polling = new_poll_type == POLL_TYPE_EARLY;
bool late_polling = new_poll_type == POLL_TYPE_LATE;
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
bool netplay_preframe = netplay_driver_ctl( bool netplay_preframe = netplay_driver_ctl(
RARCH_NETPLAY_CTL_PRE_FRAME, NULL); RARCH_NETPLAY_CTL_PRE_FRAME, NULL);

View File

@ -64,6 +64,20 @@ RETRO_BEGIN_DECLS
* between the core and the frontend to gracefully stop all threads. * between the core and the frontend to gracefully stop all threads.
*/ */
#define RETRO_ENVIRONMENT_POLL_TYPE_OVERRIDE (4 | RETRO_ENVIRONMENT_RETROARCH_START_BLOCK)
/* unsigned * --
* Tells the frontend to override the poll type behavior.
* Allows the frontend to influence the polling behavior of the
* frontend.
*
* Will be unset when retro_unload_game is called.
*
* 0 - Don't Care, no changes, frontend still determines polling type behavior.
* 1 - Early
* 2 - Normal
* 3 - Late
*/
enum rarch_ctl_state enum rarch_ctl_state
{ {
RARCH_CTL_NONE = 0, RARCH_CTL_NONE = 0,