Skip to main content
Virtual Display Driver is essential for headless servers—systems operating without physical monitors. VDD enables full display functionality for remote access, rendering tasks, and GPU-accelerated workloads on servers without connected displays.

Overview

Headless servers benefit from VDD because:
  • No physical display required: Enable full graphics functionality without hardware
  • Remote desktop access: Connect via RDP, VNC, or other protocols with full display support
  • GPU utilization: Leverage GPU capabilities for rendering, compute, and AI workloads
  • Cost savings: Eliminate the need for dummy HDMI plugs or physical monitors
  • Datacenter optimization: Run display-dependent applications in server environments
VDD is particularly valuable for cloud VMs, render farms, CI/CD systems, and remote development servers.

Basic Headless Server Setup

1

Install VDD on the server

Install Virtual Display Driver on your headless server:Using WinGet (recommended):
winget install --id=VirtualDrivers.Virtual-Display-Driver -e
Manual installation:
  1. Download the installer from GitHub Releases
  2. Extract the archive
  3. Run VDC (Virtual Driver Control)
  4. Click Install
If the server doesn’t have internet access, download the installer on another machine and transfer it via USB or network share.
2

Configure virtual display settings

Edit C:\VirtualDisplayDriver\vdd_settings.xml to configure appropriate display settings:
<vdd_settings>
  <monitors>
    <count>1</count>
  </monitors>
  
  <resolutions>
    <resolution>
      <width>1920</width>
      <height>1080</height>
      <refresh_rate>60</refresh_rate>
    </resolution>
  </resolutions>

  <colour>
    <SDR10bit>false</SDR10bit>
    <HDRPlus>false</HDRPlus>
    <ColourFormat>RGB</ColourFormat>
  </colour>

  <cursor>
    <HardwareCursor>true</HardwareCursor>
  </cursor>

  <logging>
    <logging>false</logging>
    <debuglogging>false</debuglogging>
  </logging>
</vdd_settings>
For headless servers, disable unnecessary features like HDR and debug logging to minimize overhead.
3

Set virtual display as primary

Make the virtual display the primary monitor:Using PowerShell:
# Navigate to Community Scripts directory
cd C:\VirtualDisplayDriver\"Community Scripts"
.\primary-VDD.ps1
Manually via remote session:
  1. Connect to the server via RDP
  2. Open Settings > System > Display
  3. Select the virtual display
  4. Check Make this my main display
  5. Click Apply
4

Configure remote access

Enable Remote Desktop on the server:
  1. Open Settings > System > Remote Desktop
  2. Enable Remote Desktop
  3. Configure firewall to allow RDP (port 3389)
  4. Note the server’s IP address or hostname
Via PowerShell:
# Enable Remote Desktop
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0

# Enable firewall rule
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
5

Test remote connection

From a client machine:
  1. Open Remote Desktop Connection (mstsc.exe)
  2. Enter the server IP or hostname
  3. Click Connect
  4. Enter credentials
  5. Verify you can see the virtual display

Automated Startup Configuration

Ensure VDD is properly configured on every server boot.

Startup Script

Create a PowerShell script to configure VDD at startup:
# vdd-startup.ps1
# Place in: C:\VirtualDisplayDriver\Scripts
# Configure as a scheduled task to run at startup

# Wait for driver initialization
Start-Sleep -Seconds 10

# Enable VDD if not already enabled
$vddStatus = pnputil /enum-devices /class Display | Select-String -Pattern "Virtual Display Driver"
if ($vddStatus -match "Disabled") {
    pnputil /enable-device "ROOT\VDD\0000"
    Start-Sleep -Seconds 5
}

# Set as primary display
cd "C:\VirtualDisplayDriver\Community Scripts"
.\primary-VDD.ps1

# Set desired resolution
.\changeres-VDD.ps1 -width 1920 -height 1080

# Log completion
Write-EventLog -LogName Application -Source "VDD" -EventId 1000 -Message "VDD startup configuration completed successfully"

Create Scheduled Task

Configure the script to run at system startup:
# Create scheduled task for VDD startup
$action = New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument '-ExecutionPolicy Bypass -File "C:\VirtualDisplayDriver\Scripts\vdd-startup.ps1"'
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable

