Move rewind manager state variable to p_rarch

This commit is contained in:
twinaphex 2020-10-15 06:04:20 +02:00
parent a69b7cb063
commit f066b944e8
3 changed files with 98 additions and 76 deletions

View File

@ -2131,6 +2131,9 @@ struct rarch_state
const struct retro_keybind *libretro_input_binds[MAX_USERS]; const struct retro_keybind *libretro_input_binds[MAX_USERS];
#ifdef HAVE_REWIND
struct state_manager_rewind_state rewind_st;
#endif
input_keyboard_line_t keyboard_line; /* ptr alignment */ input_keyboard_line_t keyboard_line; /* ptr alignment */
struct retro_subsystem_rom_info struct retro_subsystem_rom_info
subsystem_data_roms[SUBSYSTEM_MAX_SUBSYSTEMS] subsystem_data_roms[SUBSYSTEM_MAX_SUBSYSTEMS]
@ -2940,6 +2943,16 @@ struct netplay_room* netplay_get_host_room(void)
} }
#endif #endif
#ifdef HAVE_REWIND
bool state_manager_frame_is_reversed(void)
{
struct rarch_state *p_rarch = &rarch_st;
struct state_manager_rewind_state
*rewind_st = &p_rarch->rewind_st;
return rewind_st->frame_is_reversed;
}
#endif
gfx_animation_t *anim_get_ptr(void) gfx_animation_t *anim_get_ptr(void)
{ {
struct rarch_state *p_rarch = &rarch_st; struct rarch_state *p_rarch = &rarch_st;
@ -16348,7 +16361,7 @@ bool command_event(enum event_command cmd, void *data)
break; break;
case CMD_EVENT_REWIND_DEINIT: case CMD_EVENT_REWIND_DEINIT:
#ifdef HAVE_REWIND #ifdef HAVE_REWIND
state_manager_event_deinit(); state_manager_event_deinit(&p_rarch->rewind_st);
#endif #endif
break; break;
case CMD_EVENT_REWIND_INIT: case CMD_EVENT_REWIND_INIT:
@ -16369,7 +16382,8 @@ bool command_event(enum event_command cmd, void *data)
RARCH_NETPLAY_CTL_IS_ENABLED, NULL)) RARCH_NETPLAY_CTL_IS_ENABLED, NULL))
#endif #endif
{ {
state_manager_event_init((unsigned)rewind_buf_size); state_manager_event_init(&p_rarch->rewind_st,
(unsigned)rewind_buf_size);
} }
} }
} }
@ -16947,7 +16961,7 @@ bool command_event(enum event_command cmd, void *data)
/* Disable rewind & SRAM autosave if it was enabled /* Disable rewind & SRAM autosave if it was enabled
* TODO/FIXME: Add a setting for these tweaks */ * TODO/FIXME: Add a setting for these tweaks */
#ifdef HAVE_REWIND #ifdef HAVE_REWIND
state_manager_event_deinit(); state_manager_event_deinit(&p_rarch->rewind_st);
#endif #endif
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
autosave_deinit(); autosave_deinit();
@ -16989,7 +17003,7 @@ bool command_event(enum event_command cmd, void *data)
/* Disable rewind if it was enabled /* Disable rewind if it was enabled
TODO/FIXME: Add a setting for these tweaks */ TODO/FIXME: Add a setting for these tweaks */
#ifdef HAVE_REWIND #ifdef HAVE_REWIND
state_manager_event_deinit(); state_manager_event_deinit(&p_rarch->rewind_st);
#endif #endif
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
autosave_deinit(); autosave_deinit();
@ -17029,7 +17043,7 @@ bool command_event(enum event_command cmd, void *data)
/* Disable rewind if it was enabled /* Disable rewind if it was enabled
* TODO/FIXME: Add a setting for these tweaks */ * TODO/FIXME: Add a setting for these tweaks */
#ifdef HAVE_REWIND #ifdef HAVE_REWIND
state_manager_event_deinit(); state_manager_event_deinit(&p_rarch->rewind_st);
#endif #endif
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
autosave_deinit(); autosave_deinit();
@ -39848,6 +39862,7 @@ static enum runloop_state runloop_check_state(
s[0] = '\0'; s[0] = '\0';
rewinding = state_manager_check_rewind( rewinding = state_manager_check_rewind(
&p_rarch->rewind_st,
BIT256_GET(current_bits, RARCH_REWIND), BIT256_GET(current_bits, RARCH_REWIND),
settings->uints.rewind_granularity, settings->uints.rewind_granularity,
p_rarch->runloop_paused, p_rarch->runloop_paused,

View File

@ -62,40 +62,6 @@
#include <emmintrin.h> #include <emmintrin.h>
#endif #endif
struct state_manager
{
uint8_t *data;
/* Reading and writing is done here here. */
uint8_t *head;
/* If head comes close to this, discard a frame. */
uint8_t *tail;
uint8_t *thisblock;
uint8_t *nextblock;
#if STRICT_BUF_SIZE
uint8_t *debugblock;
size_t debugsize;
#endif
size_t capacity;
/* This one is rounded up from reset::blocksize. */
size_t blocksize;
/* size_t + (blocksize + 131071) / 131072 *
* (blocksize + u16 + u16) + u16 + u32 + size_t
* (yes, the math is a bit ugly). */
size_t maxcompsize;
unsigned entries;
bool thisblock_valid;
};
struct state_manager_rewind_state
{
/* Rewind support. */
state_manager_t *state;
size_t size;
};
/* Format per frame (pseudocode): */ /* Format per frame (pseudocode): */
#if 0 #if 0
size nextstart; size nextstart;
@ -116,10 +82,6 @@ repeat {
size thisstart; size thisstart;
#endif #endif
/* TODO/FIXME - static public global variables */
static struct state_manager_rewind_state rewind_state;
static bool frame_is_reversed = false;
/* There's no equivalent in libc, you'd think so ... /* There's no equivalent in libc, you'd think so ...
* std::mismatch exists, but it's not optimized at all. */ * std::mismatch exists, but it's not optimized at all. */
static size_t find_change(const uint16_t *a, const uint16_t *b) static size_t find_change(const uint16_t *a, const uint16_t *b)
@ -606,13 +568,15 @@ static void state_manager_capacity(state_manager_t *state,
} }
#endif #endif
void state_manager_event_init(unsigned rewind_buffer_size) void state_manager_event_init(
struct state_manager_rewind_state *rewind_st,
unsigned rewind_buffer_size)
{ {
retro_ctx_serialize_info_t serial_info; retro_ctx_serialize_info_t serial_info;
retro_ctx_size_info_t info; retro_ctx_size_info_t info;
void *state = NULL; void *state = NULL;
if (rewind_state.state) if (!rewind_st || rewind_st->state)
return; return;
if (audio_driver_has_callback()) if (audio_driver_has_callback())
@ -623,9 +587,9 @@ void state_manager_event_init(unsigned rewind_buffer_size)
core_serialize_size(&info); core_serialize_size(&info);
rewind_state.size = info.size; rewind_st->size = info.size;
if (!rewind_state.size) if (!rewind_st->size)
{ {
RARCH_ERR("%s.\n", RARCH_ERR("%s.\n",
msg_hash_to_str(MSG_REWIND_INIT_FAILED_THREADED_AUDIO)); msg_hash_to_str(MSG_REWIND_INIT_FAILED_THREADED_AUDIO));
@ -636,36 +600,35 @@ void state_manager_event_init(unsigned rewind_buffer_size)
msg_hash_to_str(MSG_REWIND_INIT), msg_hash_to_str(MSG_REWIND_INIT),
(unsigned)(rewind_buffer_size / 1000000)); (unsigned)(rewind_buffer_size / 1000000));
rewind_state.state = state_manager_new(rewind_state.size, rewind_st->state = state_manager_new(rewind_st->size,
rewind_buffer_size); rewind_buffer_size);
if (!rewind_state.state) if (!rewind_st->state)
RARCH_WARN("%s.\n", msg_hash_to_str(MSG_REWIND_INIT_FAILED)); RARCH_WARN("%s.\n", msg_hash_to_str(MSG_REWIND_INIT_FAILED));
state_manager_push_where(rewind_state.state, &state); state_manager_push_where(rewind_st->state, &state);
serial_info.data = state; serial_info.data = state;
serial_info.size = rewind_state.size; serial_info.size = rewind_st->size;
core_serialize(&serial_info); core_serialize(&serial_info);
state_manager_push_do(rewind_state.state); state_manager_push_do(rewind_st->state);
} }
bool state_manager_frame_is_reversed(void) void state_manager_event_deinit(
struct state_manager_rewind_state *rewind_st)
{ {
return frame_is_reversed; if (!rewind_st)
} return;
void state_manager_event_deinit(void) if (rewind_st->state)
{
if (rewind_state.state)
{ {
state_manager_free(rewind_state.state); state_manager_free(rewind_st->state);
free(rewind_state.state); free(rewind_st->state);
} }
rewind_state.state = NULL; rewind_st->state = NULL;
rewind_state.size = 0; rewind_st->size = 0;
} }
/** /**
@ -674,7 +637,9 @@ void state_manager_event_deinit(void)
* *
* Checks if rewind toggle/hold was being pressed and/or held. * Checks if rewind toggle/hold was being pressed and/or held.
**/ **/
bool state_manager_check_rewind(bool pressed, bool state_manager_check_rewind(
struct state_manager_rewind_state *rewind_st,
bool pressed,
unsigned rewind_granularity, bool is_paused, unsigned rewind_granularity, bool is_paused,
char *s, size_t len, unsigned *time) char *s, size_t len, unsigned *time)
{ {
@ -684,13 +649,16 @@ bool state_manager_check_rewind(bool pressed,
bool was_reversed = false; bool was_reversed = false;
#endif #endif
if (frame_is_reversed) if (!rewind_st)
return false;
if (rewind_st->frame_is_reversed)
{ {
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
was_reversed = true; was_reversed = true;
#endif #endif
audio_driver_frame_is_reverse(); audio_driver_frame_is_reverse();
frame_is_reversed = false; rewind_st->frame_is_reversed = false;
} }
if (first) if (first)
@ -699,14 +667,14 @@ bool state_manager_check_rewind(bool pressed,
return false; return false;
} }
if (!rewind_state.state) if (!rewind_st->state)
return false; return false;
if (pressed) if (pressed)
{ {
const void *buf = NULL; const void *buf = NULL;
if (state_manager_pop(rewind_state.state, &buf)) if (state_manager_pop(rewind_st->state, &buf))
{ {
retro_ctx_serialize_info_t serial_info; retro_ctx_serialize_info_t serial_info;
@ -716,7 +684,7 @@ bool state_manager_check_rewind(bool pressed,
netplay_driver_ctl(RARCH_NETPLAY_CTL_DESYNC_PUSH, NULL); netplay_driver_ctl(RARCH_NETPLAY_CTL_DESYNC_PUSH, NULL);
#endif #endif
frame_is_reversed = true; rewind_st->frame_is_reversed = true;
audio_driver_setup_rewind(); audio_driver_setup_rewind();
@ -726,7 +694,7 @@ bool state_manager_check_rewind(bool pressed,
ret = true; ret = true;
serial_info.data_const = buf; serial_info.data_const = buf;
serial_info.size = rewind_state.size; serial_info.size = rewind_st->size;
core_unserialize(&serial_info); core_unserialize(&serial_info);
@ -738,7 +706,7 @@ bool state_manager_check_rewind(bool pressed,
{ {
retro_ctx_serialize_info_t serial_info; retro_ctx_serialize_info_t serial_info;
serial_info.data_const = buf; serial_info.data_const = buf;
serial_info.size = rewind_state.size; serial_info.size = rewind_st->size;
core_unserialize(&serial_info); core_unserialize(&serial_info);
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
@ -773,14 +741,14 @@ bool state_manager_check_rewind(bool pressed,
retro_ctx_serialize_info_t serial_info; retro_ctx_serialize_info_t serial_info;
void *state = NULL; void *state = NULL;
state_manager_push_where(rewind_state.state, &state); state_manager_push_where(rewind_st->state, &state);
serial_info.data = state; serial_info.data = state;
serial_info.size = rewind_state.size; serial_info.size = rewind_st->size;
core_serialize(&serial_info); core_serialize(&serial_info);
state_manager_push_do(rewind_state.state); state_manager_push_do(rewind_st->state);
} }
} }

View File

@ -26,13 +26,50 @@
RETRO_BEGIN_DECLS RETRO_BEGIN_DECLS
struct state_manager
{
uint8_t *data;
/* Reading and writing is done here here. */
uint8_t *head;
/* If head comes close to this, discard a frame. */
uint8_t *tail;
uint8_t *thisblock;
uint8_t *nextblock;
#if STRICT_BUF_SIZE
uint8_t *debugblock;
size_t debugsize;
#endif
size_t capacity;
/* This one is rounded up from reset::blocksize. */
size_t blocksize;
/* size_t + (blocksize + 131071) / 131072 *
* (blocksize + u16 + u16) + u16 + u32 + size_t
* (yes, the math is a bit ugly). */
size_t maxcompsize;
unsigned entries;
bool thisblock_valid;
};
typedef struct state_manager state_manager_t; typedef struct state_manager state_manager_t;
struct state_manager_rewind_state
{
/* Rewind support. */
state_manager_t *state;
size_t size;
bool frame_is_reversed;
};
bool state_manager_frame_is_reversed(void); bool state_manager_frame_is_reversed(void);
void state_manager_event_deinit(void); void state_manager_event_deinit(
struct state_manager_rewind_state *rewind_st);
void state_manager_event_init(unsigned rewind_buffer_size); void state_manager_event_init(struct state_manager_rewind_state *rewind_st,
unsigned rewind_buffer_size);
/** /**
* check_rewind: * check_rewind:
@ -40,7 +77,9 @@ void state_manager_event_init(unsigned rewind_buffer_size);
* *
* Checks if rewind toggle/hold was being pressed and/or held. * Checks if rewind toggle/hold was being pressed and/or held.
**/ **/
bool state_manager_check_rewind(bool pressed, bool state_manager_check_rewind(
struct state_manager_rewind_state *rewind_st,
bool pressed,
unsigned rewind_granularity, bool is_paused, unsigned rewind_granularity, bool is_paused,
char *s, size_t len, unsigned *time); char *s, size_t len, unsigned *time);