Skip to main content

What is IddCx?

IddCx (Indirect Display Driver Class eXtension) is a Microsoft framework introduced in Windows 10 that enables developers to create display drivers for non-traditional display devices. Unlike traditional display drivers that communicate with physical GPUs and monitors, IddCx drivers create “indirect” displays that exist in software.
The Virtual Display Driver is built on IddCx, leveraging Microsoft’s official framework for creating software-based displays that integrate seamlessly with Windows.

Framework Evolution

Version History

IddCx has evolved significantly since its introduction, with each version adding new capabilities:
Released: Windows 10 RTM / Anniversary Update (Build 14393)Initial release with core functionality:
  • Basic indirect display support
  • Standard SDR rendering
  • 8-bit color depth
  • UMDF 2.0 driver model
  • Basic monitor mode enumeration
Released: Windows 10 Creators Update (Build 15063)Enhanced capabilities:
  • Improved performance optimizations
  • Better multi-monitor support
  • Enhanced mode validation
  • Stability improvements
Released: Windows 10 Fall Creators Update (Build 16299)Major improvements:
  • Advanced swapchain management
  • Better GPU integration
  • Enhanced EDID support
  • Performance enhancements
Released: Windows 10 version 1903 (Build 18362)Significant additions:
  • Cursor support improvements
  • Better Direct3D integration
  • Enhanced multi-GPU scenarios
  • Improved power management
Released: Windows 10 version 2004 (Build 19041)Extended capabilities:
  • 10-bit color support
  • Enhanced HDR preparation
  • Advanced cursor handling
  • Better performance monitoring
  • Improved error handling
Released: Windows 11 (Build 22000)Windows 11 debut:
  • Native Windows 11 support
  • Enhanced DWM integration
  • Improved multi-monitor layouts
  • Better scaling support
Released: Windows 11 22H2 (Build 22621)Advanced features:
  • HDR10 static metadata support
  • Enhanced color management
  • Better gamma correction
  • Advanced EDID handling
Released: Windows 11 23H2 (Build 22631) / 24H2 (Build 26100)Latest capabilities:
  • Full HDR10 support with static metadata (SMPTE ST.2086)
  • 12-bit color depth for HDR+
  • Advanced color primaries (Rec.2020, DCI-P3)
  • Custom gamma correction and color space transforms
  • Hardware cursor support with alpha blending
  • Floating-point refresh rates (23.976 Hz, 59.94 Hz, etc.)
  • ARM64 architecture support
  • Enhanced monitor emulation capabilities

Windows Compatibility

Minimum Requirements

Operating System

Minimum: Windows 10 Creators Update (Build 15063) with IddCx 1.2Recommended: Windows 11 23H2+ (Build 22631) for full HDR and advanced features

Feature Availability by Version

FeatureIddCx VersionWindows BuildNotes
Basic Virtual Displays1.0+10240+Core functionality
8-bit SDR1.0+10240+Standard color
10-bit SDR1.5+19041+Enhanced color depth
Hardware Cursor1.4+18362+Alpha cursor support
HDR10 (10-bit)1.9+22621+High dynamic range
HDR+ (12-bit)1.10+22631+Maximum color precision
Floating Refresh Rates1.10+22631+Fractional Hz support
ARM64 Support1.10+26100+ARM processor compatibility
SMPTE ST.2086 Metadata1.10+22631+HDR static metadata
The Virtual Display Driver uses IddCx 1.10 and requires Windows 11 23H2 or later for full HDR functionality. Basic features work on Windows 10 20H1+.

Determining Your IddCx Version

The driver includes a utility to detect the IddCx version available on your system:

Using GetIddCx Utility

The GetIddCx tool queries your Windows build and reports the supported IddCx version:
// Source: GetIddCx/IddCxVersionQuery.cpp
std::map<DWORD, IddCxVersionInfo> versionMap = {
    {26100, {"Windows 11 24H2", "1.10", 0x1A80}},
    {22631, {"Windows 11 23H2", "1.10", 0x1A00}},
    {22621, {"Windows 11 22H2", "1.9", 0x1900}},
    {22000, {"Windows 11 21H2", "1.8", 0x1800}},
    {19041, {"Windows 10 20H1", "1.5", 0x1500}},
    // ... additional versions
};
# Run the GetIddCx utility
.\GetIddCx.exe

# Output example:
IddCx Version Query Tool
========================

Windows Build Number: 22631
Windows Version: Windows 11 23H2
IddCx Version: 1.10
IddCx Version Value: 0x1A00

Architecture Integration

Driver Model: UMDF

IddCx drivers use the User-Mode Driver Framework (UMDF), which provides several advantages:

User-Mode Execution

Runs in user space (Session 0), not kernel mode, reducing system crash risks

Enhanced Stability

Driver crashes won’t cause Blue Screen of Death (BSOD)

Easier Debugging

Standard debugging tools work without kernel debugger setup

Better Security

Limited privileges compared to kernel-mode drivers

Framework Components

IddCx provides a comprehensive set of interfaces:
#include <IddCx.h>  // Core IddCx framework

// Key callback events:
EVT_IDD_CX_ADAPTER_INIT_FINISHED
EVT_IDD_CX_ADAPTER_COMMIT_MODES
EVT_IDD_CX_MONITOR_QUERY_TARGET_MODES
EVT_IDD_CX_MONITOR_ASSIGN_SWAPCHAIN
EVT_IDD_CX_MONITOR_SET_DEFAULT_HDR_METADATA
EVT_IDD_CX_MONITOR_SET_GAMMA_RAMP