Register-ScheduledTask -TaskName "VDD Startup Configuration" -Action $action -Trigger $trigger -Principal $principal -Settings $settings

Cloud VM Configuration

Optimize VDD for cloud virtual machines (Azure, AWS, GCP).

Azure VM Setup

1

Create Windows VM

Create a Windows Server VM in Azure:
  • Select Windows Server 2019/2022
  • Choose appropriate VM size with GPU if needed
  • Configure networking and storage
2

Install VDD via Remote Desktop

  1. Connect to the VM via RDP
  2. Install VDD using WinGet or manual installer
  3. Configure vdd_settings.xml for your needs
3

Configure for Azure RemoteApp (optional)

If using Azure RemoteApp:
  • Create a virtual display for each user profile
  • Set appropriate resolutions (1920×1080 recommended)
  • Configure GPU sharing if using GPU-enabled VMs
4

Optimize for cost

Minimize resource usage:
  • Use 60Hz refresh rate
  • Disable HDR and high bit-depth color
  • Set resolution to match typical client displays
  • Disable debug logging

AWS EC2 Setup

Similar process for AWS EC2 Windows instances:
  1. Launch Windows Server EC2 instance
  2. Configure security group to allow RDP (port 3389)
  3. Connect via RDP using EC2 key pair
  4. Install and configure VDD
  5. Create AMI for easy deployment

Google Cloud Platform

For GCP Compute Engine:
  1. Create Windows Server instance
  2. Set up firewall rules for RDP
  3. Generate Windows password
  4. Install VDD via RDP session
  5. Configure instance templates for scaling

GPU Workload Scenarios

VDD enables GPU-accelerated workloads on headless servers.

Render Farm Setup

1

Install rendering software

Common rendering software:
  • Blender: 3D rendering and animation
  • 3ds Max: Architectural visualization
  • Maya: VFX and animation
  • Cinema 4D: Motion graphics
  • V-Ray: High-end rendering
2

Configure VDD for rendering

Optimize virtual display for rendering:
<monitors>
  <count>1</count>
</monitors>
<resolutions>
  <resolution>
    <width>1920</width>
    <height>1080</height>
    <refresh_rate>30</refresh_rate>
  </resolution>
</resolutions>
<colour>
  <ColourFormat>RGB</ColourFormat>
</colour>
Lower refresh rate (30Hz) is fine for rendering previews.
3

Set up render queue management

Use render management software:
  • Deadline: Industry-standard render manager
  • Royal Render: Multi-platform render farm
  • Thinkbox: Amazon-owned render management
Configure to use the virtual display for viewport rendering.
4

Automate rendering tasks

Create scripts to:
  • Monitor render queue
  • Launch rendering software
  • Save outputs to network storage
  • Notify when renders complete

Machine Learning and AI

Use VDD for ML/AI workloads requiring display output:

Jupyter Notebook Server

# Install Jupyter
pip install jupyter notebook

# Start Jupyter with virtual display
jupyter notebook --no-browser --port=8888
Access via browser at http://server-ip:8888

TensorBoard Visualization

# Start TensorBoard on virtual display
tensorboard --logdir=./logs --host=0.0.0.0 --port=6006
Access TensorBoard remotely at http://server-ip:6006

Video Encoding Server

Use VDD for GPU-accelerated video encoding:
# FFmpeg with NVIDIA NVENC
ffmpeg -i input.mp4 -c:v h264_nvenc -preset fast -b:v 5M output.mp4

# HandBrake CLI with GPU acceleration
HandBrakeCLI -i input.mkv -o output.mp4 --encoder nvenc_h264

CI/CD Integration

Integrate VDD into continuous integration and deployment pipelines.

Jenkins Setup

1

Install Jenkins on server

# Download and install Jenkins
choco install jenkins

# Start Jenkins service
Start-Service jenkins
2

Configure Jenkins for GUI testing

  1. Install Jenkins plugins:
    • Windows Slaves Plugin
    • VNC Plugin (for monitoring)
  2. Create Jenkins job for GUI tests
  3. Configure job to run on virtual display
3

Run UI automation tests

