Indirect display driver overview
The indirect display driver (IDD) model provides a simple user-mode driver model to support monitors that are not connected to traditional GPU display outputs. An example is a dongle connected to the PC via USB that has a regular (VGA, DVI, HDMI, DP etc) monitor connected to it.
An IDD is the third party-provided UMDF driver for the device. It is developed using the functionality exposed by the IddCx (Indirect Display Driver Class eXtension) to interface with the windows graphics subsystems in the following ways:
- Create the graphics adapter representing the indirect display device
- Report monitors being connected and disconnected from the system
- Provide descriptions of the monitors connected
- Provide available display modes
- Support other display functionality, like hardware mouse cursor, gamma, I2C communications, and protected content
- Process the desktop images to display on the monitor
Because an IDD is a UMDF driver, it is also responsible for implementing all UMDF functionality such as device communications, power management, plug and play etc.
The IDD runs in Session 0 without any components running in the user session, so any driver instability will not affect the stability of the system as a whole.
The following diagram provides an architectural overview.
The IDD is a user-mode only model with no support for kernel-mode components. As such, the driver is able to use any DirectX APIs in order to process the desktop image. In fact, the IddCx provides the desktop image to encode in a DirectX surface.
The driver should not call user-mode APIs that are not appropriate for driver use, such as GDI, windowing APIs, OpenGL, or Vulkan.
The IDD should be built as a universal windows driver so it can be used on multiple Windows platforms.
At build time, the UMDF IDD declares the version of IddCx it was built against and the OS ensures that the correct version of IddCx is loaded when the driver is loaded.
IddCx callback and function naming conventions
|EVT_IDD_CX_XXX||IDD callback function||IDDs implement both IddCx-specific callbacks such as EVT_IDD_CX_ADAPTER_COMMIT_MODES, as well as relevant WDF callbacks such as EVT_WDF_DEVICE_D0_EXIT.|
|IddCxXxx||Function||System-supplied IddCx class extension functions that IDDs can call; for example, IddCxAdapterInitAsync.|
|PFN_IDDCX_XXX||Pointers to IddCx functions||IDDs do not use these pointers. Instead, drivers should use the IddCxXxx functions.|
Microsoft provides a sample IDD implementation at the Windows Driver Samples GitHub. This sample demonstrates how to connect a monitor, how to respond to a mode set, and how to receive frames.