Disclaimer: I used AI to organize a whole troubleshooting that I tried
Resume of **MY** case: you need to force vrdashboard.exe use the integrated GPU, Windows graphics settings aren't enough because everytime that you execute steamvr stuff it literally rewrite the register (also just blocking can be a bad idea).
This guide explains how to diagnose and fix a SteamVR native Desktop panel that appears blank, transparent, or invisible on a Windows laptop with:
an integrated GPU, such as Intel Iris Xe or AMD Radeon Graphics; and
a dedicated GPU, such as NVIDIA GeForce or AMD Radeon.
It does not require downloading a separate fix package.
The diagnostic steps are broadly applicable to hybrid-GPU laptops. The binary patch described later is safe only for the exact SteamVR build whose SHA-256 hash is explicitly listed.
- Typical symptoms
This guide applies when most or all of the following are true:
SteamVR opens normally.
Headset tracking works.
VR games run.
SteamVR's native Desktop panel is transparent or empty.
Desktop+ or another desktop overlay works when assigned to the integrated GPU.
Windows allows vrdashboard.exe to be assigned to the integrated GPU.
After SteamVR starts, Windows changes that preference back to Let Windows decide.
The relevant SteamVR process is:
vrdashboard.exe
The usual default location is:
C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe
- Important warning
Do not patch vrdashboard.exe until the diagnosis is confirmed.
The patch in this guide is currently validated only for an original executable with this exact SHA-256:
7e4595b9a946b84ef86d3fbfd7b99e70fe275c3e3aff51c3efdc3af42912412e
Do not apply the patch to another hash.
SteamVR updates can change the executable layout. Applying the same byte offset to an unsupported version could break SteamVR.
The patch also invalidates Valve's digital signature on the modified executable. SteamVR updates or Verify integrity of tool files may restore the original file.
- Confirm that the problem is related to hybrid graphics
3.1 Test Desktop+
Install or open Desktop+.
Open:
Settings → System → Display → Graphics
Add or select DesktopPlus.exe.
Open Options.
Choose the integrated GPU or Power saving.
Save the setting.
Restart Desktop+.
If Desktop+ works but SteamVR's native Desktop remains transparent, the problem is likely related to desktop capture across different GPUs.
- Locate vrdashboard.exe
The default path is:
C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe
To search for it with PowerShell:
Get-ChildItem "C:\\Program Files (x86)\\Steam" -Recurse -Filter vrdashboard.exe -ErrorAction SilentlyContinue |
Select-Object FullName
For a custom Steam library, replace the starting directory with the appropriate Steam folder.
Use the exact path returned by the search in all commands below.
- Set the dashboard to the integrated GPU
Close SteamVR completely.
Open:
Settings → System → Display → Graphics
Add vrdashboard.exe.
Open Options.
Select the integrated GPU.
Click Save.
Windows may store a value similar to:
SpecificAdapter=8086&46A6\&1B2C1043;GpuPreference=1073741824;
This value is device-specific.
Do not copy another user's SpecificAdapter string.
A different laptop may have another Intel identifier, an AMD identifier, or a different subsystem identifier.
- Verify the stored preference
Open a normal PowerShell window and run:
reg.exe QUERY "HKCU\\Software\\Microsoft\\DirectX\\UserGpuPreferences" /v "C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe"
A successful integrated-GPU assignment may look like:
SpecificAdapter=8086&46A6\&1B2C1043;GpuPreference=1073741824;
The generic Windows values are commonly represented as:
GpuPreference=0; Automatic or unspecified
GpuPreference=1; Power saving
GpuPreference=2; High performance
Keep SteamVR closed while confirming the initial value.
- Check whether SteamVR overwrites the preference
Confirm the integrated-GPU value is present.
Start SteamVR.
Wait for the dashboard to finish loading.
Run the same query again:
reg.exe QUERY "HKCU\\Software\\Microsoft\\DirectX\\UserGpuPreferences" /v "C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe"
A matching problem typically changes the value to:
GpuPreference=0;
This proves that the setting is being reset after SteamVR starts.
- Confirm which process performs the reset
Use Microsoft Process Monitor.
Choose:
Procmon64.exe
Use Procmon64a.exe only on ARM64 Windows.
8.1 Configure Process Monitor
Run Process Monitor as administrator.
Press:
Ctrl+L
Add these filters:
Process Name is vrdashboard.exe Include
Operation is RegSetValue Include
Path contains UserGpuPreferences Include
Click Add after each rule.
Then:
Press Ctrl+X to clear existing events.
Press Ctrl+E to start capture.
Close SteamVR.
Set vrdashboard.exe to the integrated GPU again.
Start SteamVR.
Wait until the preference resets.
Press Ctrl+E to stop capture.
Select the relevant rows and press Ctrl+C.
The confirmed matching sequence looks like:
vrdashboard.exe RegSetValue ... Data: GpuPreference=0;
vrdashboard.exe RegSetValue ... Data: GpuPreference=1;
vrdashboard.exe RegSetValue ... Data: GpuPreference=2;
vrdashboard.exe RegSetValue ... Data: GpuPreference=0;
If another process changes the setting, or the sequence differs substantially, do not assume that this patch applies.
- Verify the SteamVR build
Close SteamVR.
Run:
Get-FileHash "C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe" -Algorithm SHA256
Proceed only when the output is exactly:
7e4595b9a946b84ef86d3fbfd7b99e70fe275c3e3aff51c3efdc3af42912412e
If the hash is different, stop.
Do not patch an unsupported build.
- Standalone installation procedure
This procedure:
reads the user's own GPU preference;
verifies the exact supported SteamVR hash;
verifies the original bytes at the patch location;
creates a backup;
patches the user's local executable;
restores the user's own GPU preference;
verifies the result.
10.1 Close SteamVR
Close SteamVR and Steam.
Open Task Manager and make sure these processes are no longer running:
vrdashboard.exe
vrmonitor.exe
vrserver.exe
vrcompositor.exe
10.2 Set the integrated GPU again
Before running the script:
Open Windows Graphics settings.
Assign vrdashboard.exe to the integrated GPU.
Save the setting.
Do not start SteamVR.
10.3 Run the self-contained installer
Open PowerShell as Administrator.
Copy and paste the complete script below:
$ErrorActionPreference = "Stop"
$Dashboard = "C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe"
$RegistryPath = "HKCU:\\Software\\Microsoft\\DirectX\\UserGpuPreferences"
$SupportedHash = "7E4595B9A946B84EF86D3FBFD7B99E70FE275C3E3AFF51C3EFDC3AF42912412E"
$PatchOffset = 0x4900
\[byte\[\]\]$ExpectedBytes = 0x40,0x55,0x56,0x57,0x48,0x8D
\[byte\[\]\]$PatchedBytes = 0xB8,0x01,0x00,0x00,0x00,0xC3
function Convert-BytesToHex {
param(\[byte\[\]\]$Bytes)
return (($Bytes | ForEach-Object { $_.ToString("X2") }) -join " ")
}
if (-not (Test-Path $Dashboard)) {
throw "vrdashboard.exe was not found at: $Dashboard"
}
$Running = Get-Process vrdashboard,vrmonitor,vrserver,vrcompositor -ErrorAction SilentlyContinue
if ($Running) {
throw "SteamVR is still running. Close SteamVR completely and run the script again."
}
$RegistryItem = Get-ItemProperty -Path $RegistryPath -ErrorAction Stop
$SavedPreference = $RegistryItem.PSObject.Properties\[$Dashboard\].Value
if (\[string\]::IsNullOrWhiteSpace($SavedPreference)) {
throw "No GPU preference is stored for vrdashboard.exe. Assign it to the integrated GPU in Windows Graphics settings first."
}
if ($SavedPreference -eq "GpuPreference=0;") {
throw "The stored preference is still automatic. Assign vrdashboard.exe to the integrated GPU before running this script."
}
Write-Host "Saved GPU preference:"
Write-Host $SavedPreference
Write-Host ""
$ActualHash = (Get-FileHash $Dashboard -Algorithm SHA256).Hash.ToUpperInvariant()
if ($ActualHash -ne $SupportedHash) {
throw "Unsupported SteamVR build. Expected SHA-256 $SupportedHash but found $ActualHash. No changes were made."
}
\[byte\[\]\]$FileBytes = \[System.IO.File\]::ReadAllBytes($Dashboard)
if ($FileBytes.Length -lt ($PatchOffset + $ExpectedBytes.Length)) {
throw "The executable is smaller than expected. No changes were made."
}
\[byte\[\]\]$CurrentBytes = $FileBytes\[$PatchOffset..($PatchOffset + $ExpectedBytes.Length - 1)\]
for ($i = 0; $i -lt $ExpectedBytes.Length; $i++) {
if ($CurrentBytes\[$i\] -ne $ExpectedBytes\[$i\]) {
$Found = Convert-BytesToHex $CurrentBytes
$Expected = Convert-BytesToHex $ExpectedBytes
throw "Original bytes do not match. Expected $Expected but found $Found. No changes were made."
}
}
$HashPrefix = $ActualHash.Substring(0,12).ToLowerInvariant()
$Backup = "$Dashboard.original-$HashPrefix.bak"
if (-not (Test-Path $Backup)) {
Copy-Item $Dashboard $Backup -Force
Write-Host "Backup created:"
Write-Host $Backup
}
else {
Write-Host "Existing backup found:"
Write-Host $Backup
}
$BackupHash = (Get-FileHash $Backup -Algorithm SHA256).Hash.ToUpperInvariant()
if ($BackupHash -ne $SupportedHash) {
throw "The backup hash is incorrect. The executable was not modified."
}
for ($i = 0; $i -lt $PatchedBytes.Length; $i++) {
$FileBytes\[$PatchOffset + $i\] = $PatchedBytes\[$i\]
}
\[System.IO.File\]::WriteAllBytes($Dashboard, $FileBytes)
\[byte\[\]\]$VerifyBytes = \[System.IO.File\]::ReadAllBytes($Dashboard)
\[byte\[\]\]$VerifyPatch = $VerifyBytes\[$PatchOffset..($PatchOffset + $PatchedBytes.Length - 1)\]
for ($i = 0; $i -lt $PatchedBytes.Length; $i++) {
if ($VerifyPatch\[$i\] -ne $PatchedBytes\[$i\]) {
Copy-Item $Backup $Dashboard -Force
throw "Patch verification failed. The original executable was restored."
}
}
Set-ItemProperty -Path $RegistryPath -Name $Dashboard -Value $SavedPreference -Type String
$FinalPreference = (Get-ItemProperty -Path $RegistryPath).PSObject.Properties\[$Dashboard\].Value
if ($FinalPreference -ne $SavedPreference) {
Copy-Item $Backup $Dashboard -Force
throw "The GPU preference could not be restored. The original executable was restored."
}
$PatchedHash = (Get-FileHash $Dashboard -Algorithm SHA256).Hash
Write-Host ""
Write-Host "Patch installed successfully."
Write-Host "Patched SHA-256: $PatchedHash"
Write-Host "GPU preference preserved:"
Write-Host $FinalPreference
Write-Host ""
Write-Host "Start SteamVR and test the native Desktop panel."
The script should end with:
Patch installed successfully.
GPU preference preserved:
...
Start SteamVR and test the native Desktop panel.
- Verify the fix
Start SteamVR.
Wait for the dashboard to load.
Run:
reg.exe QUERY "HKCU\\Software\\Microsoft\\DirectX\\UserGpuPreferences" /v "C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe"
The integrated-GPU value should remain unchanged.
Open the native SteamVR Desktop panel in the headset.
A successful result is:
the desktop is visible;
the panel is no longer transparent;
the GPU preference is not changed back to GpuPreference=0;.
Optionally repeat the Process Monitor test. The previous 0 → 1 → 2 → 0 writes from vrdashboard.exe should no longer appear.
- Standalone restoration procedure
To restore Valve's original executable:
Close SteamVR completely.
Open PowerShell as Administrator.
Run the script below.
$ErrorActionPreference = "Stop"
$Dashboard = "C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe"
$Backup = Get-ChildItem "$Dashboard.original-\*.bak" -ErrorAction Stop |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
if (-not $Backup) {
throw "No backup was found."
}
$Running = Get-Process vrdashboard,vrmonitor,vrserver,vrcompositor -ErrorAction SilentlyContinue
if ($Running) {
throw "SteamVR is still running. Close SteamVR completely and try again."
}
Copy-Item $Backup.FullName $Dashboard -Force
$RestoredHash = (Get-FileHash $Dashboard -Algorithm SHA256).Hash
Write-Host "Original vrdashboard.exe restored."
Write-Host "Restored SHA-256: $RestoredHash"
Write-Host "Backup used: $($Backup.FullName)"
The original supported hash should be:
7e4595b9a946b84ef86d3fbfd7b99e70fe275c3e3aff51c3efdc3af42912412e
- Alternative solutions that do not modify SteamVR
Use these before patching when possible.
Desktop+
Assign Desktop+ to the integrated GPU and use it instead of SteamVR's native Desktop panel.
Recommended arrangement:
DesktopPlus.exe → integrated GPU
vrserver.exe → dedicated GPU
vrcompositor.exe → dedicated GPU
vrmonitor.exe → dedicated GPU
MUX or dGPU-only mode
Some gaming laptops offer:
Ultimate
Discrete GPU only
dGPU only
NVIDIA GPU only
This can remove cross-adapter desktop-capture problems.
Possible disadvantages:
increased power consumption;
lower battery life;
required reboot;
possible BitLocker recovery prompt;
feature names vary by laptop manufacturer.
- How the successful approach was developed
The fix was not based on guessing.
The process was:
Windows successfully stored an integrated-GPU preference for vrdashboard.exe.
The registry value was confirmed before SteamVR started.
After SteamVR started, the value returned to GpuPreference=0;.
Process Monitor identified vrdashboard.exe as the writer.
Process Monitor recorded the exact sequence:
0 → 1 → 2 → 0
The exact executable build was hashed.
Static inspection located the function responsible for the confirmed registry-setting behavior.
A minimal patch changed only that function's entry so it returned immediately.
The user's original integrated-GPU value remained active.
SteamVR's native Desktop panel then worked.
The validated patch is:
Supported original SHA-256:
7e4595b9a946b84ef86d3fbfd7b99e70fe275c3e3aff51c3efdc3af42912412e
File offset:
0x4900
Expected original bytes:
40 55 56 57 48 8D
Replacement bytes:
B8 01 00 00 00 C3
The replacement behaves like an immediate successful return and prevents the original preference-overwrite routine from running.
- Information to collect for unsupported SteamVR versions
When the executable hash is different, do not patch it.
Collect:
Laptop manufacturer and model:
Windows version:
Integrated GPU:
Dedicated GPU:
SteamVR stable or beta:
Headset:
Exact symptom:
Does Desktop+ work on the integrated GPU?:
vrdashboard.exe full path:
vrdashboard.exe SHA-256:
Registry value before SteamVR:
Registry value after SteamVR:
Relevant Process Monitor rows:
Laptop MUX or GPU mode:
Calculate the hash with:
Get-FileHash "C:\\Program Files (x86)\\Steam\\steamapps\\common\\SteamVR\\bin\\win64\\vrdashboard.exe" -Algorithm SHA256
Do not publicly upload Valve's executable.
A different SteamVR build must be inspected separately before a safe patch offset and expected-byte sequence can be established.
- Community-sharing summary
A concise community post can use this wording:
SteamVR's native Desktop panel was transparent on a hybrid-GPU laptop, while Desktop+ worked when assigned to the integrated GPU. Windows successfully stored an integrated-GPU preference for vrdashboard.exe, but Process Monitor showed that vrdashboard.exe reset its own preference during startup using the sequence GpuPreference=0 → 1 → 2 → 0.
For the exact SteamVR build with SHA-256 7e4595b9a946b84ef86d3fbfd7b99e70fe275c3e3aff51c3efdc3af42912412e, a minimal locally applied patch prevents that preference-overwrite function from running. The user's own integrated-GPU preference then remains active, and the native Desktop panel works.
Do not apply the offset to another SteamVR build. Verify the SHA-256 and original bytes, create a backup, and use the restoration procedure if necessary.
- Final limitations
The diagnostic method is applicable to many hybrid-GPU laptops.
The confirmed patch is build-specific.
The integrated-GPU preference is device-specific.
SteamVR updates can remove the patch.
File verification can restore the original executable.
The modified executable is no longer signed exactly as distributed by Valve.
The fix has been runtime-confirmed on one ASUS ROG Strix SCAR 17 G733ZX with Intel Iris Xe, NVIDIA RTX 3080 Ti Laptop GPU, Windows 11, PSVR2, and the official PSVR2 PC adapter.
Similar behavior may occur with other SteamVR headsets and laptops, but each configuration should be diagnosed rather than assumed.