# Example Jenkins pipeline script
pipeline {
    agent any
    stages {
        stage('UI Tests') {
            steps {
                // Ensure VDD is active
                powershell 'pnputil /enable-device "ROOT\\VDD\\0000"'
                
                // Run Selenium tests
                powershell 'pytest tests/ui_tests.py --display=:0'
            }
        }
    }
}

GitHub Actions with Self-Hosted Runner

Use VDD on self-hosted Windows runners:
name: UI Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v3
      
      - name: Enable VDD
        run: pnputil /enable-device "ROOT\VDD\0000"
        shell: powershell
      
      - name: Run UI Tests
        run: pytest tests/ui_tests.py
        shell: powershell

Multi-User Server Configuration

Configure VDD for multiple concurrent users.

Terminal Services Setup

1

Enable Remote Desktop Services

On Windows Server:
  1. Open Server Manager
  2. Add Remote Desktop Services role
  3. Configure RD Session Host
  4. Set up licensing
2

Configure per-user virtual displays

Each RDP session gets its own virtual display automatically. Configure appropriate defaults:
<monitors>
  <count>1</count>
</monitors>
<resolutions>
  <resolution>
    <width>1920</width>
    <height>1080</height>
    <refresh_rate>60</refresh_rate>
  </resolution>
</resolutions>
3

Set resource limits

Configure RDS resource limits per user:
  • Maximum memory usage
  • CPU allocation
  • GPU time slices (if GPU-enabled)
  • Display resolution limits

Monitoring and Maintenance

Health Monitoring Script

Monitor VDD status and automatically remediate issues:
# vdd-health-monitor.ps1
# Run as scheduled task every 5 minutes

function Test-VDDHealth {
    # Check if VDD device is enabled
    $vddDevice = Get-PnpDevice -FriendlyName "*Virtual Display*" -ErrorAction SilentlyContinue
    
    if ($null -eq $vddDevice) {
        Write-EventLog -LogName Application -Source "VDD Monitor" -EventId 2001 -EntryType Warning -Message "VDD device not found"
        return $false
    }
    
    if ($vddDevice.Status -ne "OK") {
        Write-EventLog -LogName Application -Source "VDD Monitor" -EventId 2002 -EntryType Warning -Message "VDD device status: $($vddDevice.Status)"
        
        # Attempt to enable
        pnputil /enable-device "ROOT\VDD\0000"
        Start-Sleep -Seconds 5
        return $false
    }
    
    return $true
}

function Test-DisplayConfiguration {
    # Verify virtual display is active
    $displays = Get-CimInstance -Namespace root\wmi -ClassName WmiMonitorBasicDisplayParams
    
    if ($displays.Count -eq 0) {
        Write-EventLog -LogName Application -Source "VDD Monitor" -EventId 2003 -EntryType Error -Message "No active displays found"
        return $false
    }
    
    return $true
}

# Main monitoring loop
$vddHealthy = Test-VDDHealth
$displayHealthy = Test-DisplayConfiguration

if ($vddHealthy -and $displayHealthy) {
    Write-EventLog -LogName Application -Source "VDD Monitor" -EventId 1001 -EntryType Information -Message "VDD health check passed"
} else {
    Write-EventLog -LogName Application -Source "VDD Monitor" -EventId 3001 -EntryType Error -Message "VDD health check failed"
    
    # Send alert (email, SMS, etc.)
    # Send-MailMessage -To "[email protected]" -Subject "VDD Health Alert" -Body "VDD health check failed on $env:COMPUTERNAME"
}

Performance Metrics

Collect VDD performance metrics:
# Get GPU usage
$gpu = Get-Counter -Counter "\GPU Engine(*engtype_3D)\Utilization Percentage"

# Get memory usage
$memory = Get-Counter -Counter "\Memory\Available MBytes"

# Get virtual display metrics
$displayInfo = Get-CimInstance -ClassName Win32_VideoController | Where-Object { $_.Name -match "Virtual" }

Write-Host "GPU Utilization: $($gpu.CounterSamples[0].CookedValue)%"
Write-Host "Available Memory: $($memory.CounterSamples[0].CookedValue) MB"
Write-Host "Virtual Display: $($displayInfo.VideoModeDescription)"

Best Practices for Headless Servers

For headless servers, minimize resource usage:
  • Resolution: 1920×1080 or lower
  • Refresh rate: 30-60Hz
  • Color depth: 8-bit
  • HDR: Disabled
  • Logging: Disabled
