Changes to Netplay for the recent changes to quirks.

This commit is contained in:
Gregor Richards 2016-09-30 19:04:58 -04:00
parent 1483aa710f
commit 51683661e5
2 changed files with 40 additions and 17 deletions

View File

@ -969,27 +969,52 @@ void netplay_log_connection(const struct sockaddr_storage *their_addr,
bool netplay_wait_and_init_serialization(netplay_t *netplay) bool netplay_try_init_serialization(netplay_t *netplay)
{ {
int frames; retro_ctx_serialize_info_t serial_info;
if (netplay->state_size) if (netplay->state_size)
return true; return true;
/* Wait maximally 60 frames, or until the core reports it's initialized */ if (!netplay_init_serialization(netplay))
for (frames = 0; (core_serialization_quirks() & RETRO_SERIALIZATION_QUIRK_INITIALIZING) && frames < 60; frames++) return false;
{
/* Check if we can actually save */
serial_info.data_const = NULL;
serial_info.data = netplay->buffer[netplay->self_ptr].state;
serial_info.size = netplay->state_size;
if (!core_serialize(&serial_info))
return false;
/* Once initialized, we no longer exhibit this quirk */
netplay->quirks &= ~((uint64_t) NETPLAY_QUIRK_INITIALIZATION);
return true;
}
bool netplay_wait_and_init_serialization(netplay_t *netplay)
{
int frame;
if (netplay->state_size)
return true;
/* Wait a maximum of 60 frames */
for (frame = 0; frame < 60; frame++) {
if (netplay_try_init_serialization(netplay))
return true;
#if defined(HAVE_THREADS) #if defined(HAVE_THREADS)
autosave_lock(); autosave_lock();
#endif #endif
core_run(); core_run();
#if defined(HAVE_THREADS) #if defined(HAVE_THREADS)
autosave_unlock(); autosave_unlock();
#endif #endif
} }
return netplay_init_serialization(netplay); return false;
} }
bool netplay_init_serialization(netplay_t *netplay) bool netplay_init_serialization(netplay_t *netplay)
@ -1002,6 +1027,9 @@ bool netplay_init_serialization(netplay_t *netplay)
core_serialize_size(&info); core_serialize_size(&info);
if (!info.size)
return false;
netplay->state_size = info.size; netplay->state_size = info.size;
for (i = 0; i < netplay->buffer_size; i++) for (i = 0; i < netplay->buffer_size; i++)
@ -1015,9 +1043,6 @@ bool netplay_init_serialization(netplay_t *netplay)
} }
} }
/* Once initialized, we no longer exhibit this quirk */
netplay->quirks &= ~((uint64_t) NETPLAY_QUIRK_INITIALIZATION);
return true; return true;
} }
@ -1039,7 +1064,7 @@ static bool netplay_init_buffers(netplay_t *netplay, unsigned frames)
return false; return false;
if (!(netplay->quirks & NETPLAY_QUIRK_INITIALIZATION)) if (!(netplay->quirks & NETPLAY_QUIRK_INITIALIZATION))
return netplay_init_serialization(netplay); netplay_init_serialization(netplay);
return true; return true;
} }
@ -1242,8 +1267,7 @@ bool netplay_pre_frame(netplay_t *netplay)
if (netplay->quirks & NETPLAY_QUIRK_INITIALIZATION) if (netplay->quirks & NETPLAY_QUIRK_INITIALIZATION)
{ {
/* Are we ready now? */ /* Are we ready now? */
if (!(core_serialization_quirks() & RETRO_SERIALIZATION_QUIRK_INITIALIZING) || netplay->self_frame_count > 60) netplay_try_init_serialization(netplay);
netplay_init_serialization(netplay);
} }
if (!netplay->net_cbs->pre_frame(netplay)) if (!netplay->net_cbs->pre_frame(netplay))

View File

@ -50,7 +50,6 @@
#define NETPLAY_QUIRK_MAP_UNDERSTOOD \ #define NETPLAY_QUIRK_MAP_UNDERSTOOD \
(RETRO_SERIALIZATION_QUIRK_INCOMPLETE \ (RETRO_SERIALIZATION_QUIRK_INCOMPLETE \
|RETRO_SERIALIZATION_QUIRK_MUST_INITIALIZE \ |RETRO_SERIALIZATION_QUIRK_MUST_INITIALIZE \
|RETRO_SERIALIZATION_QUIRK_INITIALIZING \
|RETRO_SERIALIZATION_QUIRK_SINGLE_SESSION \ |RETRO_SERIALIZATION_QUIRK_SINGLE_SESSION \
|RETRO_SERIALIZATION_QUIRK_ARCHITECTURE_DEPENDENT) |RETRO_SERIALIZATION_QUIRK_ARCHITECTURE_DEPENDENT)
#define NETPLAY_QUIRK_MAP_NO_SAVESTATES \ #define NETPLAY_QUIRK_MAP_NO_SAVESTATES \