diff options
Diffstat (limited to 'src/common/wall_clock.h')
| -rw-r--r-- | src/common/wall_clock.h | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/src/common/wall_clock.h b/src/common/wall_clock.h index fcfdd637c..f45d3d8c5 100644 --- a/src/common/wall_clock.h +++ b/src/common/wall_clock.h | |||
| @@ -13,8 +13,9 @@ namespace Common { | |||
| 13 | 13 | ||
| 14 | class WallClock { | 14 | class WallClock { |
| 15 | public: | 15 | public: |
| 16 | static constexpr u64 CNTFRQ = 19'200'000; // CNTPCT_EL0 Frequency = 19.2 MHz | 16 | static constexpr u64 CNTFRQ = 19'200'000; // CNTPCT_EL0 Frequency = 19.2 MHz |
| 17 | static constexpr u64 GPUTickFreq = 614'400'000; // GM20B GPU Tick Frequency = 614.4 MHz | 17 | static constexpr u64 GPUTickFreq = 614'400'000; // GM20B GPU Tick Frequency = 614.4 MHz |
| 18 | static constexpr u64 CPUTickFreq = 1'020'000'000; // T210/4 A57 CPU Tick Frequency = 1020.0 MHz | ||
| 18 | 19 | ||
| 19 | virtual ~WallClock() = default; | 20 | virtual ~WallClock() = default; |
| 20 | 21 | ||
| @@ -46,28 +47,26 @@ public: | |||
| 46 | return ns * NsToCNTPCTRatio::num / NsToCNTPCTRatio::den; | 47 | return ns * NsToCNTPCTRatio::num / NsToCNTPCTRatio::den; |
| 47 | } | 48 | } |
| 48 | 49 | ||
| 49 | static inline u64 USToCNTPCT(u64 us) { | ||
| 50 | return us * UsToCNTPCTRatio::num / UsToCNTPCTRatio::den; | ||
| 51 | } | ||
| 52 | |||
| 53 | static inline u64 NSToGPUTick(u64 ns) { | 50 | static inline u64 NSToGPUTick(u64 ns) { |
| 54 | return ns * NsToGPUTickRatio::num / NsToGPUTickRatio::den; | 51 | return ns * NsToGPUTickRatio::num / NsToGPUTickRatio::den; |
| 55 | } | 52 | } |
| 56 | 53 | ||
| 57 | static inline u64 CNTPCTToNS(u64 cntpct) { | 54 | // Cycle Timing |
| 58 | return cntpct * NsToCNTPCTRatio::den / NsToCNTPCTRatio::num; | 55 | |
| 56 | static inline u64 CPUTickToNS(u64 cpu_tick) { | ||
| 57 | return cpu_tick * CPUTickToNsRatio::num / CPUTickToNsRatio::den; | ||
| 59 | } | 58 | } |
| 60 | 59 | ||
| 61 | static inline u64 CNTPCTToUS(u64 cntpct) { | 60 | static inline u64 CPUTickToUS(u64 cpu_tick) { |
| 62 | return cntpct * UsToCNTPCTRatio::den / UsToCNTPCTRatio::num; | 61 | return cpu_tick * CPUTickToUsRatio::num / CPUTickToUsRatio::den; |
| 63 | } | 62 | } |
| 64 | 63 | ||
| 65 | static inline u64 GPUTickToNS(u64 gpu_tick) { | 64 | static inline u64 CPUTickToCNTPCT(u64 cpu_tick) { |
| 66 | return gpu_tick * NsToGPUTickRatio::den / NsToGPUTickRatio::num; | 65 | return cpu_tick * CPUTickToCNTPCTRatio::num / CPUTickToCNTPCTRatio::den; |
| 67 | } | 66 | } |
| 68 | 67 | ||
| 69 | static inline u64 CNTPCTToGPUTick(u64 cntpct) { | 68 | static inline u64 CPUTickToGPUTick(u64 cpu_tick) { |
| 70 | return cntpct * CNTPCTToGPUTickRatio::num / CNTPCTToGPUTickRatio::den; | 69 | return cpu_tick * CPUTickToGPUTickRatio::num / CPUTickToGPUTickRatio::den; |
| 71 | } | 70 | } |
| 72 | 71 | ||
| 73 | protected: | 72 | protected: |
| @@ -78,9 +77,14 @@ protected: | |||
| 78 | using NsToUsRatio = std::ratio_divide<std::nano, std::micro>; | 77 | using NsToUsRatio = std::ratio_divide<std::nano, std::micro>; |
| 79 | using NsToMsRatio = std::ratio_divide<std::nano, std::milli>; | 78 | using NsToMsRatio = std::ratio_divide<std::nano, std::milli>; |
| 80 | using NsToCNTPCTRatio = std::ratio<CNTFRQ, std::nano::den>; | 79 | using NsToCNTPCTRatio = std::ratio<CNTFRQ, std::nano::den>; |
| 81 | using UsToCNTPCTRatio = std::ratio<CNTFRQ, std::micro::den>; | ||
| 82 | using NsToGPUTickRatio = std::ratio<GPUTickFreq, std::nano::den>; | 80 | using NsToGPUTickRatio = std::ratio<GPUTickFreq, std::nano::den>; |
| 83 | using CNTPCTToGPUTickRatio = std::ratio<GPUTickFreq, CNTFRQ>; | 81 | |
| 82 | // Cycle Timing | ||
| 83 | |||
| 84 | using CPUTickToNsRatio = std::ratio<std::nano::den, CPUTickFreq>; | ||
| 85 | using CPUTickToUsRatio = std::ratio<std::micro::den, CPUTickFreq>; | ||
| 86 | using CPUTickToCNTPCTRatio = std::ratio<CNTFRQ, CPUTickFreq>; | ||
| 87 | using CPUTickToGPUTickRatio = std::ratio<GPUTickFreq, CPUTickFreq>; | ||
| 84 | }; | 88 | }; |
| 85 | 89 | ||
| 86 | std::unique_ptr<WallClock> CreateOptimalClock(); | 90 | std::unique_ptr<WallClock> CreateOptimalClock(); |