diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 604de6f170..c37a5df922 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -277,8 +277,6 @@ void Stop() // - Hammertime! g_video_backend->Video_ExitLoop(); } - if (s_emu_thread.joinable()) - s_emu_thread.join(); } static void DeclareAsCPUThread() @@ -813,6 +811,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 1eea2be226..9fd256c388 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 c89e0d8307..19a53332f4 100644 --- a/Source/Core/DolphinWX/Main.cpp +++ b/Source/Core/DolphinWX/Main.cpp @@ -364,6 +364,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 1389abdcee..604e75216a 100644 --- a/Source/Core/DolphinWX/MainAndroid.cpp +++ b/Source/Core/DolphinWX/MainAndroid.cpp @@ -622,6 +622,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 9186742d46..60c7c7a0ee 100644 --- a/Source/Core/DolphinWX/MainNoGUI.cpp +++ b/Source/Core/DolphinWX/MainNoGUI.cpp @@ -359,6 +359,7 @@ int main(int argc, char* argv[]) while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN) updateMainFrameEvent.Wait(); + Core::Shutdown(); platform->Shutdown(); UICommon::Shutdown();