<resolutions>
  <resolution>
    <width>1920</width>
    <height>1080</height>
    <refresh_rate>60</refresh_rate>
  </resolution>
</resolutions>
<colour>
  <SDR10bit>false</SDR10bit>
  <HDRPlus>false</HDRPlus>
</colour>
<logging>
  <logging>false</logging>
</logging>
Always use automation for headless servers:
  • Scheduled task for startup configuration
  • Health monitoring scripts
  • Automatic remediation of common issues
  • Centralized configuration management
Configure multiple remote access methods:
  • RDP: Primary access method
  • PowerShell Remoting: For scripting and automation
  • SSH (OpenSSH on Windows): Alternative access
  • VNC: Backup remote access
Don’t rely on a single access method.
Implement comprehensive monitoring:
  • Windows Event Log for VDD events
  • Performance counters for GPU/memory
  • Remote monitoring system (SCOM, Nagios, Prometheus)
  • Alerting for failures
Prepare for issues:
  • Document VDD configuration
  • Create system images/snapshots
  • Test recovery procedures
  • Maintain backup access methods
  • Keep offline copies of VDD installer

Troubleshooting Headless Server Issues

Solution:
  1. Access server via out-of-band management (IPMI, iLO, iDRAC)
  2. Boot into Safe Mode
  3. Disable or uninstall VDD
  4. Verify server has correct display configuration
  5. Reinstall VDD with minimal settings
Solution:
  1. Verify VDD driver is set to start automatically:
    sc query VDD
    sc config VDD start= auto
    
  2. Create startup scheduled task (see Automated Startup Configuration)
  3. Check Windows Event Log for errors
  4. Ensure vdd_settings.xml has correct permissions
Solution:
  • Lower virtual display resolution to 1280×720 or 1920×1080
  • Reduce refresh rate to 30Hz
  • Disable RDP visual effects:
    # Disable desktop composition
    Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\DWM" -Name "Composition" -Value 0
    
  • Configure RDP client for better performance:
    • Connection speed: LAN
    • Experience: Remove background
    • Disable themes and animations
Solution:
  1. Verify GPU is properly installed and drivers are up to date
  2. Check GPU selection in vdd_settings.xml:
    <gpu>
      <friendlyname>NVIDIA Tesla T4</friendlyname>
    </gpu>
    
  3. Ensure application is configured to use the correct GPU
  4. Monitor GPU usage in Task Manager > Performance > GPU
  5. Check for GPU compatibility issues with VDD
Solution:
  • Configure separate RD Session Host servers
  • Implement load balancing
  • Set per-user resource limits
  • Ensure adequate GPU memory for concurrent sessions
  • Consider GPU partitioning (vGPU) for better isolation

Advanced Server Scenarios

Docker Container with GPU Access

Run VDD in Windows containers for isolated workloads:
FROM mcr.microsoft.com/windows/servercore:ltsc2022

# Install VDD
COPY VDD-installer.exe C:\temp\
RUN C:\temp\VDD-installer.exe /silent

# Configure VDD
COPY vdd_settings.xml C:\VirtualDisplayDriver\

# Your application
COPY app C:\app\
WORKDIR C:\app
CMD ["app.exe"]

Kubernetes Windows Nodes

Deploy VDD on Windows Kubernetes nodes for GPU workloads:
apiVersion: v1
kind: Pod
metadata:
  name: vdd-gpu-workload
spec:
  nodeSelector:
    kubernetes.io/os: windows
  containers:
  - name: renderer
    image: myregistry/renderer:latest
    resources:
      limits:
        nvidia.com/gpu: 1

High-Availability Server Cluster

Configure VDD across multiple servers for redundancy:
  1. Install VDD on all cluster nodes
  2. Configure identical vdd_settings.xml on each
  3. Set up load balancer for RDP connections
  4. Implement failover scripts
  5. Monitor cluster health

Remote Desktop Setup

Detailed guide for configuring remote desktop with VDD

PowerShell Scripts

Automation scripts for server management

Configuration Reference

Complete vdd_settings.xml configuration guide

Multi-GPU Setup

Configure VDD for multi-GPU server environments

Build docs developers (and LLMs) love