Skip to main content

Overview

The EDID (Extended Display Identification Data) parser provides functionality to load and parse monitor profiles from XML files, enabling automatic configuration of display modes, HDR capabilities, and color profiles.

Core Data Structures

EdidProfileData

Stores parsed EDID profile information:
struct EdidProfileData {
    vector<tuple<int, int, int, int>> modes;  // Display modes
    bool hdr10Supported = false;
    bool dolbyVisionSupported = false;
    bool hdr10PlusSupported = false;
    double maxLuminance = 0.0;
    double minLuminance = 0.0;
    wstring primaryColorSpace = L"sRGB";
    double gamma = 2.2;
    double redX = 0.64, redY = 0.33;
    double greenX = 0.30, greenY = 0.60;
    double blueX = 0.15, blueY = 0.06;
    double whiteX = 0.3127, whiteY = 0.3290;
    int preferredWidth = 1920;
    int preferredHeight = 1080;
    double preferredRefresh = 60.0;
};
Mode Tuple Format:
  • Element 0: Width (pixels)
  • Element 1: Height (pixels)
  • Element 2: Refresh rate multiplier (typically 1000)
  • Element 3: Nominal refresh rate (Hz)

Key Functions

LoadEdidProfile

Loads and parses an EDID profile from an XML file:
bool LoadEdidProfile(const wstring& profilePath, EdidProfileData& profile);
Parameters:
  • profilePath: Relative path to the EDID profile XML file (relative to config directory)
  • profile: Output parameter to receive parsed profile data
Returns: true if profile loaded successfully, false otherwise. File Location: The function looks for the profile at C:\VirtualDisplayDriver\<profilePath> Example:
EdidProfileData profile;
if (LoadEdidProfile(L"EDID/monitor_profile.xml", profile)) {
    // Profile loaded successfully
    vddlog("i", ("Loaded " + std::to_string(profile.modes.size()) + " modes").c_str());
}

ApplyEdidProfile

Applies a loaded EDID profile to the driver configuration:
bool ApplyEdidProfile(const EdidProfileData& profile);
Parameters:
  • profile: Loaded EDID profile data to apply
Returns: true if profile applied successfully, false if EDID integration is disabled. Functionality:
  • Merges EDID modes with manual configuration based on priority settings
  • Applies HDR metadata if enabled
  • Configures color primaries and color space settings
  • Generates gamma ramp configurations
  • Validates and optimizes final mode list

XML Profile Format

EDID profiles are stored in XML format with the following structure:
<?xml version="1.0"?>
<EdidProfile>
    <MonitorModes>
        <Mode>
            <Width>1920</Width>
            <Height>1080</Height>
            <RefreshRateMultiplier>1000</RefreshRateMultiplier>
            <NominalRefreshRate>60</NominalRefreshRate>
        </Mode>
        <!-- Additional modes -->
    </MonitorModes>
    
    <HDRCapabilities>
        <HDR10Supported>true</HDR10Supported>
        <DolbyVisionSupported>false</DolbyVisionSupported>
        <HDR10PlusSupported>false</HDR10PlusSupported>
        <MaxLuminance>1000.0</MaxLuminance>
        <MinLuminance>0.05</MinLuminance>
    </HDRCapabilities>
    
    <ColorProfile>
        <PrimaryColorSpace>sRGB</PrimaryColorSpace>
        <Gamma>2.2</Gamma>
        <RedX>0.64</RedX>
        <RedY>0.33</RedY>
        <GreenX>0.30</GreenX>
        <GreenY>0.60</GreenY>
        <BlueX>0.15</BlueX>
        <BlueY>0.06</BlueY>
        <WhiteX>0.3127</WhiteX>
        <WhiteY>0.3290</WhiteY>
    </ColorProfile>
    
    <PreferredMode>
        <Width>1920</Width>
        <Height>1080</Height>
        <RefreshRate>60.0</RefreshRate>
    </PreferredMode>
</EdidProfile>

Mode Management Functions

GenerateModesFromEdid

Generates and filters display modes from EDID profile based on configuration settings:
vector<tuple<int, int, int, int>> GenerateModesFromEdid(const EdidProfileData& profile);
Filtering Criteria:
  • Resolution range (min/max width and height)
  • Refresh rate range (min/max refresh rate)
  • Fractional rates exclusion (optional)
  • Aspect ratio validation
