summaryrefslogtreecommitdiff
path: root/src/common/wall_clock.h
diff options
context:
space:
mode:
authorGravatar Morph2023-05-28 17:45:47 -0400
committerGravatar Morph2023-06-07 21:44:42 -0400
commit907507886d755fa56099713c4b8f05bb640a8b7d (patch)
treea6ef3a8dfa9ba4aab797ab4985e078aba4b89fd2 /src/common/wall_clock.h
parenttime: Use compile time division for TimeSpanType conversion (diff)
downloadyuzu-907507886d755fa56099713c4b8f05bb640a8b7d.tar.gz
yuzu-907507886d755fa56099713c4b8f05bb640a8b7d.tar.xz
yuzu-907507886d755fa56099713c4b8f05bb640a8b7d.zip
(wall, native)_clock: Add GetGPUTick
Allows us to directly calculate the GPU tick without double conversion to and from the host clock tick.
Diffstat (limited to 'src/common/wall_clock.h')
-rw-r--r--src/common/wall_clock.h20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/common/wall_clock.h b/src/common/wall_clock.h
index 56c18ca25..fcfdd637c 100644
--- a/src/common/wall_clock.h
+++ b/src/common/wall_clock.h
@@ -13,7 +13,8 @@ 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 18
18 virtual ~WallClock() = default; 19 virtual ~WallClock() = default;
19 20
@@ -29,6 +30,9 @@ public:
29 /// @returns The guest CNTPCT ticks since the construction of this clock. 30 /// @returns The guest CNTPCT ticks since the construction of this clock.
30 virtual u64 GetCNTPCT() const = 0; 31 virtual u64 GetCNTPCT() const = 0;
31 32
33 /// @returns The guest GPU ticks since the construction of this clock.
34 virtual u64 GetGPUTick() const = 0;
35
32 /// @returns The raw host timer ticks since an indeterminate epoch. 36 /// @returns The raw host timer ticks since an indeterminate epoch.
33 virtual u64 GetHostTicksNow() const = 0; 37 virtual u64 GetHostTicksNow() const = 0;
34 38
@@ -46,6 +50,10 @@ public:
46 return us * UsToCNTPCTRatio::num / UsToCNTPCTRatio::den; 50 return us * UsToCNTPCTRatio::num / UsToCNTPCTRatio::den;
47 } 51 }
48 52
53 static inline u64 NSToGPUTick(u64 ns) {
54 return ns * NsToGPUTickRatio::num / NsToGPUTickRatio::den;
55 }
56
49 static inline u64 CNTPCTToNS(u64 cntpct) { 57 static inline u64 CNTPCTToNS(u64 cntpct) {
50 return cntpct * NsToCNTPCTRatio::den / NsToCNTPCTRatio::num; 58 return cntpct * NsToCNTPCTRatio::den / NsToCNTPCTRatio::num;
51 } 59 }
@@ -54,6 +62,14 @@ public:
54 return cntpct * UsToCNTPCTRatio::den / UsToCNTPCTRatio::num; 62 return cntpct * UsToCNTPCTRatio::den / UsToCNTPCTRatio::num;
55 } 63 }
56 64
65 static inline u64 GPUTickToNS(u64 gpu_tick) {
66 return gpu_tick * NsToGPUTickRatio::den / NsToGPUTickRatio::num;
67 }
68
69 static inline u64 CNTPCTToGPUTick(u64 cntpct) {
70 return cntpct * CNTPCTToGPUTickRatio::num / CNTPCTToGPUTickRatio::den;
71 }
72
57protected: 73protected:
58 using NsRatio = std::nano; 74 using NsRatio = std::nano;
59 using UsRatio = std::micro; 75 using UsRatio = std::micro;
@@ -63,6 +79,8 @@ protected:
63 using NsToMsRatio = std::ratio_divide<std::nano, std::milli>; 79 using NsToMsRatio = std::ratio_divide<std::nano, std::milli>;
64 using NsToCNTPCTRatio = std::ratio<CNTFRQ, std::nano::den>; 80 using NsToCNTPCTRatio = std::ratio<CNTFRQ, std::nano::den>;
65 using UsToCNTPCTRatio = std::ratio<CNTFRQ, std::micro::den>; 81 using UsToCNTPCTRatio = std::ratio<CNTFRQ, std::micro::den>;
82 using NsToGPUTickRatio = std::ratio<GPUTickFreq, std::nano::den>;
83 using CNTPCTToGPUTickRatio = std::ratio<GPUTickFreq, CNTFRQ>;
66}; 84};
67 85
68std::unique_ptr<WallClock> CreateOptimalClock(); 86std::unique_ptr<WallClock> CreateOptimalClock();