summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2019-06-04 19:52:42 -0400
committerGravatar Lioncash2019-06-04 20:31:24 -0400
commit42f5fd0ab32b117901d0cae228103811719606ff (patch)
tree66fed7f7c35ba2448006f1393a9b868ed29632d5
parentcore/core_timing_utils: Simplify overload set (diff)
downloadyuzu-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.cpp4
-rw-r--r--src/core/core_timing_util.cpp36
-rw-r--r--src/core/core_timing_util.h21
-rw-r--r--src/core/hle/kernel/thread.cpp4
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp3
-rw-r--r--src/core/hle/service/time/time.cpp9
-rw-r--r--src/video_core/gpu_thread.cpp2
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
58s64 Stream::GetBufferReleaseCycles(const Buffer& buffer) const { 58s64 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
63static void VolumeAdjustSamples(std::vector<s16>& samples) { 65static 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
14constexpr u64 MAX_VALUE_TO_MULTIPLY = std::numeric_limits<s64>::max() / BASE_CLOCK_RATE; 14constexpr u64 MAX_VALUE_TO_MULTIPLY = std::numeric_limits<s64>::max() / BASE_CLOCK_RATE;
15 15
16s64 usToCycles(s64 us) { 16s64 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
28s64 usToCycles(u64 us) { 28s64 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
32s64 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
44s64 nsToCycles(u64 ns) { 40s64 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
48u64 CpuCyclesToClockCycles(u64 ticks) { 52u64 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
9namespace Core::Timing { 10namespace Core::Timing {
@@ -13,22 +14,20 @@ namespace Core::Timing {
13constexpr u64 BASE_CLOCK_RATE = 1019215872; // Switch clock speed is 1020MHz un/docked 14constexpr u64 BASE_CLOCK_RATE = 1019215872; // Switch clock speed is 1020MHz un/docked
14constexpr u64 CNTFREQ = 19200000; // Value from fusee. 15constexpr u64 CNTFREQ = 19200000; // Value from fusee.
15 16
16s64 usToCycles(s64 us); 17s64 msToCycles(std::chrono::milliseconds ms);
17s64 usToCycles(u64 us); 18s64 usToCycles(std::chrono::microseconds us);
19s64 nsToCycles(std::chrono::nanoseconds ns);
18 20
19s64 nsToCycles(s64 ns); 21inline std::chrono::milliseconds cyclesToMs(s64 cycles) {
20s64 nsToCycles(u64 ns); 22 return std::chrono::milliseconds(cycles * 1000 / BASE_CLOCK_RATE);
21
22inline u64 cyclesToNs(s64 cycles) {
23 return cycles * 1000000000 / BASE_CLOCK_RATE;
24} 23}
25 24
26inline s64 cyclesToUs(s64 cycles) { 25inline 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
30inline u64 cyclesToMs(s64 cycles) { 29inline 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
34u64 CpuCyclesToClockCycles(u64 ticks); 33u64 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
83void Thread::CancelWakeupTimer() { 83void 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(&params, input.data(), input.size()); 187 std::memcpy(&params, 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(), &params, output.size()); 190 std::memcpy(output.data(), &params, 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
76void ThreadManager::SubmitList(Tegra::CommandList&& entries) { 76void 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