From b6c4d5792ba33ec1025041ed97b57bbbe00bafc7 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Sat, 6 Jun 2015 14:52:09 +0200 Subject: [PATCH 1/2] Revert "Join the emu thread in Core::Stop. Get rid of Core::Shutdown which did that before." This reverts commit ba664b3293e88ddee94a4b922ced192f3270b569. Added documentation to Core::Shutdown() to prevent breaking changes. --- Source/Core/Core/Core.cpp | 14 ++++++++++++-- Source/Core/Core/Core.h | 1 + Source/Core/DolphinWX/Main.cpp | 1 + Source/Core/DolphinWX/MainAndroid.cpp | 1 + Source/Core/DolphinWX/MainNoGUI.cpp | 1 + 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 84ced6b876..8844db83f5 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -273,8 +273,6 @@ void Stop() // - Hammertime! g_video_backend->Video_ExitLoop(); } - if (s_emu_thread.joinable()) - s_emu_thread.join(); } static void DeclareAsCPUThread() @@ -829,6 +827,18 @@ void UpdateTitle() Host_UpdateTitle(SMessage); } +void Shutdown() +{ + // During shutdown DXGI expects us to handle some messages on the UI thread. + // Therefore we can't immediately block and wait for the emu thread to shut + // down, so we join the emu thread as late as possible when the UI has already + // shut down. + // For more info read "DirectX Graphics Infrastructure (DXGI): Best Practices" + // on MSDN. + if (s_emu_thread.joinable()) + s_emu_thread.join(); +} + void SetOnStoppedCallback(StoppedCallbackFunc callback) { s_on_stopped_callback = callback; diff --git a/Source/Core/Core/Core.h b/Source/Core/Core/Core.h index 11d4fa2e98..0bafa5e2d9 100644 --- a/Source/Core/Core/Core.h +++ b/Source/Core/Core/Core.h @@ -39,6 +39,7 @@ enum EState bool Init(); void Stop(); +void Shutdown(); std::string StopMessage(bool, const std::string&); diff --git a/Source/Core/DolphinWX/Main.cpp b/Source/Core/DolphinWX/Main.cpp index 194ca7b566..43a79ac6f7 100644 --- a/Source/Core/DolphinWX/Main.cpp +++ b/Source/Core/DolphinWX/Main.cpp @@ -370,6 +370,7 @@ void DolphinApp::OnEndSession(wxCloseEvent& event) int DolphinApp::OnExit() { + Core::Shutdown(); UICommon::Shutdown(); delete m_locale; diff --git a/Source/Core/DolphinWX/MainAndroid.cpp b/Source/Core/DolphinWX/MainAndroid.cpp index 3788f42928..1d48f5c103 100644 --- a/Source/Core/DolphinWX/MainAndroid.cpp +++ b/Source/Core/DolphinWX/MainAndroid.cpp @@ -627,6 +627,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv * updateMainFrameEvent.Wait(); } + Core::Shutdown(); UICommon::Shutdown(); ANativeWindow_release(surf); diff --git a/Source/Core/DolphinWX/MainNoGUI.cpp b/Source/Core/DolphinWX/MainNoGUI.cpp index 1f559b9f88..5d50423f0a 100644 --- a/Source/Core/DolphinWX/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/MainNoGUI.cpp @@ -358,6 +358,7 @@ int main(int argc, char* argv[]) while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN) updateMainFrameEvent.Wait(); + Core::Shutdown(); platform->Shutdown(); UICommon::Shutdown(); From 5535c5c54c4a2a9394e6e2b19334ab54523dc8b4 Mon Sep 17 00:00:00 2001 From: Jules Blok Date: Wed, 22 Jul 2015 09:44:39 +0200 Subject: [PATCH 2/2] Core: Don't return true on IsRunning() when stopping emulation. --- Source/Core/Core/Core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 8844db83f5..7db5e458ce 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -162,7 +162,7 @@ void DisplayMessage(const std::string& message, int time_in_ms) bool IsRunning() { - return (GetState() != CORE_UNINITIALIZED) || s_hardware_initialized; + return (GetState() != CORE_UNINITIALIZED || s_hardware_initialized) && !s_is_stopping; } bool IsRunningAndStarted()