diff options
Diffstat (limited to '')
| -rw-r--r-- | src/audio_core/stream.cpp | 14 | ||||
| -rw-r--r-- | src/audio_core/stream.h | 6 | ||||
| -rw-r--r-- | src/core/core_timing.cpp | 8 | ||||
| -rw-r--r-- | src/core/core_timing.h | 8 | ||||
| -rw-r--r-- | src/core/hardware_interrupt_manager.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/time_manager.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.cpp | 15 | ||||
| -rw-r--r-- | src/core/memory/cheat_engine.cpp | 7 | ||||
| -rw-r--r-- | src/core/tools/freezer.cpp | 9 | ||||
| -rw-r--r-- | src/tests/core/core_timing.cpp | 13 |
13 files changed, 58 insertions, 49 deletions
diff --git a/src/audio_core/stream.cpp b/src/audio_core/stream.cpp index aab3e979a..abd8576e2 100644 --- a/src/audio_core/stream.cpp +++ b/src/audio_core/stream.cpp | |||
| @@ -59,11 +59,9 @@ Stream::State Stream::GetState() const { | |||
| 59 | return state; | 59 | return state; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | s64 Stream::GetBufferReleaseNS(const Buffer& buffer) const { | 62 | std::chrono::nanoseconds Stream::GetBufferReleaseNS(const Buffer& buffer) const { |
| 63 | const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()}; | 63 | const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()}; |
| 64 | const auto ns = | 64 | return std::chrono::nanoseconds((static_cast<u64>(num_samples) * 1000000000ULL) / sample_rate); |
| 65 | std::chrono::nanoseconds((static_cast<u64>(num_samples) * 1000000000ULL) / sample_rate); | ||
| 66 | return ns.count(); | ||
| 67 | } | 65 | } |
| 68 | 66 | ||
| 69 | static void VolumeAdjustSamples(std::vector<s16>& samples, float game_volume) { | 67 | static void VolumeAdjustSamples(std::vector<s16>& samples, float game_volume) { |
| @@ -105,10 +103,10 @@ void Stream::PlayNextBuffer(s64 cycles_late) { | |||
| 105 | 103 | ||
| 106 | sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples()); | 104 | sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples()); |
| 107 | 105 | ||
| 108 | core_timing.ScheduleEvent( | 106 | const auto time_stretch_delta = std::chrono::nanoseconds{ |
| 109 | GetBufferReleaseNS(*active_buffer) - | 107 | Settings::values.enable_audio_stretching.GetValue() ? 0 : cycles_late}; |
| 110 | (Settings::values.enable_audio_stretching.GetValue() ? 0 : cycles_late), | 108 | const auto future_time = GetBufferReleaseNS(*active_buffer) - time_stretch_delta; |
| 111 | release_event, {}); | 109 | core_timing.ScheduleEvent(future_time, release_event, {}); |
| 112 | } | 110 | } |
| 113 | 111 | ||
| 114 | void Stream::ReleaseActiveBuffer(s64 cycles_late) { | 112 | void Stream::ReleaseActiveBuffer(s64 cycles_late) { |
diff --git a/src/audio_core/stream.h b/src/audio_core/stream.h index 524376257..2febd647c 100644 --- a/src/audio_core/stream.h +++ b/src/audio_core/stream.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <chrono> | ||
| 7 | #include <functional> | 8 | #include <functional> |
| 8 | #include <memory> | 9 | #include <memory> |
| 9 | #include <string> | 10 | #include <string> |
| @@ -96,10 +97,7 @@ private: | |||
| 96 | void ReleaseActiveBuffer(s64 cycles_late = 0); | 97 | void ReleaseActiveBuffer(s64 cycles_late = 0); |
| 97 | 98 | ||
| 98 | /// Gets the number of core cycles when the specified buffer will be released | 99 | /// Gets the number of core cycles when the specified buffer will be released |
| 99 | s64 GetBufferReleaseNS(const Buffer& buffer) const; | 100 | std::chrono::nanoseconds GetBufferReleaseNS(const Buffer& buffer) const; |
| 100 | |||
| 101 | /// Gets the number of core cycles when the specified buffer will be released | ||
| 102 | s64 GetBufferReleaseNSHostTiming(const Buffer& buffer) const; | ||
| 103 | 101 | ||
| 104 | u32 sample_rate; ///< Sample rate of the stream | 102 | u32 sample_rate; ///< Sample rate of the stream |
| 105 | Format format; ///< Format of the stream | 103 | Format format; ///< Format of the stream |
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index a63e60461..a5d084e08 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp | |||
| @@ -53,7 +53,7 @@ void CoreTiming::ThreadEntry(CoreTiming& instance) { | |||
| 53 | instance.ThreadLoop(); | 53 | instance.ThreadLoop(); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | void CoreTiming::Initialize(std::function<void(void)>&& on_thread_init_) { | 56 | void CoreTiming::Initialize(std::function<void()>&& on_thread_init_) { |
| 57 | on_thread_init = std::move(on_thread_init_); | 57 | on_thread_init = std::move(on_thread_init_); |
| 58 | event_fifo_id = 0; | 58 | event_fifo_id = 0; |
| 59 | shutting_down = false; | 59 | shutting_down = false; |
| @@ -106,11 +106,11 @@ bool CoreTiming::HasPendingEvents() const { | |||
| 106 | return !(wait_set && event_queue.empty()); | 106 | return !(wait_set && event_queue.empty()); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | void CoreTiming::ScheduleEvent(s64 ns_into_future, const std::shared_ptr<EventType>& event_type, | 109 | void CoreTiming::ScheduleEvent(std::chrono::nanoseconds ns_into_future, |
| 110 | u64 userdata) { | 110 | const std::shared_ptr<EventType>& event_type, u64 userdata) { |
| 111 | { | 111 | { |
| 112 | std::scoped_lock scope{basic_lock}; | 112 | std::scoped_lock scope{basic_lock}; |
| 113 | const u64 timeout = static_cast<u64>(GetGlobalTimeNs().count() + ns_into_future); | 113 | const u64 timeout = static_cast<u64>((GetGlobalTimeNs() + ns_into_future).count()); |
| 114 | 114 | ||
| 115 | event_queue.emplace_back(Event{timeout, event_fifo_id++, userdata, event_type}); | 115 | event_queue.emplace_back(Event{timeout, event_fifo_id++, userdata, event_type}); |
| 116 | 116 | ||
diff --git a/src/core/core_timing.h b/src/core/core_timing.h index 72faaab64..9b9f18daf 100644 --- a/src/core/core_timing.h +++ b/src/core/core_timing.h | |||
| @@ -62,7 +62,7 @@ public: | |||
| 62 | 62 | ||
| 63 | /// CoreTiming begins at the boundary of timing slice -1. An initial call to Advance() is | 63 | /// CoreTiming begins at the boundary of timing slice -1. An initial call to Advance() is |
| 64 | /// required to end slice - 1 and start slice 0 before the first cycle of code is executed. | 64 | /// required to end slice - 1 and start slice 0 before the first cycle of code is executed. |
| 65 | void Initialize(std::function<void(void)>&& on_thread_init_); | 65 | void Initialize(std::function<void()>&& on_thread_init_); |
| 66 | 66 | ||
| 67 | /// Tears down all timing related functionality. | 67 | /// Tears down all timing related functionality. |
| 68 | void Shutdown(); | 68 | void Shutdown(); |
| @@ -95,8 +95,8 @@ public: | |||
| 95 | bool HasPendingEvents() const; | 95 | bool HasPendingEvents() const; |
| 96 | 96 | ||
| 97 | /// Schedules an event in core timing | 97 | /// Schedules an event in core timing |
| 98 | void ScheduleEvent(s64 ns_into_future, const std::shared_ptr<EventType>& event_type, | 98 | void ScheduleEvent(std::chrono::nanoseconds ns_into_future, |
| 99 | u64 userdata = 0); | 99 | const std::shared_ptr<EventType>& event_type, u64 userdata = 0); |
| 100 | 100 | ||
| 101 | void UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u64 userdata); | 101 | void UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u64 userdata); |
| 102 | 102 | ||
| @@ -161,7 +161,7 @@ private: | |||
| 161 | std::atomic<bool> wait_set{}; | 161 | std::atomic<bool> wait_set{}; |
| 162 | std::atomic<bool> shutting_down{}; | 162 | std::atomic<bool> shutting_down{}; |
| 163 | std::atomic<bool> has_started{}; | 163 | std::atomic<bool> has_started{}; |
| 164 | std::function<void(void)> on_thread_init{}; | 164 | std::function<void()> on_thread_init{}; |
| 165 | 165 | ||
| 166 | bool is_multicore{}; | 166 | bool is_multicore{}; |
| 167 | 167 | ||
diff --git a/src/core/hardware_interrupt_manager.cpp b/src/core/hardware_interrupt_manager.cpp index c629d9fa1..e7fd71e2e 100644 --- a/src/core/hardware_interrupt_manager.cpp +++ b/src/core/hardware_interrupt_manager.cpp | |||
| @@ -23,7 +23,7 @@ InterruptManager::~InterruptManager() = default; | |||
| 23 | 23 | ||
| 24 | void InterruptManager::GPUInterruptSyncpt(const u32 syncpoint_id, const u32 value) { | 24 | void InterruptManager::GPUInterruptSyncpt(const u32 syncpoint_id, const u32 value) { |
| 25 | const u64 msg = (static_cast<u64>(syncpoint_id) << 32ULL) | value; | 25 | const u64 msg = (static_cast<u64>(syncpoint_id) << 32ULL) | value; |
| 26 | system.CoreTiming().ScheduleEvent(10, gpu_interrupt_event, msg); | 26 | system.CoreTiming().ScheduleEvent(std::chrono::nanoseconds{10}, gpu_interrupt_event, msg); |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | } // namespace Core::Hardware | 29 | } // namespace Core::Hardware |
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 1f2af7a1b..35fb270b8 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -149,11 +149,13 @@ struct KernelCore::Impl { | |||
| 149 | SchedulerLock lock(kernel); | 149 | SchedulerLock lock(kernel); |
| 150 | global_scheduler.PreemptThreads(); | 150 | global_scheduler.PreemptThreads(); |
| 151 | } | 151 | } |
| 152 | s64 time_interval = Core::Timing::msToCycles(std::chrono::milliseconds(10)); | 152 | const auto time_interval = std::chrono::nanoseconds{ |
| 153 | Core::Timing::msToCycles(std::chrono::milliseconds(10))}; | ||
| 153 | system.CoreTiming().ScheduleEvent(time_interval, preemption_event); | 154 | system.CoreTiming().ScheduleEvent(time_interval, preemption_event); |
| 154 | }); | 155 | }); |
| 155 | 156 | ||
| 156 | s64 time_interval = Core::Timing::msToCycles(std::chrono::milliseconds(10)); | 157 | const auto time_interval = |
| 158 | std::chrono::nanoseconds{Core::Timing::msToCycles(std::chrono::milliseconds(10))}; | ||
| 157 | system.CoreTiming().ScheduleEvent(time_interval, preemption_event); | 159 | system.CoreTiming().ScheduleEvent(time_interval, preemption_event); |
| 158 | } | 160 | } |
| 159 | 161 | ||
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 7b23a6889..8c32f28b5 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -184,8 +184,8 @@ ResultCode ServerSession::CompleteSyncRequest() { | |||
| 184 | 184 | ||
| 185 | ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread, | 185 | ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread, |
| 186 | Core::Memory::Memory& memory) { | 186 | Core::Memory::Memory& memory) { |
| 187 | ResultCode result = QueueSyncRequest(std::move(thread), memory); | 187 | const ResultCode result = QueueSyncRequest(std::move(thread), memory); |
| 188 | const u64 delay = kernel.IsMulticore() ? 0U : 20000U; | 188 | const auto delay = std::chrono::nanoseconds{kernel.IsMulticore() ? 0 : 20000}; |
| 189 | Core::System::GetInstance().CoreTiming().ScheduleEvent(delay, request_event, {}); | 189 | Core::System::GetInstance().CoreTiming().ScheduleEvent(delay, request_event, {}); |
| 190 | return result; | 190 | return result; |
| 191 | } | 191 | } |
diff --git a/src/core/hle/kernel/time_manager.cpp b/src/core/hle/kernel/time_manager.cpp index 941305e8e..ebb1e5568 100644 --- a/src/core/hle/kernel/time_manager.cpp +++ b/src/core/hle/kernel/time_manager.cpp | |||
| @@ -34,7 +34,8 @@ void TimeManager::ScheduleTimeEvent(Handle& event_handle, Thread* timetask, s64 | |||
| 34 | ASSERT(timetask); | 34 | ASSERT(timetask); |
| 35 | ASSERT(timetask->GetStatus() != ThreadStatus::Ready); | 35 | ASSERT(timetask->GetStatus() != ThreadStatus::Ready); |
| 36 | ASSERT(timetask->GetStatus() != ThreadStatus::WaitMutex); | 36 | ASSERT(timetask->GetStatus() != ThreadStatus::WaitMutex); |
| 37 | system.CoreTiming().ScheduleEvent(nanoseconds, time_manager_event_type, event_handle); | 37 | system.CoreTiming().ScheduleEvent(std::chrono::nanoseconds{nanoseconds}, |
| 38 | time_manager_event_type, event_handle); | ||
| 38 | } else { | 39 | } else { |
| 39 | event_handle = InvalidHandle; | 40 | event_handle = InvalidHandle; |
| 40 | } | 41 | } |
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index e9020e0dc..62c942eac 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -39,9 +39,10 @@ namespace Service::HID { | |||
| 39 | 39 | ||
| 40 | // Updating period for each HID device. | 40 | // Updating period for each HID device. |
| 41 | // TODO(ogniK): Find actual polling rate of hid | 41 | // TODO(ogniK): Find actual polling rate of hid |
| 42 | constexpr s64 pad_update_ticks = static_cast<s64>(1000000000 / 66); | 42 | constexpr auto pad_update_ns = std::chrono::nanoseconds{1000000000 / 66}; |
| 43 | [[maybe_unused]] constexpr s64 accelerometer_update_ticks = static_cast<s64>(1000000000 / 100); | 43 | [[maybe_unused]] constexpr auto accelerometer_update_ns = |
| 44 | [[maybe_unused]] constexpr s64 gyroscope_update_ticks = static_cast<s64>(1000000000 / 100); | 44 | std::chrono::nanoseconds{1000000000 / 100}; |
| 45 | [[maybe_unused]] constexpr auto gyroscope_update_ticks = std::chrono::nanoseconds{1000000000 / 100}; | ||
| 45 | constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; | 46 | constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; |
| 46 | 47 | ||
| 47 | IAppletResource::IAppletResource(Core::System& system) | 48 | IAppletResource::IAppletResource(Core::System& system) |
| @@ -82,7 +83,7 @@ IAppletResource::IAppletResource(Core::System& system) | |||
| 82 | 83 | ||
| 83 | // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?) | 84 | // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?) |
| 84 | 85 | ||
| 85 | system.CoreTiming().ScheduleEvent(pad_update_ticks, pad_update_event); | 86 | system.CoreTiming().ScheduleEvent(pad_update_ns, pad_update_event); |
| 86 | 87 | ||
| 87 | ReloadInputDevices(); | 88 | ReloadInputDevices(); |
| 88 | } | 89 | } |
| @@ -118,7 +119,8 @@ void IAppletResource::UpdateControllers(u64 userdata, s64 ns_late) { | |||
| 118 | controller->OnUpdate(core_timing, shared_mem->GetPointer(), SHARED_MEMORY_SIZE); | 119 | controller->OnUpdate(core_timing, shared_mem->GetPointer(), SHARED_MEMORY_SIZE); |
| 119 | } | 120 | } |
| 120 | 121 | ||
| 121 | core_timing.ScheduleEvent(pad_update_ticks - ns_late, pad_update_event); | 122 | const auto future_ns = pad_update_ns - std::chrono::nanoseconds{ns_late}; |
| 123 | core_timing.ScheduleEvent(future_ns, pad_update_event); | ||
| 122 | } | 124 | } |
| 123 | 125 | ||
| 124 | class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> { | 126 | class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> { |
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 2f44d3779..76672264d 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp | |||
| @@ -28,8 +28,7 @@ | |||
| 28 | 28 | ||
| 29 | namespace Service::NVFlinger { | 29 | namespace Service::NVFlinger { |
| 30 | 30 | ||
| 31 | constexpr s64 frame_ticks = static_cast<s64>(1000000000 / 60); | 31 | constexpr auto frame_ns = std::chrono::nanoseconds{1000000000 / 60}; |
| 32 | constexpr s64 frame_ticks_30fps = static_cast<s64>(1000000000 / 30); | ||
| 33 | 32 | ||
| 34 | void NVFlinger::VSyncThread(NVFlinger& nv_flinger) { | 33 | void NVFlinger::VSyncThread(NVFlinger& nv_flinger) { |
| 35 | nv_flinger.SplitVSync(); | 34 | nv_flinger.SplitVSync(); |
| @@ -71,16 +70,20 @@ NVFlinger::NVFlinger(Core::System& system) : system(system) { | |||
| 71 | Core::Timing::CreateEvent("ScreenComposition", [this](u64 userdata, s64 ns_late) { | 70 | Core::Timing::CreateEvent("ScreenComposition", [this](u64 userdata, s64 ns_late) { |
| 72 | Lock(); | 71 | Lock(); |
| 73 | Compose(); | 72 | Compose(); |
| 74 | const auto ticks = GetNextTicks(); | 73 | |
| 75 | this->system.CoreTiming().ScheduleEvent(std::max<s64>(0LL, ticks - ns_late), | 74 | const auto ticks = std::chrono::nanoseconds{GetNextTicks()}; |
| 76 | composition_event); | 75 | const auto ticks_delta = ticks - std::chrono::nanoseconds{ns_late}; |
| 76 | const auto future_ns = std::max(std::chrono::nanoseconds::zero(), ticks_delta); | ||
| 77 | |||
| 78 | this->system.CoreTiming().ScheduleEvent(future_ns, composition_event); | ||
| 77 | }); | 79 | }); |
| 80 | |||
| 78 | if (system.IsMulticore()) { | 81 | if (system.IsMulticore()) { |
| 79 | is_running = true; | 82 | is_running = true; |
| 80 | wait_event = std::make_unique<Common::Event>(); | 83 | wait_event = std::make_unique<Common::Event>(); |
| 81 | vsync_thread = std::make_unique<std::thread>(VSyncThread, std::ref(*this)); | 84 | vsync_thread = std::make_unique<std::thread>(VSyncThread, std::ref(*this)); |
| 82 | } else { | 85 | } else { |
| 83 | system.CoreTiming().ScheduleEvent(frame_ticks, composition_event); | 86 | system.CoreTiming().ScheduleEvent(frame_ns, composition_event); |
| 84 | } | 87 | } |
| 85 | } | 88 | } |
| 86 | 89 | ||
diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp index 53d27859b..09bf8c5cf 100644 --- a/src/core/memory/cheat_engine.cpp +++ b/src/core/memory/cheat_engine.cpp | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | 20 | ||
| 21 | namespace Core::Memory { | 21 | namespace Core::Memory { |
| 22 | 22 | ||
| 23 | constexpr s64 CHEAT_ENGINE_TICKS = static_cast<s64>(1000000000 / 12); | 23 | constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12}; |
| 24 | constexpr u32 KEYPAD_BITMASK = 0x3FFFFFF; | 24 | constexpr u32 KEYPAD_BITMASK = 0x3FFFFFF; |
| 25 | 25 | ||
| 26 | StandardVmCallbacks::StandardVmCallbacks(Core::System& system, const CheatProcessMetadata& metadata) | 26 | StandardVmCallbacks::StandardVmCallbacks(Core::System& system, const CheatProcessMetadata& metadata) |
| @@ -191,7 +191,7 @@ void CheatEngine::Initialize() { | |||
| 191 | event = Core::Timing::CreateEvent( | 191 | event = Core::Timing::CreateEvent( |
| 192 | "CheatEngine::FrameCallback::" + Common::HexToString(metadata.main_nso_build_id), | 192 | "CheatEngine::FrameCallback::" + Common::HexToString(metadata.main_nso_build_id), |
| 193 | [this](u64 userdata, s64 ns_late) { FrameCallback(userdata, ns_late); }); | 193 | [this](u64 userdata, s64 ns_late) { FrameCallback(userdata, ns_late); }); |
| 194 | core_timing.ScheduleEvent(CHEAT_ENGINE_TICKS, event); | 194 | core_timing.ScheduleEvent(CHEAT_ENGINE_NS, event); |
| 195 | 195 | ||
| 196 | metadata.process_id = system.CurrentProcess()->GetProcessID(); | 196 | metadata.process_id = system.CurrentProcess()->GetProcessID(); |
| 197 | metadata.title_id = system.CurrentProcess()->GetTitleID(); | 197 | metadata.title_id = system.CurrentProcess()->GetTitleID(); |
| @@ -230,7 +230,8 @@ void CheatEngine::FrameCallback(u64 userdata, s64 ns_late) { | |||
| 230 | 230 | ||
| 231 | vm.Execute(metadata); | 231 | vm.Execute(metadata); |
| 232 | 232 | ||
| 233 | core_timing.ScheduleEvent(CHEAT_ENGINE_TICKS - ns_late, event); | 233 | const auto future_ns = CHEAT_ENGINE_NS - std::chrono::nanoseconds{ns_late}; |
| 234 | core_timing.ScheduleEvent(future_ns, event); | ||
| 234 | } | 235 | } |
| 235 | 236 | ||
| 236 | } // namespace Core::Memory | 237 | } // namespace Core::Memory |
diff --git a/src/core/tools/freezer.cpp b/src/core/tools/freezer.cpp index 8b0c50d11..5dc52d1c1 100644 --- a/src/core/tools/freezer.cpp +++ b/src/core/tools/freezer.cpp | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | namespace Tools { | 14 | namespace Tools { |
| 15 | namespace { | 15 | namespace { |
| 16 | 16 | ||
| 17 | constexpr s64 MEMORY_FREEZER_TICKS = static_cast<s64>(1000000000 / 60); | 17 | constexpr auto memory_freezer_ns = std::chrono::nanoseconds{1000000000 / 60}; |
| 18 | 18 | ||
| 19 | u64 MemoryReadWidth(Core::Memory::Memory& memory, u32 width, VAddr addr) { | 19 | u64 MemoryReadWidth(Core::Memory::Memory& memory, u32 width, VAddr addr) { |
| 20 | switch (width) { | 20 | switch (width) { |
| @@ -58,7 +58,7 @@ Freezer::Freezer(Core::Timing::CoreTiming& core_timing_, Core::Memory::Memory& m | |||
| 58 | event = Core::Timing::CreateEvent( | 58 | event = Core::Timing::CreateEvent( |
| 59 | "MemoryFreezer::FrameCallback", | 59 | "MemoryFreezer::FrameCallback", |
| 60 | [this](u64 userdata, s64 ns_late) { FrameCallback(userdata, ns_late); }); | 60 | [this](u64 userdata, s64 ns_late) { FrameCallback(userdata, ns_late); }); |
| 61 | core_timing.ScheduleEvent(MEMORY_FREEZER_TICKS, event); | 61 | core_timing.ScheduleEvent(memory_freezer_ns, event); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | Freezer::~Freezer() { | 64 | Freezer::~Freezer() { |
| @@ -68,7 +68,7 @@ Freezer::~Freezer() { | |||
| 68 | void Freezer::SetActive(bool active) { | 68 | void Freezer::SetActive(bool active) { |
| 69 | if (!this->active.exchange(active)) { | 69 | if (!this->active.exchange(active)) { |
| 70 | FillEntryReads(); | 70 | FillEntryReads(); |
| 71 | core_timing.ScheduleEvent(MEMORY_FREEZER_TICKS, event); | 71 | core_timing.ScheduleEvent(memory_freezer_ns, event); |
| 72 | LOG_DEBUG(Common_Memory, "Memory freezer activated!"); | 72 | LOG_DEBUG(Common_Memory, "Memory freezer activated!"); |
| 73 | } else { | 73 | } else { |
| 74 | LOG_DEBUG(Common_Memory, "Memory freezer deactivated!"); | 74 | LOG_DEBUG(Common_Memory, "Memory freezer deactivated!"); |
| @@ -173,7 +173,8 @@ void Freezer::FrameCallback(u64 userdata, s64 ns_late) { | |||
| 173 | MemoryWriteWidth(memory, entry.width, entry.address, entry.value); | 173 | MemoryWriteWidth(memory, entry.width, entry.address, entry.value); |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | core_timing.ScheduleEvent(MEMORY_FREEZER_TICKS - ns_late, event); | 176 | const auto future_ns = memory_freezer_ns - std::chrono::nanoseconds{ns_late}; |
| 177 | core_timing.ScheduleEvent(future_ns, event); | ||
| 177 | } | 178 | } |
| 178 | 179 | ||
| 179 | void Freezer::FillEntryReads() { | 180 | void Freezer::FillEntryReads() { |
diff --git a/src/tests/core/core_timing.cpp b/src/tests/core/core_timing.cpp index e66db1940..4ede1bc2e 100644 --- a/src/tests/core/core_timing.cpp +++ b/src/tests/core/core_timing.cpp | |||
| @@ -116,13 +116,16 @@ TEST_CASE("CoreTiming[BasicOrderNoPausing]", "[core]") { | |||
| 116 | 116 | ||
| 117 | expected_callback = 0; | 117 | expected_callback = 0; |
| 118 | 118 | ||
| 119 | u64 start = core_timing.GetGlobalTimeNs().count(); | 119 | const u64 start = core_timing.GetGlobalTimeNs().count(); |
| 120 | u64 one_micro = 1000U; | 120 | const u64 one_micro = 1000U; |
| 121 | |||
| 121 | for (std::size_t i = 0; i < events.size(); i++) { | 122 | for (std::size_t i = 0; i < events.size(); i++) { |
| 122 | u64 order = calls_order[i]; | 123 | const u64 order = calls_order[i]; |
| 123 | core_timing.ScheduleEvent(i * one_micro + 100U, events[order], CB_IDS[order]); | 124 | const auto future_ns = std::chrono::nanoseconds{static_cast<s64>(i * one_micro + 100)}; |
| 125 | core_timing.ScheduleEvent(future_ns, events[order], CB_IDS[order]); | ||
| 124 | } | 126 | } |
| 125 | u64 end = core_timing.GetGlobalTimeNs().count(); | 127 | |
| 128 | const u64 end = core_timing.GetGlobalTimeNs().count(); | ||
| 126 | const double scheduling_time = static_cast<double>(end - start); | 129 | const double scheduling_time = static_cast<double>(end - start); |
| 127 | const double timer_time = static_cast<double>(TestTimerSpeed(core_timing)); | 130 | const double timer_time = static_cast<double>(TestTimerSpeed(core_timing)); |
| 128 | 131 | ||