From b074c0d1ee8e18ded15e8cb92945253f70de883b Mon Sep 17 00:00:00 2001
From: Connor McLaughlin <stenzek@gmail.com>
Date: Sat, 30 Jul 2022 00:45:26 +1000
Subject: [PATCH] System: Make inter-frame sleep slightly more precise

---
 src/common/timer.cpp | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/common/timer.cpp b/src/common/timer.cpp
index 679824f45..931d28dd8 100644
--- a/src/common/timer.cpp
+++ b/src/common/timer.cpp
@@ -27,9 +27,13 @@ static HANDLE GetSleepTimer()
     return s_sleep_timer;
 
   s_sleep_timer_created = true;
-  s_sleep_timer = CreateWaitableTimer(nullptr, TRUE, nullptr);
+  s_sleep_timer = CreateWaitableTimerEx(nullptr, nullptr, CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS);
   if (!s_sleep_timer)
-    std::fprintf(stderr, "CreateWaitableTimer() failed, falling back to Sleep()\n");
+  {
+    s_sleep_timer = CreateWaitableTimer(nullptr, TRUE, nullptr);
+    if (!s_sleep_timer)
+      std::fprintf(stderr, "CreateWaitableTimer() failed, falling back to Sleep()\n");
+  }
 
   return s_sleep_timer;
 }
@@ -89,8 +93,19 @@ void Timer::SleepUntil(Value value, bool exact)
 {
   if (exact)
   {
-    while (GetCurrentValue() < value)
-      SleepUntil(value, false);
+    for (;;)
+    {
+      Value current = GetCurrentValue();
+      if (current >= value)
+        break;
+
+      // spin for the last 1ms
+      if ((value - current) > ConvertMillisecondsToValue(1))
+      {
+        SleepUntil(value, false);
+        continue;
+      }
+    }
   }
   else
   {