diff options
| author | 2019-06-04 19:52:42 -0400 | |
|---|---|---|
| committer | 2019-06-04 20:31:24 -0400 | |
| commit | 42f5fd0ab32b117901d0cae228103811719606ff (patch) | |
| tree | 66fed7f7c35ba2448006f1393a9b868ed29632d5 | |
| parent | core/core_timing_utils: Simplify overload set (diff) | |
| download | yuzu-42f5fd0ab32b117901d0cae228103811719606ff.tar.gz yuzu-42f5fd0ab32b117901d0cae228103811719606ff.tar.xz yuzu-42f5fd0ab32b117901d0cae228103811719606ff.zip | |
core/core_timing_util: Use std::chrono types for specifying time units
Makes the interface more type-safe and consistent in terms of return
values.
| -rw-r--r-- | src/audio_core/stream.cpp | 4 | ||||
| -rw-r--r-- | src/core/core_timing_util.cpp | 36 | ||||
| -rw-r--r-- | src/core/core_timing_util.h | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/service/time/time.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/gpu_thread.cpp | 2 |
7 files changed, 43 insertions, 36 deletions
diff --git a/src/audio_core/stream.cpp b/src/audio_core/stream.cpp index 22a3f8c84..11481a776 100644 --- a/src/audio_core/stream.cpp +++ b/src/audio_core/stream.cpp | |||
| @@ -57,7 +57,9 @@ Stream::State Stream::GetState() const { | |||
| 57 | 57 | ||
| 58 | s64 Stream::GetBufferReleaseCycles(const Buffer& buffer) const { | 58 | s64 Stream::GetBufferReleaseCycles(const Buffer& buffer) const { |
| 59 | const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()}; | 59 | const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()}; |
| 60 | return Core::Timing::usToCycles((static_cast<u64>(num_samples) * 1000000) / sample_rate); | 60 | const auto us = |
| 61 | std::chrono::microseconds((static_cast<u64>(num_samples) * 1000000) / sample_rate); | ||
| 62 | return Core::Timing::usToCycles(us); | ||
| 61 | } | 63 | } |
| 62 | 64 | ||
| 63 | static void VolumeAdjustSamples(std::vector<s16>& samples) { | 65 | static void VolumeAdjustSamples(std::vector<s16>& samples) { |
diff --git a/src/core/core_timing_util.cpp b/src/core/core_timing_util.cpp index 4d73a0d89..a10472a95 100644 --- a/src/core/core_timing_util.cpp +++ b/src/core/core_timing_util.cpp | |||
| @@ -13,36 +13,40 @@ namespace Core::Timing { | |||
| 13 | 13 | ||
| 14 | constexpr u64 MAX_VALUE_TO_MULTIPLY = std::numeric_limits<s64>::max() / BASE_CLOCK_RATE; | 14 | constexpr u64 MAX_VALUE_TO_MULTIPLY = std::numeric_limits<s64>::max() / BASE_CLOCK_RATE; |
| 15 | 15 | ||
| 16 | s64 usToCycles(s64 us) { | 16 | s64 msToCycles(std::chrono::milliseconds ms) { |
| 17 | if (static_cast<u64>(us / 1000000) > MAX_VALUE_TO_MULTIPLY) { | 17 | if (static_cast<u64>(ms.count() / 1000) > MAX_VALUE_TO_MULTIPLY) { |
| 18 | LOG_ERROR(Core_Timing, "Integer overflow, use max value"); | 18 | LOG_ERROR(Core_Timing, "Integer overflow, use max value"); |
| 19 | return std::numeric_limits<s64>::max(); | 19 | return std::numeric_limits<s64>::max(); |
| 20 | } | 20 | } |
| 21 | if (static_cast<u64>(us) > MAX_VALUE_TO_MULTIPLY) { | 21 | if (static_cast<u64>(ms.count()) > MAX_VALUE_TO_MULTIPLY) { |
| 22 | LOG_DEBUG(Core_Timing, "Time very big, do rounding"); | 22 | LOG_DEBUG(Core_Timing, "Time very big, do rounding"); |
| 23 | return BASE_CLOCK_RATE * (us / 1000000); | 23 | return BASE_CLOCK_RATE * (ms.count() / 1000); |
| 24 | } | 24 | } |
| 25 | return (BASE_CLOCK_RATE * us) / 1000000; | 25 | return (BASE_CLOCK_RATE * ms.count()) / 1000; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | s64 usToCycles(u64 us) { | 28 | s64 usToCycles(std::chrono::microseconds us) { |
| 29 | return usToCycles(static_cast<s64>(us)); | 29 | if (static_cast<u64>(us.count() / 1000000) > MAX_VALUE_TO_MULTIPLY) { |
| 30 | } | ||
| 31 | |||
| 32 | s64 nsToCycles(s64 ns) { | ||
| 33 | if (static_cast<u64>(ns / 1000000000) > MAX_VALUE_TO_MULTIPLY) { | ||
| 34 | LOG_ERROR(Core_Timing, "Integer overflow, use max value"); | 30 | LOG_ERROR(Core_Timing, "Integer overflow, use max value"); |
| 35 | return std::numeric_limits<s64>::max(); | 31 | return std::numeric_limits<s64>::max(); |
| 36 | } | 32 | } |
| 37 | if (static_cast<u64>(ns) > MAX_VALUE_TO_MULTIPLY) { | 33 | if (static_cast<u64>(us.count()) > MAX_VALUE_TO_MULTIPLY) { |
| 38 | LOG_DEBUG(Core_Timing, "Time very big, do rounding"); | 34 | LOG_DEBUG(Core_Timing, "Time very big, do rounding"); |
| 39 | return BASE_CLOCK_RATE * (ns / 1000000000); | 35 | return BASE_CLOCK_RATE * (us.count() / 1000000); |
| 40 | } | 36 | } |
| 41 | return (BASE_CLOCK_RATE * ns) / 1000000000; | 37 | return (BASE_CLOCK_RATE * us.count()) / 1000000; |
| 42 | } | 38 | } |
| 43 | 39 | ||
| 44 | s64 nsToCycles(u64 ns) { | 40 | s64 nsToCycles(std::chrono::nanoseconds ns) { |
| 45 | return nsToCycles(static_cast<s64>(ns)); | 41 | if (static_cast<u64>(ns.count() / 1000000000) > MAX_VALUE_TO_MULTIPLY) { |
| 42 | LOG_ERROR(Core_Timing, "Integer overflow, use max value"); | ||
| 43 | return std::numeric_limits<s64>::max(); | ||
| 44 | } | ||
| 45 | if (static_cast<u64>(ns.count()) > MAX_VALUE_TO_MULTIPLY) { | ||
| 46 | LOG_DEBUG(Core_Timing, "Time very big, do rounding"); | ||
| 47 | return BASE_CLOCK_RATE * (ns.count() / 1000000000); | ||
| 48 | } | ||
| 49 | return (BASE_CLOCK_RATE * ns.count()) / 1000000000; | ||
| 46 | } | 50 | } |
| 47 | 51 | ||
| 48 | u64 CpuCyclesToClockCycles(u64 ticks) { | 52 | u64 CpuCyclesToClockCycles(u64 ticks) { |
diff --git a/src/core/core_timing_util.h b/src/core/core_timing_util.h index c8749ff12..1dcd38dd1 100644 --- a/src/core/core_timing_util.h +++ b/src/core/core_timing_util.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <chrono> | ||
| 7 | #include "common/common_types.h" | 8 | #include "common/common_types.h" |
| 8 | 9 | ||
| 9 | namespace Core::Timing { | 10 | namespace Core::Timing { |
| @@ -13,22 +14,20 @@ namespace Core::Timing { | |||
| 13 | constexpr u64 BASE_CLOCK_RATE = 1019215872; // Switch clock speed is 1020MHz un/docked | 14 | constexpr u64 BASE_CLOCK_RATE = 1019215872; // Switch clock speed is 1020MHz un/docked |
| 14 | constexpr u64 CNTFREQ = 19200000; // Value from fusee. | 15 | constexpr u64 CNTFREQ = 19200000; // Value from fusee. |
| 15 | 16 | ||
| 16 | s64 usToCycles(s64 us); | 17 | s64 msToCycles(std::chrono::milliseconds ms); |
| 17 | s64 usToCycles(u64 us); | 18 | s64 usToCycles(std::chrono::microseconds us); |
| 19 | s64 nsToCycles(std::chrono::nanoseconds ns); | ||
| 18 | 20 | ||
| 19 | s64 nsToCycles(s64 ns); | 21 | inline std::chrono::milliseconds cyclesToMs(s64 cycles) { |
| 20 | s64 nsToCycles(u64 ns); | 22 | return std::chrono::milliseconds(cycles * 1000 / BASE_CLOCK_RATE); |
| 21 | |||
| 22 | inline u64 cyclesToNs(s64 cycles) { | ||
| 23 | return cycles * 1000000000 / BASE_CLOCK_RATE; | ||
| 24 | } | 23 | } |
| 25 | 24 | ||
| 26 | inline s64 cyclesToUs(s64 cycles) { | 25 | inline std::chrono::nanoseconds cyclesToNs(s64 cycles) { |
| 27 | return cycles * 1000000 / BASE_CLOCK_RATE; | 26 | return std::chrono::nanoseconds(cycles * 1000000000 / BASE_CLOCK_RATE); |
| 28 | } | 27 | } |
| 29 | 28 | ||
| 30 | inline u64 cyclesToMs(s64 cycles) { | 29 | inline std::chrono::microseconds cyclesToUs(s64 cycles) { |
| 31 | return cycles * 1000 / BASE_CLOCK_RATE; | 30 | return std::chrono::microseconds(cycles * 1000000 / BASE_CLOCK_RATE); |
| 32 | } | 31 | } |
| 33 | 32 | ||
| 34 | u64 CpuCyclesToClockCycles(u64 ticks); | 33 | u64 CpuCyclesToClockCycles(u64 ticks); |
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 2abf9efca..c73a40977 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -75,9 +75,9 @@ void Thread::WakeAfterDelay(s64 nanoseconds) { | |||
| 75 | 75 | ||
| 76 | // This function might be called from any thread so we have to be cautious and use the | 76 | // This function might be called from any thread so we have to be cautious and use the |
| 77 | // thread-safe version of ScheduleEvent. | 77 | // thread-safe version of ScheduleEvent. |
| 78 | const s64 cycles = Core::Timing::nsToCycles(std::chrono::nanoseconds{nanoseconds}); | ||
| 78 | Core::System::GetInstance().CoreTiming().ScheduleEventThreadsafe( | 79 | Core::System::GetInstance().CoreTiming().ScheduleEventThreadsafe( |
| 79 | Core::Timing::nsToCycles(nanoseconds), kernel.ThreadWakeupCallbackEventType(), | 80 | cycles, kernel.ThreadWakeupCallbackEventType(), callback_handle); |
| 80 | callback_handle); | ||
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | void Thread::CancelWakeupTimer() { | 83 | void Thread::CancelWakeupTimer() { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp index 45812d238..f425305d6 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | |||
| @@ -185,7 +185,8 @@ u32 nvhost_ctrl_gpu::GetGpuTime(const std::vector<u8>& input, std::vector<u8>& o | |||
| 185 | 185 | ||
| 186 | IoctlGetGpuTime params{}; | 186 | IoctlGetGpuTime params{}; |
| 187 | std::memcpy(¶ms, input.data(), input.size()); | 187 | std::memcpy(¶ms, input.data(), input.size()); |
| 188 | params.gpu_time = Core::Timing::cyclesToNs(Core::System::GetInstance().CoreTiming().GetTicks()); | 188 | const auto ns = Core::Timing::cyclesToNs(Core::System::GetInstance().CoreTiming().GetTicks()); |
| 189 | params.gpu_time = static_cast<u64_le>(ns.count()); | ||
| 189 | std::memcpy(output.data(), ¶ms, output.size()); | 190 | std::memcpy(output.data(), ¶ms, output.size()); |
| 190 | return 0; | 191 | return 0; |
| 191 | } | 192 | } |
diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp index aa115935d..a6bb3beb0 100644 --- a/src/core/hle/service/time/time.cpp +++ b/src/core/hle/service/time/time.cpp | |||
| @@ -108,8 +108,9 @@ private: | |||
| 108 | LOG_DEBUG(Service_Time, "called"); | 108 | LOG_DEBUG(Service_Time, "called"); |
| 109 | 109 | ||
| 110 | const auto& core_timing = Core::System::GetInstance().CoreTiming(); | 110 | const auto& core_timing = Core::System::GetInstance().CoreTiming(); |
| 111 | const SteadyClockTimePoint steady_clock_time_point{ | 111 | const auto ms = Core::Timing::cyclesToMs(core_timing.GetTicks()); |
| 112 | Core::Timing::cyclesToMs(core_timing.GetTicks()) / 1000}; | 112 | const SteadyClockTimePoint steady_clock_time_point{static_cast<u64_le>(ms.count() / 1000), |
| 113 | {}}; | ||
| 113 | IPC::ResponseBuilder rb{ctx, (sizeof(SteadyClockTimePoint) / 4) + 2}; | 114 | IPC::ResponseBuilder rb{ctx, (sizeof(SteadyClockTimePoint) / 4) + 2}; |
| 114 | rb.Push(RESULT_SUCCESS); | 115 | rb.Push(RESULT_SUCCESS); |
| 115 | rb.PushRaw(steady_clock_time_point); | 116 | rb.PushRaw(steady_clock_time_point); |
| @@ -284,8 +285,8 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) { | |||
| 284 | } | 285 | } |
| 285 | 286 | ||
| 286 | const auto& core_timing = Core::System::GetInstance().CoreTiming(); | 287 | const auto& core_timing = Core::System::GetInstance().CoreTiming(); |
| 287 | const SteadyClockTimePoint steady_clock_time_point{ | 288 | const auto ms = Core::Timing::cyclesToMs(core_timing.GetTicks()); |
| 288 | Core::Timing::cyclesToMs(core_timing.GetTicks()) / 1000, {}}; | 289 | const SteadyClockTimePoint steady_clock_time_point{static_cast<u64_le>(ms.count() / 1000), {}}; |
| 289 | 290 | ||
| 290 | CalendarTime calendar_time{}; | 291 | CalendarTime calendar_time{}; |
| 291 | calendar_time.year = tm->tm_year + 1900; | 292 | calendar_time.year = tm->tm_year + 1900; |
diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 1e2ff46b0..3f0939ec9 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp | |||
| @@ -75,7 +75,7 @@ void ThreadManager::StartThread(VideoCore::RendererBase& renderer, Tegra::DmaPus | |||
| 75 | 75 | ||
| 76 | void ThreadManager::SubmitList(Tegra::CommandList&& entries) { | 76 | void ThreadManager::SubmitList(Tegra::CommandList&& entries) { |
| 77 | const u64 fence{PushCommand(SubmitListCommand(std::move(entries)))}; | 77 | const u64 fence{PushCommand(SubmitListCommand(std::move(entries)))}; |
| 78 | const s64 synchronization_ticks{Core::Timing::usToCycles(9000)}; | 78 | const s64 synchronization_ticks{Core::Timing::usToCycles(std::chrono::microseconds{9000})}; |
| 79 | system.CoreTiming().ScheduleEvent(synchronization_ticks, synchronization_event, fence); | 79 | system.CoreTiming().ScheduleEvent(synchronization_ticks, synchronization_event, fence); |
| 80 | } | 80 | } |
| 81 | 81 | ||