From d8b2c87cb1f28f6de52f81432cf5fbf0ab1b3929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Wed, 16 Nov 2022 20:38:45 +0100 Subject: [PATCH] Add `RTSS` Framelimit --- PowerControl/External/RTSS.cs | 122 ++++++++++++++++++++++++++++++++++ PowerControl/MenuStack.cs | 50 ++++++++++++++ images/power_control_2.png | Bin 0 -> 25158 bytes 3 files changed, 172 insertions(+) create mode 100644 PowerControl/External/RTSS.cs create mode 100644 images/power_control_2.png diff --git a/PowerControl/External/RTSS.cs b/PowerControl/External/RTSS.cs new file mode 100644 index 0000000..5e4d658 --- /dev/null +++ b/PowerControl/External/RTSS.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace PowerControl.External +{ + internal static class RTSS + { + public static bool GetProfileProperty(string propertyName, out T value) + { + var bytes = new byte[Marshal.SizeOf()]; + var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); + value = default(T); + try + { + if (!GetProfileProperty(propertyName, handle.AddrOfPinnedObject(), (uint)bytes.Length)) + return false; + + value = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject()); + return true; + } + catch + { + return false; + } + finally + { + handle.Free(); + } + } + + public static bool SetProfileProperty(string propertyName, T value) + { + var bytes = new byte[Marshal.SizeOf()]; + var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); + try + { + Marshal.StructureToPtr(value, handle.AddrOfPinnedObject(), false); + return SetProfileProperty(propertyName, handle.AddrOfPinnedObject(), (uint)bytes.Length); + } + catch + { + return false; + } + finally + { + handle.Free(); + } + } + + [DllImport("kernel32.dll", EntryPoint = "GetModuleHandleW", SetLastError = true)] + public static extern IntPtr GetModuleHandle(string moduleName); + + [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)] + static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", SetLastError = true)] + static extern IntPtr FindWindow(string lpClassName, string lpWindowName); + + [DllImport("C:\\Program Files (x86)\\RivaTuner Statistics Server\\RTSSHooks64.dll")] + public static extern uint SetFlags(uint dwAND, uint dwXOR); + + [DllImport("C:\\Program Files (x86)\\RivaTuner Statistics Server\\RTSSHooks64.dll", CharSet = CharSet.Ansi)] + public static extern void LoadProfile(string profile = GLOBAL_PROFILE); + + [DllImport("C:\\Program Files (x86)\\RivaTuner Statistics Server\\RTSSHooks64.dll", CharSet = CharSet.Ansi)] + public static extern void SaveProfile(string profile = GLOBAL_PROFILE); + + [DllImport("C:\\Program Files (x86)\\RivaTuner Statistics Server\\RTSSHooks64.dll", CharSet = CharSet.Ansi)] + public static extern void DeleteProfile(string profile = GLOBAL_PROFILE); + + [DllImport("C:\\Program Files (x86)\\RivaTuner Statistics Server\\RTSSHooks64.dll", CharSet = CharSet.Ansi)] + public static extern bool GetProfileProperty(string propertyName, IntPtr value, uint size); + + [DllImport("C:\\Program Files (x86)\\RivaTuner Statistics Server\\RTSSHooks64.dll", CharSet = CharSet.Ansi)] + public static extern bool SetProfileProperty(string propertyName, IntPtr value, uint size); + + [DllImport("C:\\Program Files (x86)\\RivaTuner Statistics Server\\RTSSHooks64.dll", CharSet = CharSet.Ansi)] + public static extern void ResetProfile(string profile = GLOBAL_PROFILE); + + [DllImport("C:\\Program Files (x86)\\RivaTuner Statistics Server\\RTSSHooks64.dll", CharSet = CharSet.Ansi)] + public static extern void UpdateProfiles(); + + private static void PostMessage(uint Msg, IntPtr wParam, IntPtr lParam) + { + var hWnd = FindWindow(null, "RTSS"); + if (hWnd == IntPtr.Zero) + hWnd = FindWindow(null, "RivaTuner Statistics Server"); + + if (hWnd != IntPtr.Zero) + PostMessage(hWnd, Msg, wParam, lParam); + } + + public static uint EnableFlag(uint flag, bool status) + { + var current = SetFlags(~flag, status ? flag : 0); + UpdateSettings(); + return current; + } + + public static void UpdateSettings() + { + PostMessage(WM_RTSS_UPDATESETTINGS, IntPtr.Zero, IntPtr.Zero); + } + + public const uint WM_APP = 0x8000; + public const uint WM_RTSS_UPDATESETTINGS = WM_APP + 100; + public const uint WM_RTSS_SHOW_PROPERTIES = WM_APP + 102; + + public const uint RTSSHOOKSFLAG_OSD_VISIBLE = 1; + public const uint RTSSHOOKSFLAG_LIMITER_DISABLED = 4; + public const string GLOBAL_PROFILE = ""; + } +} diff --git a/PowerControl/MenuStack.cs b/PowerControl/MenuStack.cs index 7bafdfc..803d617 100644 --- a/PowerControl/MenuStack.cs +++ b/PowerControl/MenuStack.cs @@ -1,4 +1,5 @@ using CommonHelpers; +using PowerControl.External; using System; using System.Collections.Generic; using System.Diagnostics; @@ -63,10 +64,59 @@ namespace PowerControl ApplyValue = delegate(object selected) { Helpers.PhysicalMonitorBrightnessController.SetRefreshRate((int)selected); + Root["FPS Limit"].Update(); // force refresh FPS limit return Helpers.PhysicalMonitorBrightnessController.GetRefreshRate(); } }, new Menu.MenuItemWithOptions() + { + Name = "FPS Limit", + ApplyDelay = 500, + OptionsValues = delegate() + { + var refreshRate = Helpers.PhysicalMonitorBrightnessController.GetRefreshRate(); + return new object[] + { + "Off", refreshRate, refreshRate / 2, refreshRate / 4 + }; + }, + CurrentValue = delegate() + { + try + { + RTSS.LoadProfile(); + if (RTSS.GetProfileProperty("FramerateLimit", out int framerate)) + return (framerate == 0) ? "Off" : framerate; + } + catch + { + } + return null; + }, + ApplyValue = delegate(object selected) + { + try + { + int framerate = 0; + if (selected != null && selected.ToString() != "Off") + framerate = (int)selected; + + RTSS.LoadProfile(); + if (!RTSS.SetProfileProperty("FramerateLimit", framerate)) + return null; + if (!RTSS.GetProfileProperty("FramerateLimit", out framerate)) + return null; + RTSS.SaveProfile(); + RTSS.UpdateProfiles(); + return (framerate == 0) ? "Off" : framerate; + } + catch + { + } + return null; + } + }, + new Menu.MenuItemWithOptions() { Name = "TDP", Options = { "Auto", "3W", "4W", "5W", "6W", "7W", "8W", "10W", "12W", "15W" }, diff --git a/images/power_control_2.png b/images/power_control_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4ffc31368f08bf35e95c97ebaccc2476f3c47f94 GIT binary patch literal 25158 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