Core Concepts

Adapter Object

The IDDCX_ADAPTER represents the virtual display adapter:
IDDCX_ADAPTER m_Adapter;

// Initialize adapter
IDDCX_ADAPTER_CAPS adapterCaps = {};
adapterCaps.Size = sizeof(adapterCaps);
adapterCaps.MaxMonitorsSupported = 5;  // Up to 5 virtual monitors
adapterCaps.EndPointDiagnostics.Size = sizeof(adapterCaps.EndPointDiagnostics);

IddCxAdapterInitAsync(&adapterInitIn, &adapterInitOut);
The adapter is created once during driver initialization and persists until the driver is unloaded.

Monitor Object

Each virtual display is represented by an IDDCX_MONITOR:
IDDCX_MONITOR m_Monitor;

// Create monitor with EDID
IDDCX_MONITOR_CREATE monitorCreate = {};
monitorCreate.pEdidBlock = edidData;
monitorCreate.EdidBlockSize = edidSize;

IddCxMonitorCreate(m_Adapter, &monitorCreate, &m_Monitor);

SwapChain

The IDDCX_SWAPCHAIN manages frame buffers:
class SwapChainProcessor {
    IDDCX_SWAPCHAIN m_hSwapChain;
    
    void Run() {
        // Acquire frame from Windows compositor
        IddCxSwapChainReleaseAndAcquireBuffer(m_hSwapChain, &acquireBuffer);
        
        // Process the frame buffer
        ProcessFrame(acquireBuffer.pSurface);
        
        // Return buffer to IddCx
        IddCxSwapChainFinishedProcessingFrame(m_hSwapChain);
    }
};

Advanced IddCx 1.10 Features

HDR Static Metadata (SMPTE ST.2086)

IddCx 1.10 introduces full HDR metadata support:
EVT_IDD_CX_MONITOR_SET_DEFAULT_HDR_METADATA 
    VirtualDisplayDriverEvtIddCxMonitorSetDefaultHdrMetadata;

// HDR metadata structure
struct VddHdrMetadata {
    UINT16 display_primaries_x[3];  // RGB chromaticity
    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;
};

Gamma Correction and Color Transforms

EVT_IDD_CX_MONITOR_SET_GAMMA_RAMP 
    VirtualDisplayDriverEvtIddCxMonitorSetGammaRamp;

struct VddGammaRamp {
    FLOAT gamma;                    // Gamma value (e.g., 2.4)
    wstring colorSpace;             // sRGB, DCI-P3, Rec.2020
    FLOAT matrix[3][4];             // Color space transform
};

Hardware Cursor Support

// Cursor capabilities
IDDCX_CURSOR_CAPS cursorCaps = {};
cursorCaps.AlphaCursorSupport = TRUE;
cursorCaps.MaxX = 128;
cursorCaps.MaxY = 128;
cursorCaps.XorCursorSupport = IDDCX_XOR_CURSOR_SUPPORT_FULL;

Driver Callbacks

Essential Event Handlers

IddCx requires drivers to implement specific callbacks:
1

Adapter Initialization

EVT_IDD_CX_ADAPTER_INIT_FINISHED - Called when adapter is ready
2

Monitor Mode Query

EVT_IDD_CX_MONITOR_QUERY_TARGET_MODES - Enumerate supported resolutions
3

Mode Commit

EVT_IDD_CX_ADAPTER_COMMIT_MODES - Apply selected display modes
4

SwapChain Assignment

EVT_IDD_CX_MONITOR_ASSIGN_SWAPCHAIN - Receive frame buffers
5

HDR Metadata

EVT_IDD_CX_MONITOR_SET_DEFAULT_HDR_METADATA - Configure HDR parameters

Version Detection in Code

The driver can detect and adapt to the available IddCx version:
// From GetIddCx utility source
DWORD GetWindowsBuildNumber() {
    HMODULE hMod = GetModuleHandleW(L"ntdll.dll");
    RtlGetVersionPtr RtlGetVersion = 
        (RtlGetVersionPtr)GetProcAddress(hMod, "RtlGetVersion");
    
    RTL_OSVERSIONINFOW rovi = { 0 };
    rovi.dwOSVersionInfoSize = sizeof(rovi);
    RtlGetVersion(&rovi);
    
    return rovi.dwBuildNumber;
}

IddCxVersionInfo GetIddCxVersion(DWORD buildNumber) {
    // Maps build numbers to IddCx versions
    // Returns version capabilities
}

Performance Characteristics

Overhead Analysis

User-Mode Latency

Slight latency increase vs kernel-mode, but negligible for display use cases

Context Switching

Minimal overhead due to efficient UMDF-kernel communication

GPU Access

Direct GPU access via D3D11, no performance penalty

Frame Rate

Supports up to 240+ Hz with no framework-imposed limits

Next Steps

Architecture

Explore how the Virtual Display Driver implements IddCx

Virtual Displays

Learn about virtual display capabilities and use cases

GetIddCx Utility

Use the GetIddCx tool to check your system’s IddCx version

HDR Configuration

Configure HDR features (requires IddCx 1.10)

Build docs developers (and LLMs) love