Returns: Filtered and sorted list of display modes. Example:
EdidProfileData profile;
LoadEdidProfile(L"EDID/monitor_profile.xml", profile);
vector<tuple<int, int, int, int>> modes = GenerateModesFromEdid(profile);
// Returns modes filtered by current driver settings

FindPreferredModeFromEdid

Locates the preferred display mode from the EDID profile:
tuple<int, int, int, int> FindPreferredModeFromEdid(
    const EdidProfileData& profile,
    const vector<tuple<int, int, int, int>>& availableModes
);
Parameters:
  • profile: EDID profile containing preferred mode information
  • availableModes: List of available modes to search
Returns: Preferred mode tuple, or fallback mode if preferred mode not found.

MergeAndOptimizeModes

Merges manual and EDID modes based on priority settings:
vector<tuple<int, int, int, int>> MergeAndOptimizeModes(
    const vector<tuple<int, int, int, int>>& manualModes,
    const vector<tuple<int, int, int, int>>& edidModes
);
Priority Modes:
  • "edid": Use only EDID modes
  • "manual": Use only manual modes
  • "combined": Merge both, removing duplicates
Returns: Merged mode list based on sourcePriority global setting.

OptimizeModeList

Optimizes the final mode list for performance and compatibility:
vector<tuple<int, int, int, int>> OptimizeModeList(
    const vector<tuple<int, int, int, int>>& modes,
    const tuple<int, int, int, int>& preferredMode
);
Optimizations:
  • Places preferred mode first in the list
  • Removes duplicate modes
  • Limits total modes to 32 for optimal performance
  • Sorts by resolution and refresh rate

ValidateModeList

Validates a mode list and generates diagnostic report:
bool ValidateModeList(const vector<tuple<int, int, int, int>>& modes);
Validation Checks:
  • Non-empty mode list
  • Resolution distribution analysis
  • Refresh rate variety
  • Preferred mode confirmation
Returns: true if validation passes, false otherwise.

HDR Metadata Conversion

ConvertEdidToSmpteMetadata

Converts EDID profile data to SMPTE ST.2086 HDR metadata format:
VddHdrMetadata ConvertEdidToSmpteMetadata(const EdidProfileData& profile);
Conversion:
  • Chromaticity coordinates: 0.0-1.0 → 0-50000 (SMPTE format)
  • Luminance values: nits → 0.0001 cd/m² units
  • Content light levels from configuration settings
Example:
EdidProfileData profile;
LoadEdidProfile(L"EDID/monitor_profile.xml", profile);
VddHdrMetadata metadata = ConvertEdidToSmpteMetadata(profile);
if (metadata.isValid) {
    // Use metadata for HDR display configuration
}

Color Space Conversion

ConvertEdidToGammaRamp

Generates gamma ramp from EDID color profile:
VddGammaRamp ConvertEdidToGammaRamp(const EdidProfileData& profile);
Supported Color Spaces:
  • sRGB (gamma 2.2)
  • DCI-P3 (gamma 2.4)
  • Rec.2020 (gamma 2.4)
  • Adobe RGB (gamma 2.2)
Returns: VddGammaRamp structure with gamma value, color space, and optional 3x4 transformation matrix.

Configuration Settings

EDID integration behavior is controlled by global settings:
// Enable/disable EDID integration
bool edidIntegrationEnabled = false;

// Auto-configure from EDID
bool autoConfigureFromEdid = false;

// EDID profile path
wstring edidProfilePath = L"EDID/monitor_profile.xml";

// Override manual settings with EDID data
bool overrideManualSettings = false;

// Fall back to manual settings on error
bool fallbackOnError = true;

// Auto resolutions from EDID
bool autoResolutionsEnabled = false;

// Source priority for mode merging
wstring sourcePriority = L"manual";  // "edid", "manual", or "combined"

Error Handling

All EDID functions include comprehensive error handling:
  • File not found: Returns false, logs warning
  • XML parsing errors: Returns false, logs error with details
  • Invalid data values: Uses defaults, logs warning
  • Empty mode list: Falls back to manual configuration

References

  • Source File: ~/workspace/source/Virtual Display Driver (HDR)/MttVDD/Driver.cpp (lines 661-1301)
  • EDID Standard: VESA Enhanced Extended Display Identification Data Standard
  • SMPTE ST.2086: Mastering Display Color Volume Metadata

Build docs developers (and LLMs) love