summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Narr the Reg2024-01-31 18:46:06 -0600
committerGravatar Narr the Reg2024-02-01 10:37:44 -0600
commit818721d12d04f3a9cdf98e9cc31deae171ce6f7e (patch)
tree562a15e9da80eb96d5935d962820c0c9b116ac08
parentMerge pull request #12878 from zhaobot/tx-update-20240201020554 (diff)
downloadyuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.tar.gz
yuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.tar.xz
yuzu-818721d12d04f3a9cdf98e9cc31deae171ce6f7e.zip
service: hid: Multiple fixes
-rw-r--r--src/hid_core/resource_manager.cpp88
-rw-r--r--src/hid_core/resource_manager.h9
-rw-r--r--src/hid_core/resources/digitizer/digitizer.cpp4
-rw-r--r--src/hid_core/resources/digitizer/digitizer.h3
-rw-r--r--src/hid_core/resources/npad/npad.cpp18
-rw-r--r--src/hid_core/resources/npad/npad.h1
-rw-r--r--src/hid_core/resources/unique_pad/unique_pad.cpp4
-rw-r--r--src/hid_core/resources/unique_pad/unique_pad.h3
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
57ResourceManager::~ResourceManager() { 86ResourceManager::~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
219void ResourceManager::InitializeTouchScreenSampler() { 261void 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
512IAppletResource::~IAppletResource() { 512IAppletResource::~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:
179private: 183private:
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() {}
17void Digitizer::OnRelease() {} 17void Digitizer::OnRelease() {}
18 18
19void Digitizer::OnUpdate(const Core::Timing::CoreTiming& core_timing) { 19void 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
24private:
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() {}
17void UniquePad::OnRelease() {} 17void UniquePad::OnRelease() {}
18 18
19void UniquePad::OnUpdate(const Core::Timing::CoreTiming& core_timing) { 19void 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
24private:
25 bool smart_update{};
26}; 23};
27} // namespace Service::HID 24} // namespace Service::HID