diff options
| author | JMC47 <JMC4789@gmail.com> | 2026-03-28 16:19:28 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-28 16:19:28 -0400 |
| commit | 67f1afeb745731b9867dd710d91121b6c10aeec0 (patch) | |
| tree | 877aa9c3dba3f27abec933e4b786580769155829 /Source/Core | |
| parent | 14965a5ec0fdd7d5a51317dc2fba88312f099765 (diff) | |
| parent | c658e7678b0032ec764ed961b6d716843eebae49 (diff) | |
Merge pull request #14517 from jordan-woyak/event-functor
CoreTiming: Change TimedCallback to a Common::MoveOnlyFunction.
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/CoreTiming.cpp | 2 | ||||
| -rw-r--r-- | Source/Core/Core/CoreTiming.h | 4 | ||||
| -rw-r--r-- | Source/Core/Core/HW/SI/SI.cpp | 22 | ||||
| -rw-r--r-- | Source/Core/Core/HW/SI/SI.h | 2 |
4 files changed, 11 insertions, 19 deletions
diff --git a/Source/Core/Core/CoreTiming.cpp b/Source/Core/Core/CoreTiming.cpp index 9e45a7c387..18e86f11e0 100644 --- a/Source/Core/Core/CoreTiming.cpp +++ b/Source/Core/Core/CoreTiming.cpp @@ -70,7 +70,7 @@ EventType* CoreTimingManager::RegisterEvent(const std::string& name, TimedCallba "during Init to avoid breaking save states.", name); - auto info = m_event_types.emplace(name, EventType{callback, nullptr}); + auto info = m_event_types.emplace(name, EventType{std::move(callback), nullptr}); EventType* event_type = &info.first->second; event_type->name = &info.first->first; return event_type; diff --git a/Source/Core/Core/CoreTiming.h b/Source/Core/Core/CoreTiming.h index 68d1fd4fd2..29d636e433 100644 --- a/Source/Core/Core/CoreTiming.h +++ b/Source/Core/Core/CoreTiming.h @@ -23,6 +23,7 @@ #include <vector> #include "Common/CommonTypes.h" +#include "Common/Functional.h" #include "Common/HookableEvent.h" #include "Common/SPSCQueue.h" #include "Common/Timer.h" @@ -47,7 +48,8 @@ struct Globals float last_OC_factor_inverted = 0.0f; }; -typedef void (*TimedCallback)(Core::System& system, u64 userdata, s64 cyclesLate); +using TimedCallback = + Common::MoveOnlyFunction<void(Core::System& system, u64 userdata, s64 cyclesLate)>; struct EventType { diff --git a/Source/Core/Core/HW/SI/SI.cpp b/Source/Core/Core/HW/SI/SI.cpp index f451be328d..11e0c6f2e7 100644 --- a/Source/Core/Core/HW/SI/SI.cpp +++ b/Source/Core/Core/HW/SI/SI.cpp @@ -228,29 +228,21 @@ void SerialInterfaceManager::DoState(PointerWrap& p) p.Do(m_si_buffer); } -template <int device_number> -void SerialInterfaceManager::DeviceEventCallback(Core::System& system, u64 userdata, s64 cyclesLate) -{ - const auto& si = system.GetSerialInterface(); - si.m_channel[device_number].device->OnEvent(userdata, cyclesLate); -} - void SerialInterfaceManager::RegisterEvents() { auto& core_timing = m_system.GetCoreTiming(); + m_event_type_change_device = core_timing.RegisterEvent("ChangeSIDevice", ChangeDeviceCallback); m_event_type_tranfer_pending = core_timing.RegisterEvent("SITransferPending", GlobalRunSIBuffer); - constexpr std::array<CoreTiming::TimedCallback, MAX_SI_CHANNELS> event_callbacks = { - DeviceEventCallback<0>, - DeviceEventCallback<1>, - DeviceEventCallback<2>, - DeviceEventCallback<3>, - }; - for (int i = 0; i < MAX_SI_CHANNELS; ++i) + for (u32 i = 0; i != MAX_SI_CHANNELS; ++i) { + auto& channel = m_channel[i]; m_event_types_device[i] = - core_timing.RegisterEvent(fmt::format("SIEventChannel{}", i), event_callbacks[i]); + core_timing.RegisterEvent(fmt::format("SIEventChannel{}", i), + [&channel](Core::System&, u64 user_data, s64 cycles_late) { + channel.device->OnEvent(user_data, cycles_late); + }); } } diff --git a/Source/Core/Core/HW/SI/SI.h b/Source/Core/Core/HW/SI/SI.h index 8e2e3afe3b..5229bd045f 100644 --- a/Source/Core/Core/HW/SI/SI.h +++ b/Source/Core/Core/HW/SI/SI.h @@ -88,8 +88,6 @@ private: void RunSIBuffer(u64 user_data, s64 cycles_late); static void GlobalRunSIBuffer(Core::System& system, u64 user_data, s64 cycles_late); static void ChangeDeviceCallback(Core::System& system, u64 user_data, s64 cycles_late); - template <int device_number> - static void DeviceEventCallback(Core::System& system, u64 userdata, s64 cyclesLate); // SI Channel Output union USIChannelOut |
