native_clock.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "common/wall_clock.h"
  5. namespace Common {
  6. namespace X64 {
  7. class NativeClock final : public WallClock {
  8. public:
  9. explicit NativeClock(u64 emulated_cpu_frequency_, u64 emulated_clock_frequency_,
  10. u64 rtsc_frequency_);
  11. std::chrono::nanoseconds GetTimeNS() override;
  12. std::chrono::microseconds GetTimeUS() override;
  13. std::chrono::milliseconds GetTimeMS() override;
  14. u64 GetClockCycles() override;
  15. u64 GetCPUCycles() override;
  16. void Pause(bool is_paused) override;
  17. private:
  18. u64 GetRTSC();
  19. union alignas(16) TimePoint {
  20. TimePoint() : pack{} {}
  21. u128 pack{};
  22. struct Inner {
  23. u64 last_measure{};
  24. u64 accumulated_ticks{};
  25. } inner;
  26. };
  27. TimePoint time_point;
  28. // factors
  29. u64 clock_rtsc_factor{};
  30. u64 cpu_rtsc_factor{};
  31. u64 ns_rtsc_factor{};
  32. u64 us_rtsc_factor{};
  33. u64 ms_rtsc_factor{};
  34. u64 rtsc_frequency;
  35. };
  36. } // namespace X64
  37. u64 EstimateRDTSCFrequency();
  38. } // namespace Common