diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 84ced6b876..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() @@ -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();