mirror of
https://github.com/libretro/RetroArch
synced 2025-02-03 08:54:13 +00:00
Move rewind manager state variable to p_rarch
This commit is contained in:
parent
a69b7cb063
commit
f066b944e8
25
retroarch.c
25
retroarch.c
@ -2131,6 +2131,9 @@ struct rarch_state
|
||||
|
||||
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 */
|
||||
struct retro_subsystem_rom_info
|
||||
subsystem_data_roms[SUBSYSTEM_MAX_SUBSYSTEMS]
|
||||
@ -2940,6 +2943,16 @@ struct netplay_room* netplay_get_host_room(void)
|
||||
}
|
||||
#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)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
@ -16348,7 +16361,7 @@ bool command_event(enum event_command cmd, void *data)
|
||||
break;
|
||||
case CMD_EVENT_REWIND_DEINIT:
|
||||
#ifdef HAVE_REWIND
|
||||
state_manager_event_deinit();
|
||||
state_manager_event_deinit(&p_rarch->rewind_st);
|
||||
#endif
|
||||
break;
|
||||
case CMD_EVENT_REWIND_INIT:
|
||||
@ -16369,7 +16382,8 @@ bool command_event(enum event_command cmd, void *data)
|
||||
RARCH_NETPLAY_CTL_IS_ENABLED, NULL))
|
||||
#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
|
||||
* TODO/FIXME: Add a setting for these tweaks */
|
||||
#ifdef HAVE_REWIND
|
||||
state_manager_event_deinit();
|
||||
state_manager_event_deinit(&p_rarch->rewind_st);
|
||||
#endif
|
||||
#ifdef HAVE_THREADS
|
||||
autosave_deinit();
|
||||
@ -16989,7 +17003,7 @@ bool command_event(enum event_command cmd, void *data)
|
||||
/* Disable rewind if it was enabled
|
||||
TODO/FIXME: Add a setting for these tweaks */
|
||||
#ifdef HAVE_REWIND
|
||||
state_manager_event_deinit();
|
||||
state_manager_event_deinit(&p_rarch->rewind_st);
|
||||
#endif
|
||||
#ifdef HAVE_THREADS
|
||||
autosave_deinit();
|
||||
@ -17029,7 +17043,7 @@ bool command_event(enum event_command cmd, void *data)
|
||||
/* Disable rewind if it was enabled
|
||||
* TODO/FIXME: Add a setting for these tweaks */
|
||||
#ifdef HAVE_REWIND
|
||||
state_manager_event_deinit();
|
||||
state_manager_event_deinit(&p_rarch->rewind_st);
|
||||
#endif
|
||||
#ifdef HAVE_THREADS
|
||||
autosave_deinit();
|
||||
@ -39848,6 +39862,7 @@ static enum runloop_state runloop_check_state(
|
||||
s[0] = '\0';
|
||||
|
||||
rewinding = state_manager_check_rewind(
|
||||
&p_rarch->rewind_st,
|
||||
BIT256_GET(current_bits, RARCH_REWIND),
|
||||
settings->uints.rewind_granularity,
|
||||
p_rarch->runloop_paused,
|
||||
|
104
state_manager.c
104
state_manager.c
@ -62,40 +62,6 @@
|
||||
#include <emmintrin.h>
|
||||
#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): */
|
||||
#if 0
|
||||
size nextstart;
|
||||
@ -116,10 +82,6 @@ repeat {
|
||||
size thisstart;
|
||||
#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 ...
|
||||
* std::mismatch exists, but it's not optimized at all. */
|
||||
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
|
||||
|
||||
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_size_info_t info;
|
||||
void *state = NULL;
|
||||
|
||||
if (rewind_state.state)
|
||||
if (!rewind_st || rewind_st->state)
|
||||
return;
|
||||
|
||||
if (audio_driver_has_callback())
|
||||
@ -623,9 +587,9 @@ void state_manager_event_init(unsigned rewind_buffer_size)
|
||||
|
||||
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",
|
||||
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),
|
||||
(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);
|
||||
|
||||
if (!rewind_state.state)
|
||||
if (!rewind_st->state)
|
||||
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.size = rewind_state.size;
|
||||
serial_info.size = rewind_st->size;
|
||||
|
||||
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_state.state)
|
||||
if (rewind_st->state)
|
||||
{
|
||||
state_manager_free(rewind_state.state);
|
||||
free(rewind_state.state);
|
||||
state_manager_free(rewind_st->state);
|
||||
free(rewind_st->state);
|
||||
}
|
||||
rewind_state.state = NULL;
|
||||
rewind_state.size = 0;
|
||||
rewind_st->state = NULL;
|
||||
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.
|
||||
**/
|
||||
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,
|
||||
char *s, size_t len, unsigned *time)
|
||||
{
|
||||
@ -684,13 +649,16 @@ bool state_manager_check_rewind(bool pressed,
|
||||
bool was_reversed = false;
|
||||
#endif
|
||||
|
||||
if (frame_is_reversed)
|
||||
if (!rewind_st)
|
||||
return false;
|
||||
|
||||
if (rewind_st->frame_is_reversed)
|
||||
{
|
||||
#ifdef HAVE_NETWORKING
|
||||
was_reversed = true;
|
||||
#endif
|
||||
audio_driver_frame_is_reverse();
|
||||
frame_is_reversed = false;
|
||||
rewind_st->frame_is_reversed = false;
|
||||
}
|
||||
|
||||
if (first)
|
||||
@ -699,14 +667,14 @@ bool state_manager_check_rewind(bool pressed,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!rewind_state.state)
|
||||
if (!rewind_st->state)
|
||||
return false;
|
||||
|
||||
if (pressed)
|
||||
{
|
||||
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;
|
||||
|
||||
@ -716,7 +684,7 @@ bool state_manager_check_rewind(bool pressed,
|
||||
netplay_driver_ctl(RARCH_NETPLAY_CTL_DESYNC_PUSH, NULL);
|
||||
#endif
|
||||
|
||||
frame_is_reversed = true;
|
||||
rewind_st->frame_is_reversed = true;
|
||||
|
||||
audio_driver_setup_rewind();
|
||||
|
||||
@ -726,7 +694,7 @@ bool state_manager_check_rewind(bool pressed,
|
||||
ret = true;
|
||||
|
||||
serial_info.data_const = buf;
|
||||
serial_info.size = rewind_state.size;
|
||||
serial_info.size = rewind_st->size;
|
||||
|
||||
core_unserialize(&serial_info);
|
||||
|
||||
@ -738,7 +706,7 @@ bool state_manager_check_rewind(bool pressed,
|
||||
{
|
||||
retro_ctx_serialize_info_t serial_info;
|
||||
serial_info.data_const = buf;
|
||||
serial_info.size = rewind_state.size;
|
||||
serial_info.size = rewind_st->size;
|
||||
core_unserialize(&serial_info);
|
||||
|
||||
#ifdef HAVE_NETWORKING
|
||||
@ -773,14 +741,14 @@ bool state_manager_check_rewind(bool pressed,
|
||||
retro_ctx_serialize_info_t serial_info;
|
||||
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.size = rewind_state.size;
|
||||
serial_info.size = rewind_st->size;
|
||||
|
||||
core_serialize(&serial_info);
|
||||
|
||||
state_manager_push_do(rewind_state.state);
|
||||
state_manager_push_do(rewind_st->state);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,13 +26,50 @@
|
||||
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
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:
|
||||
@ -40,7 +77,9 @@ void state_manager_event_init(unsigned rewind_buffer_size);
|
||||
*
|
||||
* 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,
|
||||
char *s, size_t len, unsigned *time);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user