pineapple-src/src/common/wall_clock.h

94 lines
3.1 KiB
C
Raw Normal View History

2022-11-05 12:58:44 +00:00
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <chrono>
#include <memory>
2023-04-23 12:05:41 +00:00
#include <ratio>
2022-11-05 12:58:44 +00:00
#include "common/common_types.h"
namespace Common {
class WallClock {
public:
2023-06-08 04:33:13 +00:00
static constexpr u64 CNTFRQ = 19'200'000; // CNTPCT_EL0 Frequency = 19.2 MHz
static constexpr u64 GPUTickFreq = 614'400'000; // GM20B GPU Tick Frequency = 614.4 MHz
static constexpr u64 CPUTickFreq = 1'020'000'000; // T210/4 A57 CPU Tick Frequency = 1020.0 MHz
2022-11-05 12:58:44 +00:00
virtual ~WallClock() = default;
2024-01-08 21:24:26 +00:00
virtual void Reset() = 0;
2023-04-23 12:05:41 +00:00
/// @returns The time in nanoseconds since the construction of this clock.
virtual std::chrono::nanoseconds GetTimeNS() const = 0;
2022-11-05 12:58:44 +00:00
2023-04-23 12:05:41 +00:00
/// @returns The time in microseconds since the construction of this clock.
virtual std::chrono::microseconds GetTimeUS() const = 0;
2022-11-05 12:58:44 +00:00
2023-04-23 12:05:41 +00:00
/// @returns The time in milliseconds since the construction of this clock.
virtual std::chrono::milliseconds GetTimeMS() const = 0;
2022-11-05 12:58:44 +00:00
2023-04-23 12:05:41 +00:00
/// @returns The guest CNTPCT ticks since the construction of this clock.
2024-01-08 21:24:26 +00:00
virtual s64 GetCNTPCT() const = 0;
2022-11-05 12:58:44 +00:00
2023-05-30 13:46:53 +00:00
/// @returns The guest GPU ticks since the construction of this clock.
2024-01-08 21:24:26 +00:00
virtual s64 GetGPUTick() const = 0;
2023-05-30 13:46:53 +00:00
2023-04-23 12:05:41 +00:00
/// @returns The raw host timer ticks since an indeterminate epoch.
2024-01-08 21:24:26 +00:00
virtual s64 GetUptime() const = 0;
2022-11-05 12:58:44 +00:00
2023-04-23 12:05:41 +00:00
/// @returns Whether the clock directly uses the host's hardware clock.
virtual bool IsNative() const = 0;
static inline u64 NSToCNTPCT(u64 ns) {
return ns * NsToCNTPCTRatio::num / NsToCNTPCTRatio::den;
2022-11-05 12:58:44 +00:00
}
2023-05-30 13:46:53 +00:00
static inline u64 NSToGPUTick(u64 ns) {
return ns * NsToGPUTickRatio::num / NsToGPUTickRatio::den;
}
2023-06-08 04:33:13 +00:00
// Cycle Timing
static inline u64 CPUTickToNS(u64 cpu_tick) {
return cpu_tick * CPUTickToNsRatio::num / CPUTickToNsRatio::den;
2023-04-23 12:05:41 +00:00
}
2022-11-05 12:58:44 +00:00
2023-06-08 04:33:13 +00:00
static inline u64 CPUTickToUS(u64 cpu_tick) {
return cpu_tick * CPUTickToUsRatio::num / CPUTickToUsRatio::den;
2023-04-23 12:05:41 +00:00
}
2023-06-08 04:33:13 +00:00
static inline u64 CPUTickToCNTPCT(u64 cpu_tick) {
return cpu_tick * CPUTickToCNTPCTRatio::num / CPUTickToCNTPCTRatio::den;
2023-05-30 13:46:53 +00:00
}
2023-06-08 04:33:13 +00:00
static inline u64 CPUTickToGPUTick(u64 cpu_tick) {
return cpu_tick * CPUTickToGPUTickRatio::num / CPUTickToGPUTickRatio::den;
2023-05-30 13:46:53 +00:00
}
2023-04-23 12:05:41 +00:00
protected:
using NsRatio = std::nano;
using UsRatio = std::micro;
using MsRatio = std::milli;
using NsToUsRatio = std::ratio_divide<std::nano, std::micro>;
using NsToMsRatio = std::ratio_divide<std::nano, std::milli>;
using NsToCNTPCTRatio = std::ratio<CNTFRQ, std::nano::den>;
2023-05-30 13:46:53 +00:00
using NsToGPUTickRatio = std::ratio<GPUTickFreq, std::nano::den>;
2023-06-08 04:33:13 +00:00
// Cycle Timing
using CPUTickToNsRatio = std::ratio<std::nano::den, CPUTickFreq>;
using CPUTickToUsRatio = std::ratio<std::micro::den, CPUTickFreq>;
using CPUTickToCNTPCTRatio = std::ratio<CNTFRQ, CPUTickFreq>;
using CPUTickToGPUTickRatio = std::ratio<GPUTickFreq, CPUTickFreq>;
2022-11-05 12:58:44 +00:00
};
2023-04-23 12:05:41 +00:00
std::unique_ptr<WallClock> CreateOptimalClock();
2022-11-05 12:58:44 +00:00
2023-04-23 12:05:41 +00:00
std::unique_ptr<WallClock> CreateStandardWallClock();
2023-03-04 08:58:45 +00:00
2022-11-05 12:58:44 +00:00
} // namespace Common