Fast Savestate and Hard Audio Disable flags

This commit is contained in:
Dwedit 2018-03-30 20:22:35 -05:00
parent cf4ab13281
commit ec6d6e58d6
4 changed files with 105 additions and 10 deletions

View File

@ -68,6 +68,7 @@
#ifdef HAVE_RUNAHEAD #ifdef HAVE_RUNAHEAD
#include "runahead/secondary_core.h" #include "runahead/secondary_core.h"
#include "runahead/run_ahead.h"
#endif #endif
#ifdef HAVE_DYNAMIC #ifdef HAVE_DYNAMIC
@ -1763,6 +1764,16 @@ bool rarch_environment_cb(unsigned cmd, void *data)
{ {
result |= 1; result |= 1;
} }
#ifdef HAVE_RUNAHEAD
if (want_fast_savestate())
{
result |= 4;
}
if (get_hard_disable_audio())
{
result |= 8;
}
#endif
if (data != NULL) if (data != NULL)
{ {
int* result_p = (int*)data; int* result_p = (int*)data;

View File

@ -1119,12 +1119,43 @@ struct retro_led_interface
#define RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE (47 | RETRO_ENVIRONMENT_EXPERIMENTAL) #define RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE (47 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* int * -- /* int * --
* Queries the frontend if audio and video are enabled or not. * Tells the core if the frontend wants audio or video.
* If not enabled, the frontend will discard the audio or video, * If disabled, the frontend will discard the audio or video,
* so the core may decide to skip producing audio or video. * so the core may decide to skip generating a frame or generating audio.
* Bit 0 (value 1) is set if Video is enabled, * This is mainly used for increasing performance.
* Bit 1 (value 2) is set if Audio is enabled. * Bit 0 (value 1): Enable Video
* Other bits are reserved for future use. * Bit 1 (value 2): Enable Audio
* Bit 2 (value 4): Use Fast Savestates.
* Bit 3 (value 8): Hard Disable Audio
* Other bits are reserved for future use and will default to zero.
* If video is disabled:
* * The frontend wants the core to not generate any video,
* including presenting frames via hardware acceleration.
* * The frontend's video frame callback will do nothing.
* * After running the frame, the video output of the next frame should be
* no different than if video was enabled, and saving and loading state
* should have no issues.
* If audio is disabled:
* * The frontend wants the core to not generate any audio.
* * The frontend's audio callbacks will do nothing.
* * After running the frame, the audio output of the next frame should be
* no different than if audio was enabled, and saving and loading state
* should have no issues.
* Fast Savestates:
* * Guaranteed to be created by the same binary that will load them.
* * Will not be written to or read from the disk.
* * Suggest that the core updates its memory buffers in-place if possible.
* * Suggest that the core skips clearing memory.
* * Suggest that the core skips resetting the system.
* * Suggest that the core may skip validation steps.
* Hard Disable Audio:
* * Used for a secondary core when running ahead.
* * Indicates that the frontend will never need audio from the core.
* * Suggests that the core may stop synthesizing audio, but this should not
* compromise emulation accuracy.
* * Audio output for the next frame does not matter, and the frontend will
* never need an accurate audio state in the future.
* * State will never be saved when using Hard Disable Audio.
*/ */
#define RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE (41 | RETRO_ENVIRONMENT_EXPERIMENTAL) #define RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE (41 | RETRO_ENVIRONMENT_EXPERIMENTAL)

View File

@ -23,6 +23,10 @@ static void runahead_suspend_audio(void);
static void runahead_resume_audio(void); static void runahead_resume_audio(void);
static void runahead_suspend_video(void); static void runahead_suspend_video(void);
static void runahead_resume_video(void); static void runahead_resume_video(void);
static void set_fast_savestate(void);
static void unset_fast_savestate(void);
static void set_hard_disable_audio(void);
static void unset_hard_disable_audio(void);
static size_t runahead_save_state_size = -1; static size_t runahead_save_state_size = -1;
@ -274,7 +278,9 @@ void run_ahead(int runAheadCount, bool useSecondary)
{ {
runahead_suspend_video(); runahead_suspend_video();
runahead_suspend_audio(); runahead_suspend_audio();
set_hard_disable_audio();
okay = runahead_run_secondary(); okay = runahead_run_secondary();
unset_hard_disable_audio();
runahead_resume_audio(); runahead_resume_audio();
runahead_resume_video(); runahead_resume_video();
@ -285,7 +291,9 @@ void run_ahead(int runAheadCount, bool useSecondary)
} }
} }
runahead_suspend_audio(); runahead_suspend_audio();
set_hard_disable_audio();
okay = runahead_run_secondary(); okay = runahead_run_secondary();
unset_hard_disable_audio();
runahead_resume_audio(); runahead_resume_audio();
/* Could not create a secondary core. RunAhead /* Could not create a secondary core. RunAhead
@ -330,8 +338,10 @@ static bool runahead_save_state(void)
{ {
retro_ctx_serialize_info_t *serialize_info = retro_ctx_serialize_info_t *serialize_info =
(retro_ctx_serialize_info_t*)runahead_save_state_list->data[0]; (retro_ctx_serialize_info_t*)runahead_save_state_list->data[0];
bool okay = core_serialize(serialize_info); bool okay;
set_fast_savestate();
okay = core_serialize(serialize_info);
unset_fast_savestate();
if (!okay) if (!okay)
runahead_error(); runahead_error();
return okay; return okay;
@ -342,7 +352,10 @@ static bool runahead_load_state(void)
retro_ctx_serialize_info_t *serialize_info = (retro_ctx_serialize_info_t*) retro_ctx_serialize_info_t *serialize_info = (retro_ctx_serialize_info_t*)
runahead_save_state_list->data[0]; runahead_save_state_list->data[0];
bool lastDirty = input_is_dirty; bool lastDirty = input_is_dirty;
bool okay = core_unserialize(serialize_info); bool okay;
set_fast_savestate();
okay = core_unserialize(serialize_info);
unset_fast_savestate();
input_is_dirty = lastDirty; input_is_dirty = lastDirty;
if (!okay) if (!okay)
@ -355,7 +368,10 @@ static bool runahead_load_state_secondary(void)
{ {
retro_ctx_serialize_info_t *serialize_info = retro_ctx_serialize_info_t *serialize_info =
(retro_ctx_serialize_info_t*)runahead_save_state_list->data[0]; (retro_ctx_serialize_info_t*)runahead_save_state_list->data[0];
bool okay = secondary_core_deserialize(serialize_info->data_const, serialize_info->size); bool okay;
set_fast_savestate();
okay = secondary_core_deserialize(serialize_info->data_const, serialize_info->size);
unset_fast_savestate();
if (!okay) if (!okay)
runahead_secondary_core_available = false; runahead_secondary_core_available = false;
@ -400,3 +416,37 @@ void runahead_destroy(void)
remove_hooks(); remove_hooks();
runahead_clear_variables(); runahead_clear_variables();
} }
static bool request_fast_savestate;
static bool hard_disable_audio;
bool want_fast_savestate(void)
{
return request_fast_savestate;
}
static void set_fast_savestate(void)
{
request_fast_savestate = true;
}
static void unset_fast_savestate(void)
{
request_fast_savestate = false;
}
bool get_hard_disable_audio(void)
{
return hard_disable_audio;
}
static void set_hard_disable_audio(void)
{
hard_disable_audio = true;
}
static void unset_hard_disable_audio(void)
{
hard_disable_audio = false;
}

View File

@ -10,6 +10,9 @@ void runahead_destroy(void);
void run_ahead(int runAheadCount, bool useSecondary); void run_ahead(int runAheadCount, bool useSecondary);
bool want_fast_savestate(void);
bool get_hard_disable_audio(void);
RETRO_END_DECLS RETRO_END_DECLS
#endif #endif