Merge pull request #11990 from m4xw/master

Band-Aid for libretro Savestate load
This commit is contained in:
Henrik Rydgård authored and GitHub committed 2019-04-24 11:00:47 +02:00
commit d15a6cf6bf
1 file changed
+42 -4
+42 -4
View File
@@ -453,6 +453,7 @@ void EmuThreadStop() {
// Need to keep eating frames to allow the EmuThread to exit correctly.
continue;
}
emuThread.join();
emuThread = std::thread();
ctx->ThreadEnd();
@@ -462,8 +463,11 @@ void EmuThreadPause() {
if (emuThreadState != EmuThreadState::RUNNING) {
return;
}
emuThreadState = EmuThreadState::PAUSE_REQUESTED;
ctx->ThreadFrame();
ctx->ThreadFrame(); // Eat 1 frame
while (emuThreadState != EmuThreadState::PAUSED) {
sleep_ms(1);
}
@@ -675,6 +679,11 @@ void retro_run(void) {
retro_input();
if (useEmuThread) {
if(emuThreadState == EmuThreadState::PAUSED || emuThreadState == EmuThreadState::PAUSE_REQUESTED) {
ctx->SwapBuffers();
return;
}
if (emuThreadState != EmuThreadState::RUNNING) {
EmuThreadStart();
}
@@ -705,19 +714,48 @@ struct SaveStart {
} // namespace SaveState
size_t retro_serialize_size(void) {
// TODO: Libretro API extension to use the savestate queue
if (useEmuThread) {
EmuThreadPause();
}
SaveState::SaveStart state;
return (CChunkFileReader::MeasurePtr(state) + 0x800000) & ~0x7FFFFF;
return (CChunkFileReader::MeasurePtr(state) + 0x800000) & ~0x7FFFFF; // We don't unpause intentionally
}
bool retro_serialize(void *data, size_t size) {
// TODO: Libretro API extension to use the savestate queue
if (useEmuThread) {
EmuThreadPause(); // Does nothing if already paused
}
SaveState::SaveStart state;
assert(CChunkFileReader::MeasurePtr(state) <= size);
return CChunkFileReader::SavePtr((u8 *)data, state) == CChunkFileReader::ERROR_NONE;
bool retVal = CChunkFileReader::SavePtr((u8 *)data, state) == CChunkFileReader::ERROR_NONE;
if (useEmuThread) {
EmuThreadStart();
sleep_ms(4);
}
return retVal;
}
bool retro_unserialize(const void *data, size_t size) {
// TODO: Libretro API extension to use the savestate queue
if (useEmuThread) {
EmuThreadPause(); // Does nothing if already paused
}
SaveState::SaveStart state;
return CChunkFileReader::LoadPtr((u8 *)data, state) == CChunkFileReader::ERROR_NONE;
bool retVal = CChunkFileReader::LoadPtr((u8 *)data, state) == CChunkFileReader::ERROR_NONE;
if (useEmuThread) {
EmuThreadStart();
sleep_ms(4);
}
return retVal;
}
void *retro_get_memory_data(unsigned id) {