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.
This commit is contained in:
JosJuice 2022-06-25 17:31:31 +02:00
parent 2f3c0cdbc5
commit dabad82219
3 changed files with 27 additions and 69 deletions

View File

@ -2,7 +2,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <EGL/egl.h> #include <EGL/egl.h>
#include <UICommon/GameFile.h>
#include <android/log.h> #include <android/log.h>
#include <android/native_window_jni.h> #include <android/native_window_jni.h>
#include <cstdio> #include <cstdio>
@ -56,13 +55,13 @@
#include "InputCommon/ControllerInterface/Touch/ButtonManager.h" #include "InputCommon/ControllerInterface/Touch/ButtonManager.h"
#include "InputCommon/GCAdapter.h" #include "InputCommon/GCAdapter.h"
#include "UICommon/GameFile.h"
#include "UICommon/UICommon.h" #include "UICommon/UICommon.h"
#include "VideoCommon/OnScreenDisplay.h" #include "VideoCommon/OnScreenDisplay.h"
#include "VideoCommon/RenderBase.h" #include "VideoCommon/RenderBase.h"
#include "VideoCommon/VideoBackendBase.h" #include "VideoCommon/VideoBackendBase.h"
#include "../../Core/Common/WindowSystemInfo.h"
#include "jni/AndroidCommon/AndroidCommon.h" #include "jni/AndroidCommon/AndroidCommon.h"
#include "jni/AndroidCommon/IDCache.h" #include "jni/AndroidCommon/IDCache.h"
@ -521,7 +520,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Initialize(J
Common::AndroidSetReportHandler(&ReportSend); Common::AndroidSetReportHandler(&ReportSend);
DolphinAnalytics::AndroidSetGetValFunc(&GetAnalyticValue); DolphinAnalytics::AndroidSetGetValFunc(&GetAnalyticValue);
UICommon::Init(); UICommon::Init();
GCAdapter::Init(); UICommon::InitControllers(WindowSystemInfo(WindowSystemType::Android, nullptr, nullptr, nullptr));
} }
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReportStartToAnalytics(JNIEnv*, JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReportStartToAnalytics(JNIEnv*,

View File

@ -20,6 +20,7 @@
#include "AudioCommon/AudioCommon.h" #include "AudioCommon/AudioCommon.h"
#include "Common/Assert.h"
#include "Common/CPUDetect.h" #include "Common/CPUDetect.h"
#include "Common/CommonPaths.h" #include "Common/CommonPaths.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
@ -470,26 +471,14 @@ static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi
DeclareAsCPUThread(); DeclareAsCPUThread();
s_frame_step = false; s_frame_step = false;
// The frontend will likely have initialized the controller interface, as it needs // Switch the window used for inputs to the render window. This way, the cursor position
// it to provide the configuration dialogs. In this case, instead of re-initializing // is relative to the render window, instead of the main window.
// entirely, we switch the window used for inputs to the render window. This way, the ASSERT(g_controller_interface.IsInit());
// 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); g_controller_interface.ChangeWindow(wsi.render_window);
Pad::LoadConfig(); Pad::LoadConfig();
Pad::LoadGBAConfig(); Pad::LoadGBAConfig();
Keyboard::LoadConfig(); Keyboard::LoadConfig();
}
BootSessionData boot_session_data = std::move(boot->boot_session_data); BootSessionData boot_session_data = std::move(boot->boot_session_data);
const std::optional<std::string>& savestate_path = boot_session_data.GetSavestatePath(); const std::optional<std::string>& savestate_path = boot_session_data.GetSavestatePath();
@ -506,53 +495,16 @@ static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi
Common::SyncSDImageToSDFolder(); Common::SyncSDImageToSDFolder();
}}; }};
// Load and Init Wiimotes - only if we are booting in Wii mode // Load Wiimotes - only if we are booting in Wii mode
bool init_wiimotes = false;
if (core_parameter.bWii && !Config::Get(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED)) 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()) if (NetPlay::IsNetPlayRunning())
NetPlay::SetupWiimotes(); NetPlay::SetupWiimotes();
} }
if (init_controllers)
{
FreeLook::Initialize();
}
else
{
FreeLook::LoadInputConfig(); 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();
}};
Movie::Init(*boot); Movie::Init(*boot);
Common::ScopeGuard movie_guard{&Movie::Shutdown}; Common::ScopeGuard movie_guard{&Movie::Shutdown};

View File

@ -17,6 +17,7 @@
#include <Windows.h> #include <Windows.h>
#endif #endif
#include "Common/ScopeGuard.h"
#include "Common/StringUtil.h" #include "Common/StringUtil.h"
#include "Core/Boot/Boot.h" #include "Core/Boot/Boot.h"
#include "Core/BootManager.h" #include "Core/BootManager.h"
@ -226,10 +227,6 @@ int main(int argc, char* argv[])
if (options.is_set("user")) if (options.is_set("user"))
user_directory = static_cast<const char*>(options.get("user")); user_directory = static_cast<const char*>(options.get("user"));
UICommon::SetUserDirectory(user_directory);
UICommon::Init();
GCAdapter::Init();
s_platform = GetPlatform(options); s_platform = GetPlatform(options);
if (!s_platform || !s_platform->Init()) if (!s_platform || !s_platform->Init())
{ {
@ -237,6 +234,17 @@ int main(int argc, char* argv[])
return 1; 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) if (save_state_path && !game_specified)
{ {
fprintf(stderr, "A save state cannot be loaded without specifying a game to launch.\n"); 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"); 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"); fprintf(stderr, "Could not boot the specified file\n");
return 1; return 1;
@ -278,7 +286,6 @@ int main(int argc, char* argv[])
Core::Shutdown(); Core::Shutdown();
s_platform.reset(); s_platform.reset();
UICommon::Shutdown();
return 0; return 0;
} }