diff options
| author | 2020-06-28 12:37:50 -0400 | |
|---|---|---|
| committer | 2020-06-28 12:37:50 -0400 | |
| commit | b05795d704e0c194215f815a5703db09e524b59a (patch) | |
| tree | ecf4023b4ee0c91555c1d8263762fcb9dcb04a17 /src/common/x64/native_clock.cpp | |
| parent | Merge pull request #4196 from ogniK5377/nrr-nro-fixes (diff) | |
| parent | Core/Common: Address Feedback. (diff) | |
| download | yuzu-b05795d704e0c194215f815a5703db09e524b59a.tar.gz yuzu-b05795d704e0c194215f815a5703db09e524b59a.tar.xz yuzu-b05795d704e0c194215f815a5703db09e524b59a.zip | |
Merge pull request #3955 from FernandoS27/prometheus-2b
Remake Kernel Scheduling, CPU Management & Boot Management (Prometheus)
Diffstat (limited to 'src/common/x64/native_clock.cpp')
| -rw-r--r-- | src/common/x64/native_clock.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/common/x64/native_clock.cpp b/src/common/x64/native_clock.cpp index 26d4d0ba6..424b39b1f 100644 --- a/src/common/x64/native_clock.cpp +++ b/src/common/x64/native_clock.cpp | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <chrono> | 5 | #include <chrono> |
| 6 | #include <mutex> | ||
| 6 | #include <thread> | 7 | #include <thread> |
| 7 | 8 | ||
| 8 | #ifdef _MSC_VER | 9 | #ifdef _MSC_VER |
| @@ -52,7 +53,7 @@ NativeClock::NativeClock(u64 emulated_cpu_frequency, u64 emulated_clock_frequenc | |||
| 52 | } | 53 | } |
| 53 | 54 | ||
| 54 | u64 NativeClock::GetRTSC() { | 55 | u64 NativeClock::GetRTSC() { |
| 55 | rtsc_serialize.lock(); | 56 | std::scoped_lock scope{rtsc_serialize}; |
| 56 | _mm_mfence(); | 57 | _mm_mfence(); |
| 57 | const u64 current_measure = __rdtsc(); | 58 | const u64 current_measure = __rdtsc(); |
| 58 | u64 diff = current_measure - last_measure; | 59 | u64 diff = current_measure - last_measure; |
| @@ -61,8 +62,15 @@ u64 NativeClock::GetRTSC() { | |||
| 61 | last_measure = current_measure; | 62 | last_measure = current_measure; |
| 62 | } | 63 | } |
| 63 | accumulated_ticks += diff; | 64 | accumulated_ticks += diff; |
| 64 | rtsc_serialize.unlock(); | 65 | /// The clock cannot be more precise than the guest timer, remove the lower bits |
| 65 | return accumulated_ticks; | 66 | return accumulated_ticks & inaccuracy_mask; |
| 67 | } | ||
| 68 | |||
| 69 | void NativeClock::Pause(bool is_paused) { | ||
| 70 | if (!is_paused) { | ||
| 71 | _mm_mfence(); | ||
| 72 | last_measure = __rdtsc(); | ||
| 73 | } | ||
| 66 | } | 74 | } |
| 67 | 75 | ||
| 68 | std::chrono::nanoseconds NativeClock::GetTimeNS() { | 76 | std::chrono::nanoseconds NativeClock::GetTimeNS() { |