2022-04-23 08:59:50 +00:00
|
|
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2020-02-09 20:53:22 +00:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <chrono>
|
2020-02-10 15:20:40 +00:00
|
|
|
#include <memory>
|
2023-04-23 03:08:28 +00:00
|
|
|
#include <ratio>
|
2020-02-09 20:53:22 +00:00
|
|
|
|
|
|
|
#include "common/common_types.h"
|
|
|
|
|
|
|
|
namespace Common {
|
|
|
|
|
|
|
|
class WallClock {
|
|
|
|
public:
|
2023-04-23 03:08:28 +00:00
|
|
|
static constexpr u64 CNTFRQ = 19'200'000; // CNTPCT_EL0 Frequency = 19.2 MHz
|
2022-01-30 17:36:56 +00:00
|
|
|
|
2020-09-29 19:19:37 +00:00
|
|
|
virtual ~WallClock() = default;
|
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
/// @returns The time in nanoseconds since the construction of this clock.
|
|
|
|
virtual std::chrono::nanoseconds GetTimeNS() const = 0;
|
2020-02-10 15:20:40 +00:00
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
/// @returns The time in microseconds since the construction of this clock.
|
|
|
|
virtual std::chrono::microseconds GetTimeUS() const = 0;
|
2020-02-10 15:20:40 +00:00
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
/// @returns The time in milliseconds since the construction of this clock.
|
|
|
|
virtual std::chrono::milliseconds GetTimeMS() const = 0;
|
2020-02-10 15:20:40 +00:00
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
/// @returns The guest CNTPCT ticks since the construction of this clock.
|
|
|
|
virtual u64 GetCNTPCT() const = 0;
|
2020-02-10 15:20:40 +00:00
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
/// @returns The raw host timer ticks since an indeterminate epoch.
|
|
|
|
virtual u64 GetHostTicksNow() const = 0;
|
2020-02-09 20:53:22 +00:00
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
/// @returns The raw host timer ticks since the construction of this clock.
|
|
|
|
virtual u64 GetHostTicksElapsed() const = 0;
|
2020-02-25 16:28:55 +00:00
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
/// @returns Whether the clock directly uses the host's hardware clock.
|
|
|
|
virtual bool IsNative() const = 0;
|
2020-02-09 20:53:22 +00:00
|
|
|
|
|
|
|
protected:
|
2023-04-23 03:08:28 +00:00
|
|
|
using NsRatio = std::nano;
|
|
|
|
using UsRatio = std::micro;
|
|
|
|
using MsRatio = std::milli;
|
2020-02-09 20:53:22 +00:00
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
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>;
|
2020-02-09 20:53:22 +00:00
|
|
|
};
|
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
std::unique_ptr<WallClock> CreateOptimalClock();
|
2020-02-09 20:53:22 +00:00
|
|
|
|
2023-04-23 03:08:28 +00:00
|
|
|
std::unique_ptr<WallClock> CreateStandardWallClock();
|
2023-03-02 02:06:19 +00:00
|
|
|
|
2020-02-09 20:53:22 +00:00
|
|
|
} // namespace Common
|