diff --git a/app/Vdd/Utils.cs b/app/Vdd/Utils.cs index a6689b5..73f4241 100644 --- a/app/Vdd/Utils.cs +++ b/app/Vdd/Utils.cs @@ -77,27 +77,34 @@ namespace ParsecVDisplay.Vdd } /// + /// DXGI adapter vendor ids for VDD parent GPU selection. /// Ref: https://support.parsec.app/hc/en-us/articles/4423615425293-VDD-Advanced-Configuration#parent_gpu /// public enum ParentGPU { - Auto = 0, + Auto = 0, NVIDIA = 0x10DE, - AMD = 0x1002, + AMD = 0x1002, + Intel = 0x8086, } + const string PARAMETERS_KEY = + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\WUDF\\Services\\ParsecVDA\\Parameters"; + + const string VALUE_VENDOR_ID = "PreferredRenderAdapterVendorId"; + const string VALUE_DISABLE_CHANGE = "DisablePreferredRenderAdapterChange"; + /// /// Get parent GPU of VDD. /// public static ParentGPU GetParentGPU() { using (var parameters = Registry.LocalMachine.OpenSubKey( - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\WUDF\\Services\\ParsecVDA\\Parameters", - RegistryKeyPermissionCheck.ReadSubTree)) + PARAMETERS_KEY, RegistryKeyPermissionCheck.ReadSubTree)) { if (parameters != null) { - object value = parameters.GetValue("PreferredRenderAdapterVendorId"); + object value = parameters.GetValue(VALUE_VENDOR_ID); if (value != null) { return (ParentGPU)Convert.ToInt32(value); @@ -109,26 +116,28 @@ namespace ParsecVDisplay.Vdd } /// - /// Set parent GPU for VDD. - /// This function requires admin rights. + /// Set parent GPU for VDD. Requires admin rights. + /// The driver ships with DisablePreferredRenderAdapterChange = 1 which + /// blocks any vendor preference, so we toggle that to 0 before writing the + /// vendor id, and restore it to 1 when switching back to Auto. /// public static void SetParentGPU(ParentGPU kind) { using (var parameters = Registry.LocalMachine.OpenSubKey( - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\WUDF\\Services\\ParsecVDA\\Parameters", - RegistryKeyPermissionCheck.ReadWriteSubTree)) + PARAMETERS_KEY, RegistryKeyPermissionCheck.ReadWriteSubTree)) { - if (parameters != null) + if (parameters == null) + return; + + if (kind == ParentGPU.Auto) { - if (kind == ParentGPU.Auto) - { - parameters.DeleteValue("PreferredRenderAdapterVendorId", false); - } - else - { - parameters.SetValue("PreferredRenderAdapterVendorId", - (uint)kind, RegistryValueKind.DWord); - } + parameters.DeleteValue(VALUE_VENDOR_ID, false); + parameters.SetValue(VALUE_DISABLE_CHANGE, 1, RegistryValueKind.DWord); + } + else + { + parameters.SetValue(VALUE_DISABLE_CHANGE, 0, RegistryValueKind.DWord); + parameters.SetValue(VALUE_VENDOR_ID, (uint)kind, RegistryValueKind.DWord); } } }