summaryrefslogtreecommitdiff
path: root/src/common/wall_clock.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/wall_clock.h')
-rw-r--r--src/common/wall_clock.h36
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
14class WallClock { 14class WallClock {
15public: 15public:
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
73protected: 72protected:
@@ -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
86std::unique_ptr<WallClock> CreateOptimalClock(); 90std::unique_ptr<WallClock> CreateOptimalClock();