diff --git a/Windows/EmuThread.cpp b/Windows/EmuThread.cpp index b88f8eb75f..fcbe2c42ba 100644 --- a/Windows/EmuThread.cpp +++ b/Windows/EmuThread.cpp @@ -46,15 +46,25 @@ static std::thread mainThread; static std::string g_error_message; static bool g_inLoop; +static const char** g_argv; +static int g_argc; + extern std::vector GetWideCmdLine(); class GraphicsContext; static GraphicsContext *g_graphicsContext; -void MainThreadFunc(); +void MainThreadFunc(int argc, const char *argv[]); -void MainThread_Start() { - mainThread = std::thread(&MainThreadFunc); +void MainThread_Start(int argc, const char *argv[]) { + // This is just to survive WM_USER_RESTART_EMUTHREAD. + if (g_argc == 0) { + g_argc = argc; + g_argv = argv; + } + mainThread = std::thread([]() { + MainThreadFunc(g_argc, g_argv); + }); } void MainThread_Stop() { @@ -65,6 +75,9 @@ void MainThread_Stop() { } bool MainThread_Ready() { + if (g_inLoop) { + _dbg_assert_(mainThread.joinable()); + } return g_inLoop; } @@ -143,26 +156,15 @@ bool CreateGraphicsBackend(std::string *error_message, GraphicsContext **ctx) { } } -void MainThreadFunc() { +void MainThreadFunc(int argc, const char *argv[]) { const bool useEmuThread = g_Config.iGPUBackend == (int)GPUBackend::OPENGL; SetCurrentThreadName(useEmuThread ? "RenderThread" : "EmuThread"); System_SetWindowTitle(""); - // We convert command line arguments to UTF-8 immediately. - std::vector wideArgs = GetWideCmdLine(); - std::vector argsUTF8; - for (const auto &string : wideArgs) { - argsUTF8.push_back(ConvertWStringToUTF8(string)); - } - std::vector args; - for (const auto &string : argsUTF8) { - args.push_back(string.c_str()); - } - const bool performingRestart = NativeIsRestarting(); - NativeInit(static_cast(args.size()), &args[0], "", "", nullptr); + NativeInit(argc, argv, "", "", nullptr); if (g_Config.sFailedGPUBackends.find("ALL") != std::string::npos) { diff --git a/Windows/EmuThread.h b/Windows/EmuThread.h index f630b50763..34dc544fe7 100644 --- a/Windows/EmuThread.h +++ b/Windows/EmuThread.h @@ -17,6 +17,8 @@ #pragma once -void MainThread_Start(); +void MainThread_Start(int argc, const char *argv[]); void MainThread_Stop(); bool MainThread_Ready(); + +void MainThreadFunc(int argc, const char *argv[]); diff --git a/Windows/MainWindow.cpp b/Windows/MainWindow.cpp index ed93c6e13d..eb60d4fcc1 100644 --- a/Windows/MainWindow.cpp +++ b/Windows/MainWindow.cpp @@ -1102,7 +1102,7 @@ namespace MainWindow { g_InputManager.StopPolling(); MainThread_Stop(); UpdateUIState(UISTATE_MENU); - MainThread_Start(); + MainThread_Start(0, nullptr); g_InputManager.BeginPolling(); break; diff --git a/Windows/main.cpp b/Windows/main.cpp index a123f367bd..fe7610d58c 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -908,7 +908,6 @@ static bool DetectVulkanInExternalProcess() { std::vector GetWideCmdLine() { wchar_t **wargv; int wargc = -1; - // This is used for the WM_USER_RESTART_EMUTHREAD path. if (!restartArgs.empty()) { std::wstring wargs = ConvertUTF8ToWString("PPSSPP " + restartArgs); wargv = CommandLineToArgvW(wargs.c_str(), &wargc); @@ -919,7 +918,6 @@ std::vector GetWideCmdLine() { std::vector wideArgs(wargv, wargv + wargc); LocalFree(wargv); - return wideArgs; } @@ -1023,7 +1021,7 @@ static void WinMainCleanup() { } int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { - std::vector wideArgs = GetWideCmdLine(); + const std::vector wideArgs = GetWideCmdLine(); // Check for the Vulkan workaround before any serious init. for (size_t i = 1; i < wideArgs.size(); ++i) { @@ -1044,7 +1042,6 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin SetCurrentThreadName("Main"); TimeInit(); - WinMainInit(); #ifndef _DEBUG @@ -1230,7 +1227,18 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin // Emu thread (and render thread, if any) is always running! // Only OpenGL uses an externally managed render thread (due to GL's single-threaded context design). Vulkan // manages its own render thread. - MainThread_Start(); + + // We convert command line arguments to UTF-8. + std::vector argsUTF8; + for (const auto &string : wideArgs) { + argsUTF8.push_back(ConvertWStringToUTF8(string)); + } + std::vector args; + for (const auto &string : argsUTF8) { + args.push_back(string.c_str()); + } + + MainThread_Start((int)args.size(), args.data()); g_InputManager.BeginPolling();