From 64f68e96354df3afb9bb563c888793f98ecb5026 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Wed, 13 Dec 2023 21:39:38 -0600 Subject: service: hid: Allow to create multiple instances of shared memory --- src/core/hle/service/hid/resource_manager.cpp | 64 ++++++++++++++++----------- 1 file changed, 37 insertions(+), 27 deletions(-) (limited to 'src/core/hle/service/hid/resource_manager.cpp') diff --git a/src/core/hle/service/hid/resource_manager.cpp b/src/core/hle/service/hid/resource_manager.cpp index 89cdc19cc..0cfe30fde 100644 --- a/src/core/hle/service/hid/resource_manager.cpp +++ b/src/core/hle/service/hid/resource_manager.cpp @@ -18,10 +18,10 @@ #include "core/hle/service/hid/controllers/npad.h" #include "core/hle/service/hid/controllers/palma.h" #include "core/hle/service/hid/controllers/seven_six_axis.h" +#include "core/hle/service/hid/controllers/shared_memory_format.h" #include "core/hle/service/hid/controllers/six_axis.h" #include "core/hle/service/hid/controllers/stubbed.h" #include "core/hle/service/hid/controllers/touchscreen.h" -#include "core/hle/service/hid/controllers/xpad.h" namespace Service::HID { @@ -45,40 +45,43 @@ void ResourceManager::Initialize() { return; } - u8* shared_memory = system.Kernel().GetHidSharedMem().GetPointer(); - debug_pad = std::make_shared(system.HIDCore(), shared_memory); - mouse = std::make_shared(system.HIDCore(), shared_memory); - debug_mouse = std::make_shared(system.HIDCore(), shared_memory); - keyboard = std::make_shared(system.HIDCore(), shared_memory); - unique_pad = std::make_shared(system.HIDCore(), shared_memory); - npad = std::make_shared(system.HIDCore(), shared_memory, service_context); - gesture = std::make_shared(system.HIDCore(), shared_memory); - touch_screen = std::make_shared(system.HIDCore(), shared_memory); - xpad = std::make_shared(system.HIDCore(), shared_memory); + system.HIDCore().ReloadInputDevices(); + is_initialized = true; +} + +void ResourceManager::InitializeController(u64 aruid) { + SharedMemoryFormat* shared_memory = nullptr; + const auto result = applet_resource->GetSharedMemoryFormat(&shared_memory, aruid); + if (result.IsError()) { + return; + } + + debug_pad = std::make_shared(system.HIDCore(), shared_memory->debug_pad); + mouse = std::make_shared(system.HIDCore(), shared_memory->mouse); + debug_mouse = std::make_shared(system.HIDCore(), shared_memory->debug_mouse); + keyboard = std::make_shared(system.HIDCore(), shared_memory->keyboard); + unique_pad = std::make_shared(system.HIDCore(), shared_memory->unique_pad.header); + npad = std::make_shared(system.HIDCore(), shared_memory->npad, service_context); + gesture = std::make_shared(system.HIDCore(), shared_memory->gesture); + touch_screen = std::make_shared(system.HIDCore(), shared_memory->touch_screen); - palma = std::make_shared(system.HIDCore(), shared_memory, service_context); + palma = std::make_shared(system.HIDCore(), service_context); - home_button = std::make_shared(system.HIDCore(), shared_memory); - sleep_button = std::make_shared(system.HIDCore(), shared_memory); - capture_button = std::make_shared(system.HIDCore(), shared_memory); + home_button = std::make_shared(system.HIDCore(), shared_memory->home_button.header); + sleep_button = + std::make_shared(system.HIDCore(), shared_memory->sleep_button.header); + capture_button = + std::make_shared(system.HIDCore(), shared_memory->capture_button.header); + digitizer = std::make_shared(system.HIDCore(), shared_memory->digitizer.header); six_axis = std::make_shared(system.HIDCore(), npad); - console_six_axis = std::make_shared(system.HIDCore(), shared_memory); + console_six_axis = std::make_shared(system.HIDCore(), shared_memory->console); seven_six_axis = std::make_shared(system); - home_button->SetCommonHeaderOffset(0x4C00); - sleep_button->SetCommonHeaderOffset(0x4E00); - capture_button->SetCommonHeaderOffset(0x5000); - unique_pad->SetCommonHeaderOffset(0x5A00); - debug_mouse->SetCommonHeaderOffset(0x3DC00); - // Homebrew doesn't try to activate some controllers, so we activate them by default npad->Activate(); six_axis->Activate(); touch_screen->Activate(); - - system.HIDCore().ReloadInputDevices(); - is_initialized = true; } std::shared_ptr ResourceManager::GetAppletResource() const { @@ -101,6 +104,10 @@ std::shared_ptr ResourceManager::GetDebugPad() const { return debug_pad; } +std::shared_ptr ResourceManager::GetDigitizer() const { + return digitizer; +} + std::shared_ptr ResourceManager::GetGesture() const { return gesture; } @@ -163,7 +170,11 @@ Result ResourceManager::CreateAppletResource(u64 aruid) { Result ResourceManager::CreateAppletResourceImpl(u64 aruid) { std::scoped_lock lock{shared_mutex}; - return applet_resource->CreateAppletResource(aruid); + const auto result = applet_resource->CreateAppletResource(aruid); + if (result.IsSuccess()) { + InitializeController(aruid); + } + return result; } Result ResourceManager::RegisterCoreAppletResource() { @@ -227,7 +238,6 @@ void ResourceManager::UpdateControllers(std::uintptr_t user_data, home_button->OnUpdate(core_timing); sleep_button->OnUpdate(core_timing); capture_button->OnUpdate(core_timing); - xpad->OnUpdate(core_timing); } void ResourceManager::UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) { -- cgit v1.2.3