diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 32 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 4 |
2 files changed, 30 insertions, 6 deletions
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 79375bd2f..bf28440c6 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -36,8 +36,9 @@ namespace Service::HID { | |||
| 36 | 36 | ||
| 37 | // Updating period for each HID device. | 37 | // Updating period for each HID device. |
| 38 | // Period time is obtained by measuring the number of samples in a second on HW using a homebrew | 38 | // Period time is obtained by measuring the number of samples in a second on HW using a homebrew |
| 39 | // Correct pad_update_ns is 4ms this is overclocked to lower input lag | 39 | // Correct npad_update_ns is 4ms this is overclocked to lower input lag |
| 40 | constexpr auto pad_update_ns = std::chrono::nanoseconds{1 * 1000 * 1000}; // (1ms, 1000Hz) | 40 | constexpr auto npad_update_ns = std::chrono::nanoseconds{1 * 1000 * 1000}; // (1ms, 1000Hz) |
| 41 | constexpr auto default_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 1000Hz) | ||
| 41 | constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz) | 42 | constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz) |
| 42 | constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz) | 43 | constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz) |
| 43 | 44 | ||
| @@ -75,11 +76,19 @@ IAppletResource::IAppletResource(Core::System& system_, | |||
| 75 | GetController<Controller_Stubbed>(HidController::UniquePad).SetCommonHeaderOffset(0x5A00); | 76 | GetController<Controller_Stubbed>(HidController::UniquePad).SetCommonHeaderOffset(0x5A00); |
| 76 | 77 | ||
| 77 | // Register update callbacks | 78 | // Register update callbacks |
| 78 | pad_update_event = Core::Timing::CreateEvent( | 79 | npad_update_event = Core::Timing::CreateEvent( |
| 79 | "HID::UpdatePadCallback", | 80 | "HID::UpdatePadCallback", |
| 80 | [this](std::uintptr_t user_data, s64 time, | 81 | [this](std::uintptr_t user_data, s64 time, |
| 81 | std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | 82 | std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { |
| 82 | const auto guard = LockService(); | 83 | const auto guard = LockService(); |
| 84 | UpdateNpad(user_data, ns_late); | ||
| 85 | return std::nullopt; | ||
| 86 | }); | ||
| 87 | default_update_event = Core::Timing::CreateEvent( | ||
| 88 | "HID::UpdateDefaultCallback", | ||
| 89 | [this](std::uintptr_t user_data, s64 time, | ||
| 90 | std::chrono::nanoseconds ns_late) -> std::optional<std::chrono::nanoseconds> { | ||
| 91 | const auto guard = LockService(); | ||
| 83 | UpdateControllers(user_data, ns_late); | 92 | UpdateControllers(user_data, ns_late); |
| 84 | return std::nullopt; | 93 | return std::nullopt; |
| 85 | }); | 94 | }); |
| @@ -100,7 +109,9 @@ IAppletResource::IAppletResource(Core::System& system_, | |||
| 100 | return std::nullopt; | 109 | return std::nullopt; |
| 101 | }); | 110 | }); |
| 102 | 111 | ||
| 103 | system.CoreTiming().ScheduleLoopingEvent(pad_update_ns, pad_update_ns, pad_update_event); | 112 | system.CoreTiming().ScheduleLoopingEvent(npad_update_ns, npad_update_ns, npad_update_event); |
| 113 | system.CoreTiming().ScheduleLoopingEvent(default_update_ns, default_update_ns, | ||
| 114 | default_update_event); | ||
| 104 | system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns, | 115 | system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns, |
| 105 | mouse_keyboard_update_event); | 116 | mouse_keyboard_update_event); |
| 106 | system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns, | 117 | system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns, |
| @@ -118,7 +129,8 @@ void IAppletResource::DeactivateController(HidController controller) { | |||
| 118 | } | 129 | } |
| 119 | 130 | ||
| 120 | IAppletResource::~IAppletResource() { | 131 | IAppletResource::~IAppletResource() { |
| 121 | system.CoreTiming().UnscheduleEvent(pad_update_event, 0); | 132 | system.CoreTiming().UnscheduleEvent(npad_update_event, 0); |
| 133 | system.CoreTiming().UnscheduleEvent(default_update_event, 0); | ||
| 122 | system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event, 0); | 134 | system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event, 0); |
| 123 | system.CoreTiming().UnscheduleEvent(motion_update_event, 0); | 135 | system.CoreTiming().UnscheduleEvent(motion_update_event, 0); |
| 124 | } | 136 | } |
| @@ -144,10 +156,20 @@ void IAppletResource::UpdateControllers(std::uintptr_t user_data, | |||
| 144 | if (controller == controllers[static_cast<size_t>(HidController::Mouse)]) { | 156 | if (controller == controllers[static_cast<size_t>(HidController::Mouse)]) { |
| 145 | continue; | 157 | continue; |
| 146 | } | 158 | } |
| 159 | // Npad has it's own update event | ||
| 160 | if (controller == controllers[static_cast<size_t>(HidController::NPad)]) { | ||
| 161 | continue; | ||
| 162 | } | ||
| 147 | controller->OnUpdate(core_timing); | 163 | controller->OnUpdate(core_timing); |
| 148 | } | 164 | } |
| 149 | } | 165 | } |
| 150 | 166 | ||
| 167 | void IAppletResource::UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) { | ||
| 168 | auto& core_timing = system.CoreTiming(); | ||
| 169 | |||
| 170 | controllers[static_cast<size_t>(HidController::NPad)]->OnUpdate(core_timing); | ||
| 171 | } | ||
| 172 | |||
| 151 | void IAppletResource::UpdateMouseKeyboard(std::uintptr_t user_data, | 173 | void IAppletResource::UpdateMouseKeyboard(std::uintptr_t user_data, |
| 152 | std::chrono::nanoseconds ns_late) { | 174 | std::chrono::nanoseconds ns_late) { |
| 153 | auto& core_timing = system.CoreTiming(); | 175 | auto& core_timing = system.CoreTiming(); |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index 340d26fdc..b7c2a23ef 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -71,12 +71,14 @@ private: | |||
| 71 | 71 | ||
| 72 | void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); | 72 | void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); |
| 73 | void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); | 73 | void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); |
| 74 | void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); | ||
| 74 | void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); | 75 | void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); |
| 75 | void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); | 76 | void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); |
| 76 | 77 | ||
| 77 | KernelHelpers::ServiceContext& service_context; | 78 | KernelHelpers::ServiceContext& service_context; |
| 78 | 79 | ||
| 79 | std::shared_ptr<Core::Timing::EventType> pad_update_event; | 80 | std::shared_ptr<Core::Timing::EventType> npad_update_event; |
| 81 | std::shared_ptr<Core::Timing::EventType> default_update_event; | ||
| 80 | std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event; | 82 | std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event; |
| 81 | std::shared_ptr<Core::Timing::EventType> motion_update_event; | 83 | std::shared_ptr<Core::Timing::EventType> motion_update_event; |
| 82 | 84 | ||