native_clock.h 1.2 KB

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