From a7f16dbde66f7231748b6c53754c87a4c65fe20f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Sat, 19 Nov 2022 21:28:28 +0100 Subject: [PATCH] Check if AMD GPU scaling is enabled to allow changing resolution by default --- PowerControl/Helpers/AMD.cs | 44 ++++++++++++++++++ .../WindowsSettingsBrightnessController.cs | 23 +++++---- PowerControl/MenuStack.cs | 4 +- dump/gpu_scaling/DisableGPUScale.reg | Bin 0 -> 1052 bytes dump/gpu_scaling/EnableGPUScaleAspect.reg | Bin 0 -> 1052 bytes dump/gpu_scaling/EnableGPUScaleCenter.reg | Bin 0 -> 1052 bytes dump/gpu_scaling/EnableGPUScaleFull.reg | Bin 0 -> 1052 bytes 7 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 PowerControl/Helpers/AMD.cs create mode 100644 dump/gpu_scaling/DisableGPUScale.reg create mode 100644 dump/gpu_scaling/EnableGPUScaleAspect.reg create mode 100644 dump/gpu_scaling/EnableGPUScaleCenter.reg create mode 100644 dump/gpu_scaling/EnableGPUScaleFull.reg diff --git a/PowerControl/Helpers/AMD.cs b/PowerControl/Helpers/AMD.cs new file mode 100644 index 0000000..3dabf67 --- /dev/null +++ b/PowerControl/Helpers/AMD.cs @@ -0,0 +1,44 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PowerControl.Helpers +{ + internal class AMD + { + // TODO: This CLSID is likely to change over time and be broken + // pnputil /enum-devices /class Display + const String GPUDriverKey = "SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}\\0000"; + const String DriverDesc = "DriverDesc"; + const String ExpectedDriverDesc = "AMD Custom GPU 0405"; + const String GPUScaling = "GPUScaling00"; + + internal static bool IsGPUScalingEnabled() + { + try + { + var registry = Registry.LocalMachine.OpenSubKey(GPUDriverKey); + if (registry == null) + return false; + + var driverDesc = registry.GetValue(DriverDesc); + if (driverDesc is String && ((string)driverDesc) != ExpectedDriverDesc) + return false; + + var scalingBytes = registry.GetValue(GPUScaling); + if (scalingBytes is not byte[]) + return false; + + var scaling = BitConverter.ToUInt32((byte[])scalingBytes); + return scaling == 1; + } + catch + { + return false; + } + } + } +} diff --git a/PowerControl/Helpers/WindowsSettingsBrightnessController.cs b/PowerControl/Helpers/WindowsSettingsBrightnessController.cs index cd8ffb9..1cb498c 100644 --- a/PowerControl/Helpers/WindowsSettingsBrightnessController.cs +++ b/PowerControl/Helpers/WindowsSettingsBrightnessController.cs @@ -11,16 +11,23 @@ namespace PowerControl.Helpers { public static int Get() { - using var mclass = new ManagementClass("WmiMonitorBrightness") + try { - Scope = new ManagementScope(@"\\.\root\wmi") - }; - using var instances = mclass.GetInstances(); - foreach (ManagementObject instance in instances) - { - return (byte)instance.GetPropertyValue("CurrentBrightness"); + using var mclass = new ManagementClass("WmiMonitorBrightness") + { + Scope = new ManagementScope(@"\\.\root\wmi") + }; + using var instances = mclass.GetInstances(); + foreach (ManagementObject instance in instances) + { + return (byte)instance.GetPropertyValue("CurrentBrightness"); + } + return -1; + } + catch + { + return -1; } - return -1; } public static int Get(double roundValue = 10.0) diff --git a/PowerControl/MenuStack.cs b/PowerControl/MenuStack.cs index 8d58d76..0f44734 100644 --- a/PowerControl/MenuStack.cs +++ b/PowerControl/MenuStack.cs @@ -56,7 +56,7 @@ namespace PowerControl Name = "Resolution", ApplyDelay = 1000, ResetValue = () => { - if (!Settings.Default.EnableExperimentalFeatures) + if (!AMD.IsGPUScalingEnabled() && !Settings.Default.EnableExperimentalFeatures) return null; return Helpers.PhysicalMonitorBrightnessController.GetAllResolutions().Last(); }, @@ -69,7 +69,7 @@ namespace PowerControl }, CurrentValue = delegate() { - if (!Settings.Default.EnableExperimentalFeatures) + if (!AMD.IsGPUScalingEnabled() && !Settings.Default.EnableExperimentalFeatures) return null; return Helpers.PhysicalMonitorBrightnessController.GetResolution(); }, diff --git a/dump/gpu_scaling/DisableGPUScale.reg b/dump/gpu_scaling/DisableGPUScale.reg new file mode 100644 index 0000000000000000000000000000000000000000..ca0a766eed3771f05345dd4adc6e65bf1837809c GIT binary patch literal 1052 zcmds$UrPc(6vfYT(034@GhD5(podzeq|{I|q75h7UEq|l|Q6ZScSjHGN zd!QDTOz?f^fGV>(BKDX$rxdHKGSrun$7o}x^rUB29;-AlR(A$01W6O^fqinC;Wi%K zjgq?1jc%!HStLywpovO#~cbzzUZ*BgMtOUxto@VH(t?GPDhS_P@%RBXqTz6(L z*P>^=g|DI!)?7O=yXP=yYHNUpsPK2p-wYe)p4OQ+B)bLQ7N1**4_yBfsNB@BImaAd z-D&Zgdhes7Dx<(FsKbe=s(@|pAwru|?%#6nAb`~pT$;|yYpgD7F=lf46&3ZuSzS1d ZqeFKGyNB`GA(y@B&O*I&&Ch46{ReojntlKP literal 0 HcmV?d00001 diff --git a/dump/gpu_scaling/EnableGPUScaleAspect.reg b/dump/gpu_scaling/EnableGPUScaleAspect.reg new file mode 100644 index 0000000000000000000000000000000000000000..531876a24bdb430553314967047a13fa9a214a37 GIT binary patch literal 1052 zcmds$-%0{e5XQgjpmz|jGj_GYf-Y*6k}^Zhh&IG@Q^8c!D2ZOZ`pvP0b+Z?U!=9ag zXU?2&zWMsR)lg&gG|{W(%BZeLeQa|rG}97G8SfBnf}T+e{|xUCeT=@ZU3si+ZMpAW z=epp`o!YuoO@U7Mw^ijI;H&5gZ>Rds?}uy{oK*gnW+c3Thb zMOmHcS~t|u<-U=_tMB|-9c#epHyxq-+Huz8{vS~ZRdPMe(^Zq2d~KHL9_W=Ed#0{C zOOWf(v%!zArYYKrJ2ASaAZToBVUJ*8GG-lNZv(&#`yK_;|P4zX5tFntlKP literal 0 HcmV?d00001 diff --git a/dump/gpu_scaling/EnableGPUScaleCenter.reg b/dump/gpu_scaling/EnableGPUScaleCenter.reg new file mode 100644 index 0000000000000000000000000000000000000000..22b4110f3ec175ba55834c3eff22a95d513d52f3 GIT binary patch literal 1052 zcmds$-%0{e5XQgjpmz|jGj`Vs3%aOPO3Dm1BiaztO$Ad?qa=Fu>Nm%Pb+Z?U!=9ag zXU?2&zWMsR)j%V4HP)+U%BZGTJ!~`0HPr%33GV=HjGj>w{}k^4eT2TRU3si+ZMpAW z=epp`om#q7RiRG!w^ZRD;w$S4Z=^aAbv2MHXrW%nIwkjrn?je{?jLJNRE*7H?8cSV z^r6~RGQ;<-J*v#>fY?L!f^tZC1=N?5&+4G(^r$B!AIT%e>JG5QSUjSAY#(GZyR8TJ zqO8tztsCm-aNp43)pP!=j@9S%n~uNm%Pb+Z?U!=9ag zXU?2&zWMsR)lg&g6zf$pWmH$BKDL?WnreZijCY6@qi58@KgBylAEWPUR~~CyTkgBp zxh^8>&G>Lrvr=TA&xQPRTvyroiR4`(urWim+LX-MF%v zK2nEDX87KN|f{#~N_@O-JaycAPc2|3_3pm0VBrbk(FLUz=sR2YMyPo{8(u z0^~aMZ1Cf&X@a)o&I;XA5Hz;6ut%^k8MBVCw*lcK+G)A)NBpKv+1X+$K6L%hz;a_l zI(yQRK56lrdLO`}I;+eSG{MAJRYtdYh~eg(_jlYJgrHglOXK;~FI3mLxI%J$iYj_0 eS07AQ(UE(Dy~A+rahJ_>&#`yO_~q`q+P?vMFPeV< literal 0 HcmV?d00001