pineapple-src/src/common/x64/native_clock.h

52 lines
1.1 KiB
C
Raw Normal View History

2022-04-23 14:49:07 -04:00
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2020-12-28 10:15:37 -05:00
#pragma once
2022-06-27 22:53:32 -04:00
#include <atomic>
2020-12-28 10:15:37 -05:00
#include "common/wall_clock.h"
namespace Common {
namespace X64 {
class NativeClock final : public WallClock {
public:
explicit NativeClock(u64 emulated_cpu_frequency_, u64 emulated_clock_frequency_,
u64 rtsc_frequency_);
std::chrono::nanoseconds GetTimeNS() override;
std::chrono::microseconds GetTimeUS() override;
std::chrono::milliseconds GetTimeMS() override;
u64 GetClockCycles() override;
u64 GetCPUCycles() override;
void Pause(bool is_paused) override;
private:
u64 GetRTSC();
2022-06-27 22:53:32 -04:00
struct alignas(16) TimePoint {
u64 last_measure{};
u64 accumulated_ticks{};
2021-01-02 16:47:26 -05:00
};
2022-06-27 22:53:32 -04:00
std::atomic<TimePoint> time_point;
2021-01-02 16:47:26 -05:00
// factors
u64 clock_rtsc_factor{};
u64 cpu_rtsc_factor{};
u64 ns_rtsc_factor{};
u64 us_rtsc_factor{};
u64 ms_rtsc_factor{};
2020-12-28 10:15:37 -05:00
u64 rtsc_frequency;
};
} // namespace X64
u64 EstimateRDTSCFrequency();
} // namespace Common