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

另请参阅

EvtIddCxMonitorUnassignSwapChain

IDARG_IN_SETSWAPCHAIN