EVT_IDD_CX_MONITOR_ASSIGN_SWAPCHAIN回调函数 (iddcx.h)
OS 调用 EVT_IDD_CX_MONITOR_ASSIGN_SWAPCHAIN,以通知间接显示驱动程序(IDD)适配器上的监视器的模式更改。
语法
EVT_IDD_CX_MONITOR_ASSIGN_SWAPCHAIN EvtIddCxMonitorAssignSwapchain;
NTSTATUS EvtIddCxMonitorAssignSwapchain(
[in] IDDCX_MONITOR MonitorObject,
[in] const IDARG_IN_SETSWAPCHAIN *pInArgs
)
{...}
参数
[in] MonitorObject
作系统使用不透明的驱动程序创建的IDDCX_MONITOR句柄,用于标识受模式更改影响的监视器。
[in] pInArgs
指向 IDARG_IN_SETSWAPCHAIN 结构的指针,其中包含用于设置间接交换链的驱动程序的信息。
返回值
(NTSTATUS)如果作成功,回调函数必须返回STATUS_SUCCESS,或NT_SUCCESS(status) 等于 TRUE 的另一个状态值。 如果发生错误,则 IDD 应返回 STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN 如果很有可能再次发生错误。 否则,它应返回相应的 NTSTATUS 错误代码。 请参阅“备注”。
言论
OS 调用 EvtIddCxMonitorAssignSwapChain,以便 IDD 可以设置其帧处理机制。 例如,IDD 可能会创建一个新线程来初始化 D3D 设备,然后循环处理帧(请参阅 ID 驱动程序示例)。
如果 EvtIddCxMonitorAssignSwapChain 返回成功,则 IDD 将拥有 IDARG_IN_SETSWAPCHAIN.hSwapChain 对象,并负责在停止处理帧时调用 WdfObjectDelete 释放交换链对象。 当 调用 evtIddCxMonitorUnassignSwapChain 时,或者当成功返回 EvtIddCxMonitorAssignSwapChain后帧处理循环中发生错误时,交换链处理可能会停止处理帧。 这同时适用于控制台和远程 ID 适配器以及所有 IddCx 版本。
从 Windows 10 版本 1903 开始,为了减少用户影响(例如,等待 IddCx 检查驱动程序所花费的时间),如果 EvtIddCxMonitorAssignSwapChain 报告除 STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN以外的错误代码,IddCx 将立即 bug 检查驱动程序。
如果驱动程序返回 STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN,IddCx 将通知桌面合成器。 需要创建新的交换链,因此 OS 将再次调用 EvtIddCxMonitorAssignSwapChain。 仅当出现刚刚发生的错误不会再次发生时,ID 驱动程序才应使用此返回代码。 也就是说,ID 驱动程序不应让用户使用不可用的桌面,因为它返回了错误代码,但未执行任何作,以确保不会再次发生相同的失败。 例如,如果在呈现适配器上创建 D3D 设备时驱动程序遇到错误,它可以调用 IddCxAdapterSetRenderAdapter 更改为另一个适配器(可能是另一个 GPU 或 WARP),然后返回 STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN。 OS 将在新的呈现适配器上创建新的交换链,并希望避免此错误。 尽管从 Windows 10 版本 1903 开始定义此错误代码,但 ID 驱动程序可以在以前的 OS 版本上返回此错误代码,从而导致无效。
交换链中图面的分辨率始终与目标模式集的分辨率相同。
图面的格式将是驱动程序支持的格式之一,但每个获取的缓冲区的格式可以在从帧到帧支持的格式之间更改。 驱动程序应检查获取的每个缓冲区的格式。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 10 |
支持的最低服务器 | Windows Server 2016 |
目标平台 | 窗户 |
标头 | iddcx.h |
IRQL | requires_same |