diff options
| author | 2024-01-31 18:46:06 -0600 | |
|---|---|---|
| committer | 2024-02-01 10:37:44 -0600 | |
| commit | 818721d12d04f3a9cdf98e9cc31deae171ce6f7e (patch) | |
| tree | 562a15e9da80eb96d5935d962820c0c9b116ac08 | |
| parent | Merge pull request #12878 from zhaobot/tx-update-20240201020554 (diff) | |
| download | yuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.tar.gz yuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.tar.xz yuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.zip | |
service: hid: Multiple fixes
| -rw-r--r-- | src/hid_core/resource_manager.cpp | 88 | ||||
| -rw-r--r-- | src/hid_core/resource_manager.h | 9 | ||||
| -rw-r--r-- | src/hid_core/resources/digitizer/digitizer.cpp | 4 | ||||
| -rw-r--r-- | src/hid_core/resources/digitizer/digitizer.h | 3 | ||||
| -rw-r--r-- | src/hid_core/resources/npad/npad.cpp | 18 | ||||
| -rw-r--r-- | src/hid_core/resources/npad/npad.h | 1 | ||||
| -rw-r--r-- | src/hid_core/resources/unique_pad/unique_pad.cpp | 4 | ||||
| -rw-r--r-- | src/hid_core/resources/unique_pad/unique_pad.h | 3 |
8 files changed, 64 insertions, 66 deletions
diff --git a/src/hid_core/resource_manager.cpp b/src/hid_core/resource_manager.cpp index 68ce2c7ae..245da582e 100644 --- a/src/hid_core/resource_manager.cpp +++ b/src/hid_core/resource_manager.cpp | |||
| @@ -52,9 +52,42 @@ ResourceManager::ResourceManager(Core::System& system_, | |||
| 52 | std::shared_ptr<HidFirmwareSettings> settings) | 52 | std::shared_ptr<HidFirmwareSettings> settings) |
| 53 | : firmware_settings{settings}, system{system_}, service_context{system_, "hid"} { | 53 | : firmware_settings{settings}, system{system_}, service_context{system_, "hid"} { |
| 54 | applet_resource = std::make_shared<AppletResource>(system); | 54 | applet_resource = std::make_shared<AppletResource>(system); |
| 55 | |||
| 56 | // Register update callbacks | ||
| 57 | npad_update_event = Core::Timing::CreateEvent("HID::UpdatePadCallback", | ||
| 58 | [this](s64 time, std::chrono::nanoseconds ns_late) | ||
| 59 | -> std::optional<std::chrono::nanoseconds> { | ||
| 60 | UpdateNpad(ns_late); | ||
| 61 | return std::nullopt; | ||
| 62 | }); | ||
| 63 | default_update_event = Core::Timing::CreateEvent( | ||
| 64 | "HID::UpdateDefaultCallback", | ||
| 65 | [this](s64 time, | ||
| 66 | std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | ||
| 67 | UpdateControllers(ns_late); | ||
| 68 | return std::nullopt; | ||
| 69 | }); | ||
| 70 | mouse_keyboard_update_event = Core::Timing::CreateEvent( | ||
| 71 | "HID::UpdateMouseKeyboardCallback", | ||
| 72 | [this](s64 time, | ||
| 73 | std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | ||
| 74 | UpdateMouseKeyboard(ns_late); | ||
| 75 | return std::nullopt; | ||
| 76 | }); | ||
| 77 | motion_update_event = Core::Timing::CreateEvent( | ||
| 78 | "HID::UpdateMotionCallback", | ||
| 79 | [this](s64 time, | ||
| 80 | std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | ||
| 81 | UpdateMotion(ns_late); | ||
| 82 | return std::nullopt; | ||
| 83 | }); | ||
| 55 | } | 84 | } |
| 56 | 85 | ||
| 57 | ResourceManager::~ResourceManager() { | 86 | ResourceManager::~ResourceManager() { |
| 87 | system.CoreTiming().UnscheduleEvent(npad_update_event); | ||
| 88 | system.CoreTiming().UnscheduleEvent(default_update_event); | ||
| 89 | system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event); | ||
| 90 | system.CoreTiming().UnscheduleEvent(motion_update_event); | ||
| 58 | system.CoreTiming().UnscheduleEvent(touch_update_event); | 91 | system.CoreTiming().UnscheduleEvent(touch_update_event); |
| 59 | input_event->Finalize(); | 92 | input_event->Finalize(); |
| 60 | }; | 93 | }; |
| @@ -201,6 +234,7 @@ void ResourceManager::InitializeHidCommonSampler() { | |||
| 201 | 234 | ||
| 202 | debug_pad->SetAppletResource(applet_resource, &shared_mutex); | 235 | debug_pad->SetAppletResource(applet_resource, &shared_mutex); |
| 203 | digitizer->SetAppletResource(applet_resource, &shared_mutex); | 236 | digitizer->SetAppletResource(applet_resource, &shared_mutex); |
| 237 | unique_pad->SetAppletResource(applet_resource, &shared_mutex); | ||
| 204 | keyboard->SetAppletResource(applet_resource, &shared_mutex); | 238 | keyboard->SetAppletResource(applet_resource, &shared_mutex); |
| 205 | 239 | ||
| 206 | const auto settings = | 240 | const auto settings = |
| @@ -214,6 +248,14 @@ void ResourceManager::InitializeHidCommonSampler() { | |||
| 214 | home_button->SetAppletResource(applet_resource, &shared_mutex); | 248 | home_button->SetAppletResource(applet_resource, &shared_mutex); |
| 215 | sleep_button->SetAppletResource(applet_resource, &shared_mutex); | 249 | sleep_button->SetAppletResource(applet_resource, &shared_mutex); |
| 216 | capture_button->SetAppletResource(applet_resource, &shared_mutex); | 250 | capture_button->SetAppletResource(applet_resource, &shared_mutex); |
| 251 | |||
| 252 | system.CoreTiming().ScheduleLoopingEvent(npad_update_ns, npad_update_ns, npad_update_event); | ||
| 253 | system.CoreTiming().ScheduleLoopingEvent(default_update_ns, default_update_ns, | ||
| 254 | default_update_event); | ||
| 255 | system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns, | ||
| 256 | mouse_keyboard_update_event); | ||
| 257 | system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns, | ||
| 258 | motion_update_event); | ||
| 217 | } | 259 | } |
| 218 | 260 | ||
| 219 | void ResourceManager::InitializeTouchScreenSampler() { | 261 | void ResourceManager::InitializeTouchScreenSampler() { |
| @@ -465,55 +507,9 @@ IAppletResource::IAppletResource(Core::System& system_, std::shared_ptr<Resource | |||
| 465 | {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"}, | 507 | {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"}, |
| 466 | }; | 508 | }; |
| 467 | RegisterHandlers(functions); | 509 | RegisterHandlers(functions); |
| 468 | |||
| 469 | // Register update callbacks | ||
| 470 | npad_update_event = Core::Timing::CreateEvent( | ||
| 471 | "HID::UpdatePadCallback", | ||
| 472 | [this, resource]( | ||
| 473 | s64 time, std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | ||
| 474 | const auto guard = LockService(); | ||
| 475 | resource->UpdateNpad(ns_late); | ||
| 476 | return std::nullopt; | ||
| 477 | }); | ||
| 478 | default_update_event = Core::Timing::CreateEvent( | ||
| 479 | "HID::UpdateDefaultCallback", | ||
| 480 | [this, resource]( | ||
| 481 | s64 time, std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | ||
| 482 | const auto guard = LockService(); | ||
| 483 | resource->UpdateControllers(ns_late); | ||
| 484 | return std::nullopt; | ||
| 485 | }); | ||
| 486 | mouse_keyboard_update_event = Core::Timing::CreateEvent( | ||
| 487 | "HID::UpdateMouseKeyboardCallback", | ||
| 488 | [this, resource]( | ||
| 489 | s64 time, std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | ||
| 490 | const auto guard = LockService(); | ||
| 491 | resource->UpdateMouseKeyboard(ns_late); | ||
| 492 | return std::nullopt; | ||
| 493 | }); | ||
| 494 | motion_update_event = Core::Timing::CreateEvent( | ||
| 495 | "HID::UpdateMotionCallback", | ||
| 496 | [this, resource]( | ||
| 497 | s64 time, std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | ||
| 498 | const auto guard = LockService(); | ||
| 499 | resource->UpdateMotion(ns_late); | ||
| 500 | return std::nullopt; | ||
| 501 | }); | ||
| 502 | |||
| 503 | system.CoreTiming().ScheduleLoopingEvent(npad_update_ns, npad_update_ns, npad_update_event); | ||
| 504 | system.CoreTiming().ScheduleLoopingEvent(default_update_ns, default_update_ns, | ||
| 505 | default_update_event); | ||
| 506 | system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns, | ||
| 507 | mouse_keyboard_update_event); | ||
| 508 | system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns, | ||
| 509 | motion_update_event); | ||
| 510 | } | 510 | } |
| 511 | 511 | ||
| 512 | IAppletResource::~IAppletResource() { | 512 | IAppletResource::~IAppletResource() { |
| 513 | system.CoreTiming().UnscheduleEvent(npad_update_event); | ||
| 514 | system.CoreTiming().UnscheduleEvent(default_update_event); | ||
| 515 | system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event); | ||
| 516 | system.CoreTiming().UnscheduleEvent(motion_update_event); | ||
| 517 | resource_manager->FreeAppletResourceId(aruid); | 513 | resource_manager->FreeAppletResourceId(aruid); |
| 518 | } | 514 | } |
| 519 | 515 | ||
diff --git a/src/hid_core/resource_manager.h b/src/hid_core/resource_manager.h index 0bfe09511..dc3ff01f8 100644 --- a/src/hid_core/resource_manager.h +++ b/src/hid_core/resource_manager.h | |||
| @@ -147,6 +147,10 @@ private: | |||
| 147 | std::shared_ptr<SixAxis> six_axis{nullptr}; | 147 | std::shared_ptr<SixAxis> six_axis{nullptr}; |
| 148 | std::shared_ptr<SleepButton> sleep_button{nullptr}; | 148 | std::shared_ptr<SleepButton> sleep_button{nullptr}; |
| 149 | std::shared_ptr<UniquePad> unique_pad{nullptr}; | 149 | std::shared_ptr<UniquePad> unique_pad{nullptr}; |
| 150 | std::shared_ptr<Core::Timing::EventType> npad_update_event; | ||
| 151 | std::shared_ptr<Core::Timing::EventType> default_update_event; | ||
| 152 | std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event; | ||
| 153 | std::shared_ptr<Core::Timing::EventType> motion_update_event; | ||
| 150 | 154 | ||
| 151 | // TODO: Create these resources | 155 | // TODO: Create these resources |
| 152 | // std::shared_ptr<AudioControl> audio_control{nullptr}; | 156 | // std::shared_ptr<AudioControl> audio_control{nullptr}; |
| @@ -179,11 +183,6 @@ public: | |||
| 179 | private: | 183 | private: |
| 180 | void GetSharedMemoryHandle(HLERequestContext& ctx); | 184 | void GetSharedMemoryHandle(HLERequestContext& ctx); |
| 181 | 185 | ||
| 182 | std::shared_ptr<Core::Timing::EventType> npad_update_event{nullptr}; | ||
| 183 | std::shared_ptr<Core::Timing::EventType> default_update_event{nullptr}; | ||
| 184 | std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event{nullptr}; | ||
| 185 | std::shared_ptr<Core::Timing::EventType> motion_update_event{nullptr}; | ||
| 186 | |||
| 187 | u64 aruid{}; | 186 | u64 aruid{}; |
| 188 | std::shared_ptr<ResourceManager> resource_manager; | 187 | std::shared_ptr<ResourceManager> resource_manager; |
| 189 | }; | 188 | }; |
diff --git a/src/hid_core/resources/digitizer/digitizer.cpp b/src/hid_core/resources/digitizer/digitizer.cpp index cd72fd6e5..5d7dcadfe 100644 --- a/src/hid_core/resources/digitizer/digitizer.cpp +++ b/src/hid_core/resources/digitizer/digitizer.cpp | |||
| @@ -17,10 +17,6 @@ void Digitizer::OnInit() {} | |||
| 17 | void Digitizer::OnRelease() {} | 17 | void Digitizer::OnRelease() {} |
| 18 | 18 | ||
| 19 | void Digitizer::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | 19 | void Digitizer::OnUpdate(const Core::Timing::CoreTiming& core_timing) { |
| 20 | if (!smart_update) { | ||
| 21 | return; | ||
| 22 | } | ||
| 23 | |||
| 24 | std::scoped_lock shared_lock{*shared_mutex}; | 20 | std::scoped_lock shared_lock{*shared_mutex}; |
| 25 | const u64 aruid = applet_resource->GetActiveAruid(); | 21 | const u64 aruid = applet_resource->GetActiveAruid(); |
| 26 | auto* data = applet_resource->GetAruidData(aruid); | 22 | auto* data = applet_resource->GetAruidData(aruid); |
diff --git a/src/hid_core/resources/digitizer/digitizer.h b/src/hid_core/resources/digitizer/digitizer.h index e031a16b0..68b03111c 100644 --- a/src/hid_core/resources/digitizer/digitizer.h +++ b/src/hid_core/resources/digitizer/digitizer.h | |||
| @@ -20,8 +20,5 @@ public: | |||
| 20 | 20 | ||
| 21 | // When the controller is requesting an update for the shared memory | 21 | // When the controller is requesting an update for the shared memory |
| 22 | void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | 22 | void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; |
| 23 | |||
| 24 | private: | ||
| 25 | bool smart_update{}; | ||
| 26 | }; | 23 | }; |
| 27 | } // namespace Service::HID | 24 | } // namespace Service::HID |
diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index 1a58eff4a..fe3fdc5cd 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp | |||
| @@ -102,6 +102,8 @@ Result NPad::Activate(u64 aruid) { | |||
| 102 | for (std::size_t i = 0; i < 19; ++i) { | 102 | for (std::size_t i = 0; i < 19; ++i) { |
| 103 | WriteEmptyEntry(npad); | 103 | WriteEmptyEntry(npad); |
| 104 | } | 104 | } |
| 105 | |||
| 106 | controller.is_active = true; | ||
| 105 | } | 107 | } |
| 106 | 108 | ||
| 107 | return ResultSuccess; | 109 | return ResultSuccess; |
| @@ -467,6 +469,13 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||
| 467 | continue; | 469 | continue; |
| 468 | } | 470 | } |
| 469 | 471 | ||
| 472 | bool is_set{}; | ||
| 473 | npad_resource.IsSupportedNpadStyleSet(is_set, aruid); | ||
| 474 | // Wait until style is defined | ||
| 475 | if (!is_set) { | ||
| 476 | continue; | ||
| 477 | } | ||
| 478 | |||
| 470 | for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { | 479 | for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { |
| 471 | auto& controller = controller_data[aruid_index][i]; | 480 | auto& controller = controller_data[aruid_index][i]; |
| 472 | controller.shared_memory = | 481 | controller.shared_memory = |
| @@ -484,6 +493,10 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||
| 484 | continue; | 493 | continue; |
| 485 | } | 494 | } |
| 486 | 495 | ||
| 496 | if (!controller.is_active) { | ||
| 497 | continue; | ||
| 498 | } | ||
| 499 | |||
| 487 | RequestPadStateUpdate(aruid, controller.device->GetNpadIdType()); | 500 | RequestPadStateUpdate(aruid, controller.device->GetNpadIdType()); |
| 488 | auto& pad_state = controller.npad_pad_state; | 501 | auto& pad_state = controller.npad_pad_state; |
| 489 | auto& libnx_state = controller.npad_libnx_state; | 502 | auto& libnx_state = controller.npad_libnx_state; |
| @@ -592,7 +605,9 @@ void NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | |||
| 592 | libnx_state.npad_buttons.raw = pad_state.npad_buttons.raw; | 605 | libnx_state.npad_buttons.raw = pad_state.npad_buttons.raw; |
| 593 | libnx_state.l_stick = pad_state.l_stick; | 606 | libnx_state.l_stick = pad_state.l_stick; |
| 594 | libnx_state.r_stick = pad_state.r_stick; | 607 | libnx_state.r_stick = pad_state.r_stick; |
| 595 | npad->system_ext_lifo.WriteNextEntry(pad_state); | 608 | libnx_state.sampling_number = |
| 609 | npad->system_ext_lifo.ReadCurrentEntry().state.sampling_number + 1; | ||
| 610 | npad->system_ext_lifo.WriteNextEntry(libnx_state); | ||
| 596 | 611 | ||
| 597 | press_state |= static_cast<u64>(pad_state.npad_buttons.raw); | 612 | press_state |= static_cast<u64>(pad_state.npad_buttons.raw); |
| 598 | } | 613 | } |
| @@ -1060,6 +1075,7 @@ void NPad::UnregisterAppletResourceUserId(u64 aruid) { | |||
| 1060 | // TODO: Remove this once abstract pad is emulated properly | 1075 | // TODO: Remove this once abstract pad is emulated properly |
| 1061 | const auto aruid_index = npad_resource.GetIndexFromAruid(aruid); | 1076 | const auto aruid_index = npad_resource.GetIndexFromAruid(aruid); |
| 1062 | for (auto& controller : controller_data[aruid_index]) { | 1077 | for (auto& controller : controller_data[aruid_index]) { |
| 1078 | controller.is_active = false; | ||
| 1063 | controller.is_connected = false; | 1079 | controller.is_connected = false; |
| 1064 | controller.shared_memory = nullptr; | 1080 | controller.shared_memory = nullptr; |
| 1065 | } | 1081 | } |
diff --git a/src/hid_core/resources/npad/npad.h b/src/hid_core/resources/npad/npad.h index 4e26ed2e8..c63488346 100644 --- a/src/hid_core/resources/npad/npad.h +++ b/src/hid_core/resources/npad/npad.h | |||
| @@ -164,6 +164,7 @@ private: | |||
| 164 | NpadInternalState* shared_memory = nullptr; | 164 | NpadInternalState* shared_memory = nullptr; |
| 165 | Core::HID::EmulatedController* device = nullptr; | 165 | Core::HID::EmulatedController* device = nullptr; |
| 166 | 166 | ||
| 167 | bool is_active{}; | ||
| 167 | bool is_connected{}; | 168 | bool is_connected{}; |
| 168 | 169 | ||
| 169 | // Dual joycons can have only one side connected | 170 | // Dual joycons can have only one side connected |
diff --git a/src/hid_core/resources/unique_pad/unique_pad.cpp b/src/hid_core/resources/unique_pad/unique_pad.cpp index 89fc57269..b2db55c5a 100644 --- a/src/hid_core/resources/unique_pad/unique_pad.cpp +++ b/src/hid_core/resources/unique_pad/unique_pad.cpp | |||
| @@ -17,10 +17,6 @@ void UniquePad::OnInit() {} | |||
| 17 | void UniquePad::OnRelease() {} | 17 | void UniquePad::OnRelease() {} |
| 18 | 18 | ||
| 19 | void UniquePad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | 19 | void UniquePad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { |
| 20 | if (!smart_update) { | ||
| 21 | return; | ||
| 22 | } | ||
| 23 | |||
| 24 | const u64 aruid = applet_resource->GetActiveAruid(); | 20 | const u64 aruid = applet_resource->GetActiveAruid(); |
| 25 | auto* data = applet_resource->GetAruidData(aruid); | 21 | auto* data = applet_resource->GetAruidData(aruid); |
| 26 | 22 | ||
diff --git a/src/hid_core/resources/unique_pad/unique_pad.h b/src/hid_core/resources/unique_pad/unique_pad.h index 674ad1691..4873b7f7e 100644 --- a/src/hid_core/resources/unique_pad/unique_pad.h +++ b/src/hid_core/resources/unique_pad/unique_pad.h | |||
| @@ -20,8 +20,5 @@ public: | |||
| 20 | 20 | ||
| 21 | // When the controller is requesting an update for the shared memory | 21 | // When the controller is requesting an update for the shared memory |
| 22 | void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | 22 | void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; |
| 23 | |||
| 24 | private: | ||
| 25 | bool smart_update{}; | ||
| 26 | }; | 23 | }; |
| 27 | } // namespace Service::HID | 24 | } // namespace Service::HID |