From dabad822193f23bd01c13c4d0798f0a507e910eb Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sat, 25 Jun 2022 17:31:31 +0200 Subject: [PATCH] Require frontend to initialize controllers We currently have two different code paths for initializing controllers: Either the frontend (DolphinQt) can do it, or if the frontend doesn't do it, the core will do it automatically when booting. Having these two paths has caused problems in the past due to only one frontend being tested (see de7ef47548). I would like to get rid of the latter path to avoid further problems like this. --- Source/Android/jni/MainAndroid.cpp | 5 +- Source/Core/Core/Core.cpp | 72 +++++--------------------- Source/Core/DolphinNoGUI/MainNoGUI.cpp | 19 ++++--- 3 files changed, 27 insertions(+), 69 deletions(-) diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index 77c373a481..d41ebe4cc9 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -2,7 +2,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include #include #include #include @@ -56,13 +55,13 @@ #include "InputCommon/ControllerInterface/Touch/ButtonManager.h" #include "InputCommon/GCAdapter.h" +#include "UICommon/GameFile.h" #include "UICommon/UICommon.h" #include "VideoCommon/OnScreenDisplay.h" #include "VideoCommon/RenderBase.h" #include "VideoCommon/VideoBackendBase.h" -#include "../../Core/Common/WindowSystemInfo.h" #include "jni/AndroidCommon/AndroidCommon.h" #include "jni/AndroidCommon/IDCache.h" @@ -521,7 +520,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Initialize(J Common::AndroidSetReportHandler(&ReportSend); DolphinAnalytics::AndroidSetGetValFunc(&GetAnalyticValue); UICommon::Init(); - GCAdapter::Init(); + UICommon::InitControllers(WindowSystemInfo(WindowSystemType::Android, nullptr, nullptr, nullptr)); } JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReportStartToAnalytics(JNIEnv*, diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index f2a9ec334d..e445749d8d 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -20,6 +20,7 @@ #include "AudioCommon/AudioCommon.h" +#include "Common/Assert.h" #include "Common/CPUDetect.h" #include "Common/CommonPaths.h" #include "Common/CommonTypes.h" @@ -470,26 +471,14 @@ static void EmuThread(std::unique_ptr boot, WindowSystemInfo wsi DeclareAsCPUThread(); s_frame_step = false; - // The frontend will likely have initialized the controller interface, as it needs - // it to provide the configuration dialogs. In this case, instead of re-initializing - // entirely, we switch the window used for inputs to the render window. This way, the - // cursor position is relative to the render window, instead of the main window. - bool init_controllers = false; - if (!g_controller_interface.IsInit()) - { - g_controller_interface.Initialize(wsi); - Pad::Initialize(); - Pad::InitializeGBA(); - Keyboard::Initialize(); - init_controllers = true; - } - else - { - g_controller_interface.ChangeWindow(wsi.render_window); - Pad::LoadConfig(); - Pad::LoadGBAConfig(); - Keyboard::LoadConfig(); - } + // Switch the window used for inputs to the render window. This way, the cursor position + // is relative to the render window, instead of the main window. + ASSERT(g_controller_interface.IsInit()); + g_controller_interface.ChangeWindow(wsi.render_window); + + Pad::LoadConfig(); + Pad::LoadGBAConfig(); + Keyboard::LoadConfig(); BootSessionData boot_session_data = std::move(boot->boot_session_data); const std::optional& savestate_path = boot_session_data.GetSavestatePath(); @@ -506,53 +495,16 @@ static void EmuThread(std::unique_ptr boot, WindowSystemInfo wsi Common::SyncSDImageToSDFolder(); }}; - // Load and Init Wiimotes - only if we are booting in Wii mode - bool init_wiimotes = false; + // Load Wiimotes - only if we are booting in Wii mode if (core_parameter.bWii && !Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED)) { - if (init_controllers) - { - Wiimote::Initialize(savestate_path ? Wiimote::InitializeMode::DO_WAIT_FOR_WIIMOTES : - Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES); - init_wiimotes = true; - } - else - { - Wiimote::LoadConfig(); - } + Wiimote::LoadConfig(); if (NetPlay::IsNetPlayRunning()) NetPlay::SetupWiimotes(); } - if (init_controllers) - { - FreeLook::Initialize(); - } - else - { - FreeLook::LoadInputConfig(); - } - - Common::ScopeGuard controller_guard{[init_controllers, init_wiimotes] { - if (!init_controllers) - return; - - if (init_wiimotes) - { - Wiimote::ResetAllWiimotes(); - Wiimote::Shutdown(); - } - - FreeLook::Shutdown(); - - ResetRumble(); - - Keyboard::Shutdown(); - Pad::Shutdown(); - Pad::ShutdownGBA(); - g_controller_interface.Shutdown(); - }}; + FreeLook::LoadInputConfig(); Movie::Init(*boot); Common::ScopeGuard movie_guard{&Movie::Shutdown}; diff --git a/Source/Core/DolphinNoGUI/MainNoGUI.cpp b/Source/Core/DolphinNoGUI/MainNoGUI.cpp index cec4788f1c..03ea30ec17 100644 --- a/Source/Core/DolphinNoGUI/MainNoGUI.cpp +++ b/Source/Core/DolphinNoGUI/MainNoGUI.cpp @@ -17,6 +17,7 @@ #include #endif +#include "Common/ScopeGuard.h" #include "Common/StringUtil.h" #include "Core/Boot/Boot.h" #include "Core/BootManager.h" @@ -226,10 +227,6 @@ int main(int argc, char* argv[]) if (options.is_set("user")) user_directory = static_cast(options.get("user")); - UICommon::SetUserDirectory(user_directory); - UICommon::Init(); - GCAdapter::Init(); - s_platform = GetPlatform(options); if (!s_platform || !s_platform->Init()) { @@ -237,6 +234,17 @@ int main(int argc, char* argv[]) return 1; } + const WindowSystemInfo wsi = s_platform->GetWindowSystemInfo(); + + UICommon::SetUserDirectory(user_directory); + UICommon::Init(); + UICommon::InitControllers(wsi); + + Common::ScopeGuard ui_common_guard([] { + UICommon::ShutdownControllers(); + UICommon::Shutdown(); + }); + if (save_state_path && !game_specified) { fprintf(stderr, "A save state cannot be loaded without specifying a game to launch.\n"); @@ -263,7 +271,7 @@ int main(int argc, char* argv[]) DolphinAnalytics::Instance().ReportDolphinStart("nogui"); - if (!BootManager::BootCore(std::move(boot), s_platform->GetWindowSystemInfo())) + if (!BootManager::BootCore(std::move(boot), wsi)) { fprintf(stderr, "Could not boot the specified file\n"); return 1; @@ -278,7 +286,6 @@ int main(int argc, char* argv[]) Core::Shutdown(); s_platform.reset(); - UICommon::Shutdown(); return 0; }