diff options
| author | 2021-11-14 21:28:38 -0600 | |
|---|---|---|
| committer | 2021-11-24 20:30:28 -0600 | |
| commit | f4e5f89e6fb9d68cd4ba7d98c281584c50f0e149 (patch) | |
| tree | 9e9f9114d9b7528e74e78102279411595632f048 /src/core/hle | |
| parent | core/hid: Fully implement native mouse (diff) | |
| download | yuzu-f4e5f89e6fb9d68cd4ba7d98c281584c50f0e149.tar.gz yuzu-f4e5f89e6fb9d68cd4ba7d98c281584c50f0e149.tar.xz yuzu-f4e5f89e6fb9d68cd4ba7d98c281584c50f0e149.zip | |
core/hid: Improve accuary of mouse implementation
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/hid/controllers/keyboard.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/keyboard.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/mouse.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/mouse.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 29 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 4 |
6 files changed, 28 insertions, 18 deletions
diff --git a/src/core/hle/service/hid/controllers/keyboard.cpp b/src/core/hle/service/hid/controllers/keyboard.cpp index 0ef8af0e6..9588a6910 100644 --- a/src/core/hle/service/hid/controllers/keyboard.cpp +++ b/src/core/hle/service/hid/controllers/keyboard.cpp | |||
| @@ -42,8 +42,7 @@ void Controller_Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing, | |||
| 42 | 42 | ||
| 43 | next_state.key = keyboard_state; | 43 | next_state.key = keyboard_state; |
| 44 | next_state.modifier = keyboard_modifier_state; | 44 | next_state.modifier = keyboard_modifier_state; |
| 45 | // This is always enabled on HW. Check what it actually does | 45 | next_state.attribute.is_connected.Assign(1); |
| 46 | next_state.modifier.unknown.Assign(1); | ||
| 47 | } | 46 | } |
| 48 | 47 | ||
| 49 | keyboard_lifo.WriteNextEntry(next_state); | 48 | keyboard_lifo.WriteNextEntry(next_state); |
diff --git a/src/core/hle/service/hid/controllers/keyboard.h b/src/core/hle/service/hid/controllers/keyboard.h index ec5dd607c..0d61cb470 100644 --- a/src/core/hle/service/hid/controllers/keyboard.h +++ b/src/core/hle/service/hid/controllers/keyboard.h | |||
| @@ -38,6 +38,7 @@ private: | |||
| 38 | struct KeyboardState { | 38 | struct KeyboardState { |
| 39 | s64 sampling_number; | 39 | s64 sampling_number; |
| 40 | Core::HID::KeyboardModifier modifier; | 40 | Core::HID::KeyboardModifier modifier; |
| 41 | Core::HID::KeyboardAttribute attribute; | ||
| 41 | Core::HID::KeyboardKey key; | 42 | Core::HID::KeyboardKey key; |
| 42 | }; | 43 | }; |
| 43 | static_assert(sizeof(KeyboardState) == 0x30, "KeyboardState is an invalid size"); | 44 | static_assert(sizeof(KeyboardState) == 0x30, "KeyboardState is an invalid size"); |
diff --git a/src/core/hle/service/hid/controllers/mouse.cpp b/src/core/hle/service/hid/controllers/mouse.cpp index 9c408e7f4..ba79888ae 100644 --- a/src/core/hle/service/hid/controllers/mouse.cpp +++ b/src/core/hle/service/hid/controllers/mouse.cpp | |||
| @@ -38,15 +38,16 @@ void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* | |||
| 38 | if (Settings::values.mouse_enabled) { | 38 | if (Settings::values.mouse_enabled) { |
| 39 | const auto& mouse_button_state = emulated_devices->GetMouseButtons(); | 39 | const auto& mouse_button_state = emulated_devices->GetMouseButtons(); |
| 40 | const auto& mouse_position_state = emulated_devices->GetMousePosition(); | 40 | const auto& mouse_position_state = emulated_devices->GetMousePosition(); |
| 41 | const auto& mouse_wheel_state = emulated_devices->GetMouseDeltaWheel(); | 41 | const auto& mouse_wheel_state = emulated_devices->GetMouseWheel(); |
| 42 | next_state.attribute.is_connected.Assign(1); | 42 | next_state.attribute.is_connected.Assign(1); |
| 43 | next_state.x = static_cast<s32>(mouse_position_state.x * Layout::ScreenUndocked::Width); | 43 | next_state.x = static_cast<s32>(mouse_position_state.x * Layout::ScreenUndocked::Width); |
| 44 | next_state.y = static_cast<s32>(mouse_position_state.y * Layout::ScreenUndocked::Height); | 44 | next_state.y = static_cast<s32>(mouse_position_state.y * Layout::ScreenUndocked::Height); |
| 45 | next_state.delta_x = next_state.x - last_entry.x; | 45 | next_state.delta_x = next_state.x - last_entry.x; |
| 46 | next_state.delta_y = next_state.y - last_entry.y; | 46 | next_state.delta_y = next_state.y - last_entry.y; |
| 47 | next_state.delta_wheel_x = mouse_wheel_state.x; | 47 | next_state.delta_wheel_x = mouse_wheel_state.x - last_mouse_wheel_state.x; |
| 48 | next_state.delta_wheel_y = mouse_wheel_state.y; | 48 | next_state.delta_wheel_y = mouse_wheel_state.y - last_mouse_wheel_state.y; |
| 49 | 49 | ||
| 50 | last_mouse_wheel_state = mouse_wheel_state; | ||
| 50 | next_state.button = mouse_button_state; | 51 | next_state.button = mouse_button_state; |
| 51 | } | 52 | } |
| 52 | 53 | ||
diff --git a/src/core/hle/service/hid/controllers/mouse.h b/src/core/hle/service/hid/controllers/mouse.h index 25017f117..1ac69aa6f 100644 --- a/src/core/hle/service/hid/controllers/mouse.h +++ b/src/core/hle/service/hid/controllers/mouse.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | namespace Core::HID { | 14 | namespace Core::HID { |
| 15 | class EmulatedDevices; | 15 | class EmulatedDevices; |
| 16 | struct MouseState; | 16 | struct MouseState; |
| 17 | struct AnalogStickState; | ||
| 17 | } // namespace Core::HID | 18 | } // namespace Core::HID |
| 18 | 19 | ||
| 19 | namespace Service::HID { | 20 | namespace Service::HID { |
| @@ -37,6 +38,7 @@ private: | |||
| 37 | static_assert(sizeof(mouse_lifo) == 0x350, "mouse_lifo is an invalid size"); | 38 | static_assert(sizeof(mouse_lifo) == 0x350, "mouse_lifo is an invalid size"); |
| 38 | Core::HID::MouseState next_state{}; | 39 | Core::HID::MouseState next_state{}; |
| 39 | 40 | ||
| 41 | Core::HID::AnalogStickState last_mouse_wheel_state; | ||
| 40 | Core::HID::EmulatedDevices* emulated_devices; | 42 | Core::HID::EmulatedDevices* emulated_devices; |
| 41 | }; | 43 | }; |
| 42 | } // namespace Service::HID | 44 | } // namespace Service::HID |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index e740b4331..95fc07325 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -35,9 +35,9 @@ namespace Service::HID { | |||
| 35 | 35 | ||
| 36 | // Updating period for each HID device. | 36 | // Updating period for each HID device. |
| 37 | // Period time is obtained by measuring the number of samples in a second on HW using a homebrew | 37 | // Period time is obtained by measuring the number of samples in a second on HW using a homebrew |
| 38 | constexpr auto pad_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 250Hz) | 38 | constexpr auto pad_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 250Hz) |
| 39 | constexpr auto keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz) | 39 | constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz) |
| 40 | constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz) | 40 | constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz) |
| 41 | constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; | 41 | constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; |
| 42 | 42 | ||
| 43 | IAppletResource::IAppletResource(Core::System& system_, | 43 | IAppletResource::IAppletResource(Core::System& system_, |
| @@ -79,11 +79,11 @@ IAppletResource::IAppletResource(Core::System& system_, | |||
| 79 | const auto guard = LockService(); | 79 | const auto guard = LockService(); |
| 80 | UpdateControllers(user_data, ns_late); | 80 | UpdateControllers(user_data, ns_late); |
| 81 | }); | 81 | }); |
| 82 | keyboard_update_event = Core::Timing::CreateEvent( | 82 | mouse_keyboard_update_event = Core::Timing::CreateEvent( |
| 83 | "HID::UpdatekeyboardCallback", | 83 | "HID::UpdateMouseKeyboardCallback", |
| 84 | [this](std::uintptr_t user_data, std::chrono::nanoseconds ns_late) { | 84 | [this](std::uintptr_t user_data, std::chrono::nanoseconds ns_late) { |
| 85 | const auto guard = LockService(); | 85 | const auto guard = LockService(); |
| 86 | UpdateKeyboard(user_data, ns_late); | 86 | UpdateMouseKeyboard(user_data, ns_late); |
| 87 | }); | 87 | }); |
| 88 | motion_update_event = Core::Timing::CreateEvent( | 88 | motion_update_event = Core::Timing::CreateEvent( |
| 89 | "HID::UpdateMotionCallback", | 89 | "HID::UpdateMotionCallback", |
| @@ -93,7 +93,7 @@ IAppletResource::IAppletResource(Core::System& system_, | |||
| 93 | }); | 93 | }); |
| 94 | 94 | ||
| 95 | system.CoreTiming().ScheduleEvent(pad_update_ns, pad_update_event); | 95 | system.CoreTiming().ScheduleEvent(pad_update_ns, pad_update_event); |
| 96 | system.CoreTiming().ScheduleEvent(keyboard_update_ns, keyboard_update_event); | 96 | system.CoreTiming().ScheduleEvent(mouse_keyboard_update_ns, mouse_keyboard_update_event); |
| 97 | system.CoreTiming().ScheduleEvent(motion_update_ns, motion_update_event); | 97 | system.CoreTiming().ScheduleEvent(motion_update_ns, motion_update_event); |
| 98 | 98 | ||
| 99 | system.HIDCore().ReloadInputDevices(); | 99 | system.HIDCore().ReloadInputDevices(); |
| @@ -109,7 +109,7 @@ void IAppletResource::DeactivateController(HidController controller) { | |||
| 109 | 109 | ||
| 110 | IAppletResource::~IAppletResource() { | 110 | IAppletResource::~IAppletResource() { |
| 111 | system.CoreTiming().UnscheduleEvent(pad_update_event, 0); | 111 | system.CoreTiming().UnscheduleEvent(pad_update_event, 0); |
| 112 | system.CoreTiming().UnscheduleEvent(keyboard_update_event, 0); | 112 | system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event, 0); |
| 113 | system.CoreTiming().UnscheduleEvent(motion_update_event, 0); | 113 | system.CoreTiming().UnscheduleEvent(motion_update_event, 0); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| @@ -130,6 +130,10 @@ void IAppletResource::UpdateControllers(std::uintptr_t user_data, | |||
| 130 | if (controller == controllers[static_cast<size_t>(HidController::Keyboard)]) { | 130 | if (controller == controllers[static_cast<size_t>(HidController::Keyboard)]) { |
| 131 | continue; | 131 | continue; |
| 132 | } | 132 | } |
| 133 | // Mouse has it's own update event | ||
| 134 | if (controller == controllers[static_cast<size_t>(HidController::Mouse)]) { | ||
| 135 | continue; | ||
| 136 | } | ||
| 133 | controller->OnUpdate(core_timing, system.Kernel().GetHidSharedMem().GetPointer(), | 137 | controller->OnUpdate(core_timing, system.Kernel().GetHidSharedMem().GetPointer(), |
| 134 | SHARED_MEMORY_SIZE); | 138 | SHARED_MEMORY_SIZE); |
| 135 | } | 139 | } |
| @@ -142,18 +146,21 @@ void IAppletResource::UpdateControllers(std::uintptr_t user_data, | |||
| 142 | core_timing.ScheduleEvent(pad_update_ns - ns_late, pad_update_event); | 146 | core_timing.ScheduleEvent(pad_update_ns - ns_late, pad_update_event); |
| 143 | } | 147 | } |
| 144 | 148 | ||
| 145 | void IAppletResource::UpdateKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) { | 149 | void IAppletResource::UpdateMouseKeyboard(std::uintptr_t user_data, |
| 150 | std::chrono::nanoseconds ns_late) { | ||
| 146 | auto& core_timing = system.CoreTiming(); | 151 | auto& core_timing = system.CoreTiming(); |
| 147 | 152 | ||
| 153 | controllers[static_cast<size_t>(HidController::Mouse)]->OnUpdate( | ||
| 154 | core_timing, system.Kernel().GetHidSharedMem().GetPointer(), SHARED_MEMORY_SIZE); | ||
| 148 | controllers[static_cast<size_t>(HidController::Keyboard)]->OnUpdate( | 155 | controllers[static_cast<size_t>(HidController::Keyboard)]->OnUpdate( |
| 149 | core_timing, system.Kernel().GetHidSharedMem().GetPointer(), SHARED_MEMORY_SIZE); | 156 | core_timing, system.Kernel().GetHidSharedMem().GetPointer(), SHARED_MEMORY_SIZE); |
| 150 | 157 | ||
| 151 | // If ns_late is higher than the update rate ignore the delay | 158 | // If ns_late is higher than the update rate ignore the delay |
| 152 | if (ns_late > keyboard_update_ns) { | 159 | if (ns_late > mouse_keyboard_update_ns) { |
| 153 | ns_late = {}; | 160 | ns_late = {}; |
| 154 | } | 161 | } |
| 155 | 162 | ||
| 156 | core_timing.ScheduleEvent(keyboard_update_ns - ns_late, keyboard_update_event); | 163 | core_timing.ScheduleEvent(mouse_keyboard_update_ns - ns_late, mouse_keyboard_update_event); |
| 157 | } | 164 | } |
| 158 | 165 | ||
| 159 | void IAppletResource::UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) { | 166 | void IAppletResource::UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) { |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index bbad165f8..ab0084118 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -70,13 +70,13 @@ private: | |||
| 70 | 70 | ||
| 71 | void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); | 71 | void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); |
| 72 | void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); | 72 | void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); |
| 73 | void UpdateKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); | 73 | void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); |
| 74 | void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); | 74 | void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late); |
| 75 | 75 | ||
| 76 | KernelHelpers::ServiceContext& service_context; | 76 | KernelHelpers::ServiceContext& service_context; |
| 77 | 77 | ||
| 78 | std::shared_ptr<Core::Timing::EventType> pad_update_event; | 78 | std::shared_ptr<Core::Timing::EventType> pad_update_event; |
| 79 | std::shared_ptr<Core::Timing::EventType> keyboard_update_event; | 79 | std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event; |
| 80 | std::shared_ptr<Core::Timing::EventType> motion_update_event; | 80 | std::shared_ptr<Core::Timing::EventType> motion_update_event; |
| 81 | 81 | ||
| 82 | std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)> | 82 | std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)> |