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);
}
}
}