diff options
| author | 2019-09-22 10:06:48 -0400 | |
|---|---|---|
| committer | 2019-09-22 10:06:48 -0400 | |
| commit | b835d7631102fbf2a20e916d06e9a672425f3dbf (patch) | |
| tree | a238cb84cbbbdf1b048e3478c76fb3f36a72a1b9 | |
| parent | Merge pull request #2877 from ogniK5377/framecount-rev7 (diff) | |
| parent | removed comment (diff) | |
| download | yuzu-b835d7631102fbf2a20e916d06e9a672425f3dbf.tar.gz yuzu-b835d7631102fbf2a20e916d06e9a672425f3dbf.tar.xz yuzu-b835d7631102fbf2a20e916d06e9a672425f3dbf.zip | |
Merge pull request #2876 from ogniK5377/AcquireNpadStyleSetUpdateEventHandle-fix
AcquireNpadStyleSetUpdateEventHandle should have a separate event for each controller type
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.h | 5 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 2 |
3 files changed, 18 insertions, 11 deletions
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index f7a0aa4ff..44b668fbf 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -169,8 +169,10 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { | |||
| 169 | 169 | ||
| 170 | void Controller_NPad::OnInit() { | 170 | void Controller_NPad::OnInit() { |
| 171 | auto& kernel = system.Kernel(); | 171 | auto& kernel = system.Kernel(); |
| 172 | styleset_changed_event = Kernel::WritableEvent::CreateEventPair( | 172 | for (std::size_t i = 0; i < styleset_changed_events.size(); i++) { |
| 173 | kernel, Kernel::ResetType::Automatic, "npad:NpadStyleSetChanged"); | 173 | styleset_changed_events[i] = Kernel::WritableEvent::CreateEventPair( |
| 174 | kernel, Kernel::ResetType::Automatic, fmt::format("npad:NpadStyleSetChanged_{}", i)); | ||
| 175 | } | ||
| 174 | 176 | ||
| 175 | if (!IsControllerActivated()) { | 177 | if (!IsControllerActivated()) { |
| 176 | return; | 178 | return; |
| @@ -453,7 +455,7 @@ void Controller_NPad::SetSupportedNPadIdTypes(u8* data, std::size_t length) { | |||
| 453 | had_controller_update = true; | 455 | had_controller_update = true; |
| 454 | } | 456 | } |
| 455 | if (had_controller_update) { | 457 | if (had_controller_update) { |
| 456 | styleset_changed_event.writable->Signal(); | 458 | styleset_changed_events[i].writable->Signal(); |
| 457 | } | 459 | } |
| 458 | } | 460 | } |
| 459 | } | 461 | } |
| @@ -468,7 +470,6 @@ std::size_t Controller_NPad::GetSupportedNPadIdTypesSize() const { | |||
| 468 | } | 470 | } |
| 469 | 471 | ||
| 470 | void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) { | 472 | void Controller_NPad::SetHoldType(NpadHoldType joy_hold_type) { |
| 471 | styleset_changed_event.writable->Signal(); | ||
| 472 | hold_type = joy_hold_type; | 473 | hold_type = joy_hold_type; |
| 473 | } | 474 | } |
| 474 | 475 | ||
| @@ -479,7 +480,10 @@ Controller_NPad::NpadHoldType Controller_NPad::GetHoldType() const { | |||
| 479 | void Controller_NPad::SetNpadMode(u32 npad_id, NPadAssignments assignment_mode) { | 480 | void Controller_NPad::SetNpadMode(u32 npad_id, NPadAssignments assignment_mode) { |
| 480 | const std::size_t npad_index = NPadIdToIndex(npad_id); | 481 | const std::size_t npad_index = NPadIdToIndex(npad_id); |
| 481 | ASSERT(npad_index < shared_memory_entries.size()); | 482 | ASSERT(npad_index < shared_memory_entries.size()); |
| 482 | shared_memory_entries[npad_index].pad_assignment = assignment_mode; | 483 | if (shared_memory_entries[npad_index].pad_assignment != assignment_mode) { |
| 484 | styleset_changed_events[npad_index].writable->Signal(); | ||
| 485 | shared_memory_entries[npad_index].pad_assignment = assignment_mode; | ||
| 486 | } | ||
| 483 | } | 487 | } |
| 484 | 488 | ||
| 485 | void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, | 489 | void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, |
| @@ -498,11 +502,13 @@ void Controller_NPad::VibrateController(const std::vector<u32>& controller_ids, | |||
| 498 | last_processed_vibration = vibrations.back(); | 502 | last_processed_vibration = vibrations.back(); |
| 499 | } | 503 | } |
| 500 | 504 | ||
| 501 | Kernel::SharedPtr<Kernel::ReadableEvent> Controller_NPad::GetStyleSetChangedEvent() const { | 505 | Kernel::SharedPtr<Kernel::ReadableEvent> Controller_NPad::GetStyleSetChangedEvent( |
| 506 | u32 npad_id) const { | ||
| 502 | // TODO(ogniK): Figure out the best time to signal this event. This event seems that it should | 507 | // TODO(ogniK): Figure out the best time to signal this event. This event seems that it should |
| 503 | // be signalled at least once, and signaled after a new controller is connected? | 508 | // be signalled at least once, and signaled after a new controller is connected? |
| 504 | styleset_changed_event.writable->Signal(); | 509 | const auto& styleset_event = styleset_changed_events[NPadIdToIndex(npad_id)]; |
| 505 | return styleset_changed_event.readable; | 510 | styleset_event.writable->Signal(); |
| 511 | return styleset_event.readable; | ||
| 506 | } | 512 | } |
| 507 | 513 | ||
| 508 | Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { | 514 | Controller_NPad::Vibration Controller_NPad::GetLastVibration() const { |
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index f72a9900c..1bc3d55d6 100644 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h | |||
| @@ -109,7 +109,7 @@ public: | |||
| 109 | void VibrateController(const std::vector<u32>& controller_ids, | 109 | void VibrateController(const std::vector<u32>& controller_ids, |
| 110 | const std::vector<Vibration>& vibrations); | 110 | const std::vector<Vibration>& vibrations); |
| 111 | 111 | ||
| 112 | Kernel::SharedPtr<Kernel::ReadableEvent> GetStyleSetChangedEvent() const; | 112 | Kernel::SharedPtr<Kernel::ReadableEvent> GetStyleSetChangedEvent(u32 npad_id) const; |
| 113 | Vibration GetLastVibration() const; | 113 | Vibration GetLastVibration() const; |
| 114 | 114 | ||
| 115 | void AddNewController(NPadControllerType controller); | 115 | void AddNewController(NPadControllerType controller); |
| @@ -315,7 +315,8 @@ private: | |||
| 315 | sticks; | 315 | sticks; |
| 316 | std::vector<u32> supported_npad_id_types{}; | 316 | std::vector<u32> supported_npad_id_types{}; |
| 317 | NpadHoldType hold_type{NpadHoldType::Vertical}; | 317 | NpadHoldType hold_type{NpadHoldType::Vertical}; |
| 318 | Kernel::EventPair styleset_changed_event; | 318 | // Each controller should have their own styleset changed event |
| 319 | std::array<Kernel::EventPair, 10> styleset_changed_events; | ||
| 319 | Vibration last_processed_vibration{}; | 320 | Vibration last_processed_vibration{}; |
| 320 | std::array<ControllerHolder, 10> connected_controllers{}; | 321 | std::array<ControllerHolder, 10> connected_controllers{}; |
| 321 | bool can_controllers_vibrate{true}; | 322 | bool can_controllers_vibrate{true}; |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 33145b891..8d76ba746 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -480,7 +480,7 @@ void Hid::AcquireNpadStyleSetUpdateEventHandle(Kernel::HLERequestContext& ctx) { | |||
| 480 | IPC::ResponseBuilder rb{ctx, 2, 1}; | 480 | IPC::ResponseBuilder rb{ctx, 2, 1}; |
| 481 | rb.Push(RESULT_SUCCESS); | 481 | rb.Push(RESULT_SUCCESS); |
| 482 | rb.PushCopyObjects(applet_resource->GetController<Controller_NPad>(HidController::NPad) | 482 | rb.PushCopyObjects(applet_resource->GetController<Controller_NPad>(HidController::NPad) |
| 483 | .GetStyleSetChangedEvent()); | 483 | .GetStyleSetChangedEvent(npad_id)); |
| 484 | } | 484 | } |
| 485 | 485 | ||
| 486 | void Hid::DisconnectNpad(Kernel::HLERequestContext& ctx) { | 486 | void Hid::DisconnectNpad(Kernel::HLERequestContext& ctx) { |