Fix RefreshRate return 0 on MacOS
authorVperuS <vperus@gmail.com>
Thu, 17 Aug 2017 05:32:22 +0000 (08:32 +0300)
committerVperuS <vperus@gmail.com>
Thu, 17 Aug 2017 05:32:22 +0000 (08:32 +0300)
src/OpenTK/OpenTK.csproj
src/OpenTK/Platform/MacOS/CoreVideo.cs [new file with mode: 0644]
src/OpenTK/Platform/MacOS/QuartzDisplayDeviceDriver.cs

index bf4af5e..ee40663 100644 (file)
     <None Include="OpenTK.csproj.paket.template" />
     <None Include="paket.references" />
     <Compile Include="Platform\MacOS\Cocoa\NSDragOperation.cs" />
+    <Compile Include="Platform\MacOS\CoreVideo.cs" />
   </ItemGroup>
   <ItemGroup>
     <AdditionalFiles Include="$(SolutionDir)\stylecop.json">
diff --git a/src/OpenTK/Platform/MacOS/CoreVideo.cs b/src/OpenTK/Platform/MacOS/CoreVideo.cs
new file mode 100644 (file)
index 0000000..24ec94c
--- /dev/null
@@ -0,0 +1,34 @@
+// See License.txt file for copyright details
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace OpenTK.Platform.MacOS
+{
+    [StructLayout(LayoutKind.Sequential)]
+    internal struct CVTime
+    {
+        public Int64 timeValue;
+        public Int32 timeScale;
+        public Int32 flags;
+    }
+
+    internal class CV
+    {
+        private const string LibPath = "/System/Library/Frameworks/CoreVideo.framework/Versions/Current/CoreVideo";
+
+        internal enum TimeFlags : Int32
+        {
+            TimeIsIndefinite = 1 << 0
+        }
+
+        [DllImport(LibPath, EntryPoint = "CVDisplayLinkCreateWithCGDisplay")]
+        public extern static IntPtr DisplayLinkCreateWithCGDisplay(IntPtr currentDisplay, out IntPtr displayLink);
+
+        [DllImport(LibPath, EntryPoint = "CVDisplayLinkGetNominalOutputVideoRefreshPeriod")]
+        public extern static CVTime DisplayLinkGetNominalOutputVideoRefreshPeriod(IntPtr displayLink);
+
+        [DllImport(LibPath, EntryPoint = "CVDisplayLinkRelease")]
+        public extern static void DisplayLinkRelease(IntPtr displayLink);
+    }
+}
index f6e4f5b..4d6ed79 100644 (file)
@@ -94,6 +94,20 @@ namespace OpenTK.Platform.MacOS
                         double freq = dict.GetNumberValue("RefreshRate");
                         bool current = currentMode.Ref == dict.Ref;
 
+                        if (freq <= 0)
+                        {
+                            IntPtr displayLink;
+                            CV.DisplayLinkCreateWithCGDisplay(currentDisplay, out displayLink);
+
+                            CVTime t = CV.DisplayLinkGetNominalOutputVideoRefreshPeriod(displayLink);
+                            if ((t.flags & (Int32)CV.TimeFlags.TimeIsIndefinite) != (Int32)CV.TimeFlags.TimeIsIndefinite)
+                            {
+                                freq = (double)t.timeScale / t.timeValue;
+                            }
+
+                            CV.DisplayLinkRelease(displayLink);
+                        }
+
                         //if (current) Debug.Write("  * ");
                         //else Debug.Write("    ");