The Virtual Display Driver supports HDR10 (High Dynamic Range) through SMPTE ST.2086 static metadata, enabling wider color gamuts and higher brightness ranges for compatible applications.
HDR10 support is configured in vdd_settings.xml under the hdr_advanced section:
<hdr_advanced>
<hdr10_static_metadata>
<enabled>true</enabled>
<max_display_mastering_luminance>1000.0</max_display_mastering_luminance>
<min_display_mastering_luminance>0.05</min_display_mastering_luminance>
<max_content_light_level>1000</max_content_light_level>
<max_frame_avg_light_level>400</max_frame_avg_light_level>
</hdr10_static_metadata>
</hdr_advanced>
Luminance Settings
max_display_mastering_luminance
Maximum display luminance in nits (cd/m²). Typical values:
- SDR displays: 100-300 nits
- HDR displays: 400-1000 nits
- Professional HDR: 1000-4000 nits
min_display_mastering_luminance
Minimum display luminance in nits. Lower values provide better contrast:
- Standard: 0.05-0.1 nits
- High-end: 0.0001-0.01 nits
Maximum brightness of any single pixel in nits (MaxCLL).
max_frame_avg_light_level
Maximum average brightness across entire frame in nits (MaxFALL).
The driver converts XML configuration to SMPTE ST.2086 format internally:
- Chromaticity coordinates: Scaled to 0-50000 range (from 0.0-1.0)
- Luminance values: Scaled to 0.0001 cd/m² units
- Content light levels: Direct nit values (0-65535 range)
// Internal conversion (Driver.cpp:851-866)
UINT16 ConvertChromaticityToSmpte(double edidValue) {
return static_cast<UINT16>(edidValue * 50000.0);
}
UINT32 ConvertLuminanceToSmpte(double nits) {
return static_cast<UINT32>(nits * 10000.0);
}
HDR Configuration Examples
Standard HDR Display (1000 nits)
<hdr10_static_metadata>
<enabled>true</enabled>
<max_display_mastering_luminance>1000.0</max_display_mastering_luminance>
<min_display_mastering_luminance>0.05</min_display_mastering_luminance>
<max_content_light_level>1000</max_content_light_level>
<max_frame_avg_light_level>400</max_frame_avg_light_level>
</hdr10_static_metadata>
Professional HDR (4000 nits)
<hdr10_static_metadata>
<enabled>true</enabled>
<max_display_mastering_luminance>4000.0</max_display_mastering_luminance>
<min_display_mastering_luminance>0.001</min_display_mastering_luminance>
<max_content_light_level>4000</max_content_light_level>
<max_frame_avg_light_level>1000</max_frame_avg_light_level>
</hdr10_static_metadata>
Conservative HDR (600 nits)
<hdr10_static_metadata>
<enabled>true</enabled>
<max_display_mastering_luminance>600.0</max_display_mastering_luminance>
<min_display_mastering_luminance>0.1</min_display_mastering_luminance>
<max_content_light_level>600</max_content_light_level>
<max_frame_avg_light_level>300</max_frame_avg_light_level>
</hdr10_static_metadata>
Color Depth Requirements
HDR10 requires at least 10-bit color depth. Configure in color_advanced section:
<color_advanced>
<bit_depth_management>
<auto_select_from_color_space>true</auto_select_from_color_space>
<force_bit_depth>10</force_bit_depth>
</bit_depth_management>
</color_advanced>
The driver automatically selects bit depth based on color space:
- Rec.2020: 10-bit (HDR)
- DCI-P3: 10-bit (Wide gamut)
- sRGB: 8-bit (SDR)
EDID Integration
When using EDID profiles, HDR metadata is automatically extracted from monitor_profile.xml:
<edid_integration>
<enabled>true</enabled>
<auto_configure_from_edid>true</auto_configure_from_edid>
</edid_integration>
The driver loads HDR capabilities from the EDID profile and converts them to SMPTE ST.2086 format. See Custom EDID for details.
HDR metadata is stored per-monitor in g_HdrMetadataStore (Driver.cpp:846) and applied during monitor initialization.
Windows Version Requirements
HDR10 support requires:
- Windows 10 version 1709 (Fall Creators Update) or later
- IddCx version 1.2 or later
- Compatible GPU with HDR support
Verification
To verify HDR configuration:
- Enable logging in
vdd_settings.xml:
<logging>
<logging>true</logging>
<debuglogging>true</debuglogging>
</logging>
- Check logs at
C:\VirtualDisplayDriver\Logs\ for:
[INFO] Generated SMPTE ST.2086 HDR metadata from EDID profile:
Red: (35400, 14600) → (0.708, 0.292)
Max Luminance: 10000000 (1000.0 nits)
- Use Windows HDR settings to verify display is detected as HDR-capable
Implementation Details
HDR metadata structure (Driver.cpp:826-843):
struct VddHdrMetadata {
UINT16 display_primaries_x[3]; // R, G, B (0-50000)
UINT16 display_primaries_y[3];
UINT16 white_point_x;
UINT16 white_point_y;
UINT32 max_display_mastering_luminance; // 0.0001 cd/m² units
UINT32 min_display_mastering_luminance;
UINT16 max_content_light_level;
UINT16 max_frame_avg_light_level;
bool isValid;
};
- Color Management - Configure color primaries, white point, and color space (Rec.2020 for HDR)
- Custom EDID - Load HDR capabilities from EDID files
Troubleshooting
HDR not detected:
- Verify
enabled is true in hdr10_static_metadata
- Check bit depth is set to 10 or higher
- Ensure color primaries are configured (see Color Management)
Colors look washed out:
- Lower
max_display_mastering_luminance to match your display
- Adjust
max_frame_avg_light_level for better tone mapping
Performance issues:
- HDR requires more bandwidth; reduce resolution or refresh rate if needed
- Use
YCbCr422 color format instead of RGB for better compression