Rework the shutdown logic in the OpenGL backend. Eliminated race conditions.

This commit is contained in:
Henrik Rydgård
2025-08-30 18:37:29 +02:00
parent b813a6c30f
commit 9218fe9b59
26 changed files with 158 additions and 200 deletions
+1 -4
View File
@@ -25,11 +25,8 @@ public:
}
void ThreadStart() override { renderManager_->ThreadStart(draw_); }
bool ThreadFrame() override { return renderManager_->ThreadFrame(); }
bool ThreadFrame(bool waitIfEmpty) override { return renderManager_->ThreadFrame(waitIfEmpty); }
void ThreadEnd() override { renderManager_->ThreadEnd(); }
void StopThread() override {
renderManager_->StopThread();
}
GPUCore GetGPUCore() override { return GPUCORE_GLES; }
const char *Ident() override { return "OpenGL"; }
+1 -4
View File
@@ -21,11 +21,8 @@ public:
}
void ThreadStart() override { renderManager_->ThreadStart(draw_); }
bool ThreadFrame() override { return renderManager_->ThreadFrame(); }
bool ThreadFrame(bool waitIfEmpty) override { return renderManager_->ThreadFrame(waitIfEmpty); }
void ThreadEnd() override { renderManager_->ThreadEnd(); }
void StopThread() override {
renderManager_->StopThread();
}
GPUCore GetGPUCore() override { return GPUCORE_GLES; }
const char *Ident() override { return "OpenGL Core"; }
+6 -5
View File
@@ -1415,7 +1415,6 @@ namespace Libretro
default:
case EmuThreadState::QUIT_REQUESTED:
emuThreadState = EmuThreadState::STOPPED;
ctx->StopThread();
return;
}
}
@@ -1441,8 +1440,9 @@ namespace Libretro
emuThreadState = EmuThreadState::QUIT_REQUESTED;
// Need to keep eating frames to allow the EmuThread to exit correctly.
while (ctx->ThreadFrame())
;
ctx->ThreadFrameUntilCondition([]() -> bool {
return emuThreadState == EmuThreadState::STOPPED;
});
emuThread.join();
emuThread = std::thread();
@@ -1456,7 +1456,8 @@ namespace Libretro
emuThreadState = EmuThreadState::PAUSE_REQUESTED;
ctx->ThreadFrame(); // Eat 1 frame
// Is this safe?
ctx->ThreadFrame(true); // Eat 1 frame
while (emuThreadState != EmuThreadState::PAUSED)
sleep_ms(1, "libretro-pause-poll");
@@ -1748,7 +1749,7 @@ void retro_run(void)
if (emuThreadState != EmuThreadState::RUNNING)
EmuThreadStart();
if (!ctx->ThreadFrame())
if (!ctx->ThreadFrame(true))
{
VsyncSwapIntervalDetect();
return;