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];
|
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,
|
||||||
|
104
state_manager.c
104
state_manager.c
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user