diff --git a/UnleashedRecomp/app.cpp b/UnleashedRecomp/app.cpp index f209836..c4b6a32 100644 --- a/UnleashedRecomp/app.cpp +++ b/UnleashedRecomp/app.cpp @@ -35,6 +35,8 @@ PPC_FUNC(sub_824EB490) __imp__sub_824EB490(ctx, base); } +static std::thread::id g_mainThreadId = std::this_thread::get_id(); + // CApplication::Update PPC_FUNC_IMPL(__imp__sub_822C1130); PPC_FUNC(sub_822C1130) @@ -51,8 +53,15 @@ PPC_FUNC(sub_822C1130) App::s_deltaTime = ctx.f1.f64; - SDL_PumpEvents(); - SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT); + // This function can also be called by the loading thread, + // which SDL does not like. To prevent the OS from thinking + // the process is unresponsive, we will flush while waiting + // for the pipelines to finish compiling in video.cpp. + if (std::this_thread::get_id() == g_mainThreadId) + { + SDL_PumpEvents(); + SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT); + } GameWindow::Update(); AudioPatches::Update(App::s_deltaTime); diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index 338ff95..78e4d09 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -562,7 +562,6 @@ static void DestructTempResources() g_tempBuffers[g_frame].clear(); } -static std::thread::id g_mainThreadId; static std::thread::id g_presentThreadId = std::this_thread::get_id(); PPC_FUNC_IMPL(__imp__sub_824ECA00); @@ -1482,8 +1481,6 @@ void Video::CreateHostDevice(const char *sdlVideoDriver) for (auto& renderSemaphore : g_renderSemaphores) renderSemaphore = g_device->createCommandSemaphore(); - g_mainThreadId = std::this_thread::get_id(); - RenderPipelineLayoutBuilder pipelineLayoutBuilder; pipelineLayoutBuilder.begin(false, true); @@ -1742,6 +1739,8 @@ static void LockTextureRect(GuestTexture* texture, uint32_t, GuestLockedRect* lo static void UnlockTextureRect(GuestTexture* texture) { + assert(std::this_thread::get_id() == g_presentThreadId); + RenderCommand cmd; cmd.type = RenderCommandType::UnlockTextureRect; cmd.unlockTextureRect.texture = texture; @@ -5540,14 +5539,27 @@ static void CompileParticleMaterialPipeline(const Hedgehog::Sparkle::CParticleMa } } +#ifdef _DEBUG +static std::thread::id g_mainThreadId = std::this_thread::get_id(); +#endif + // SWA::CGameModeStage::ExitLoading PPC_FUNC_IMPL(__imp__sub_825369A0); PPC_FUNC(sub_825369A0) { + assert(std::this_thread::get_id() == g_mainThreadId); + // Wait for pipeline compilations to finish. uint32_t value; while ((value = g_compilingDataCount.load()) != 0) + { + // Pump SDL events to prevent the OS + // from thinking the process is unresponsive. + SDL_PumpEvents(); + SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT); + g_compilingDataCount.wait(value); + } __imp__sub_825369A0(ctx, base); }