native_clock.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Copyright 2020 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  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. union alignas(16) TimePoint {
  21. TimePoint() : pack{} {}
  22. u128 pack{};
  23. struct Inner {
  24. u64 last_measure{};
  25. u64 accumulated_ticks{};
  26. } inner;
  27. };
  28. /// value used to reduce the native clocks accuracy as some apss rely on
  29. /// undefined behavior where the level of accuracy in the clock shouldn't
  30. /// be higher.
  31. static constexpr u64 inaccuracy_mask = ~(UINT64_C(0x400) - 1);
  32. TimePoint time_point;
  33. // factors
  34. u64 clock_rtsc_factor{};
  35. u64 cpu_rtsc_factor{};
  36. u64 ns_rtsc_factor{};
  37. u64 us_rtsc_factor{};
  38. u64 ms_rtsc_factor{};
  39. u64 rtsc_frequency;
  40. };
  41. } // namespace X64
  42. u64 EstimateRDTSCFrequency();
  43. } // namespace Common