IddCx 1.5、1.6 及更高版本的更新
IddCx 版本 1.5 和 1.6 中的以下更新适用于控制台和远程间接显示驱动程序 (IDD)。
更新了 IddCxGetVersion 版本
IddCxGetVersion 返回的 IddCx 版本已更新为版本 1.5 的 0x1500 以及版本 1.6 的 0x1600。 有关 IddCx 相关版本信息的完整列表,请参阅 IddCx 版本。
公共 IddCx 符号中的 WPP 信息
从 IddCx 版本 1.5 开始,公共 IddCx 符号文件包含所有 Windows 软件跟踪处理器 (WPP) 信息。 此更改意味着 !wmitrace.logdump 调试器命令将在内核调试器中解码并显示 WPP 消息。
能够访问系统内存中分配的缓冲区
在某些方案中,交换链缓冲区驻留在系统内存中;例如,WARP(Windows 高级光栅化平台、系统提供的软件呈现器)是要使用的呈现适配器。 IddCx 1.5 添加了以下 OS 回调,这些回调允许驱动程序访问系统内存中的缓冲区,从而避免了子资源副本:
IddCxSwapChainInSystemMemory 允许 IDD 检查交换链的缓冲区是否驻留在系统内存中。 此回调的结果将在整个交换链的生存期内保持不变。 驱动程序应在其 EvtIddCxMonitorAssignSwapChain 回调中检查此回调的值,并设置状态以释放和获取缓冲区。
IddCxSwapChainReleaseAndAcquireSystemBuffer 允许 IDD 释放和获取缓冲区,以及获取用于访问缓冲区的信息(例如系统内存指针、缓冲区间距/步幅以及表面格式和维度)。 返回的缓冲区将有效至下一次成功调用此函数。
在分配新交换链时,驱动程序必须确定将为特定交换链调用的 IddCxSwapChainReleaseAndAcquireBuffer/IddCxSwapChainReleaseAndAcquireSystemBuffer 变体,并且必须在该交换链的剩余生存期内继续使用该变体。 若要确定,驱动程序应考虑其特定要求,以及调用 IddCxSwapChainInSystemMemory 的结果。 驱动程序会导致操作系统在以下情况中检查 UMDF 进程的 bug:
- 调用 IddCxSwapChainReleaseAndAcquireSystemBuffer/IddCxSwapChainReleaseAndAcquireBuffer 的其他变体。
- 当 IddCxSwapChainInSystemMemory 返回 false 时,调用 IddCxSwapChainReleaseAndAcquireSystemBuffer。
建议使用驱动程序,但不需要使用这些回调函数。 IddCx 1.5 之前的行为仍受支持。
能够访问物理连续内存中的缓冲区
注意
任何 Windows 10 系统都不支持 IddCxSwapChainGetPhysicallyContiguousAddress,将来可能会弃用此项。
从 IddCx 1.6 开始,添加了 IDDCX_ADAPTER_FLAGS_PREFER_PHYSICALLY_CONTIGUOUS 标志和 IddCxSwapChainGetPhysicallyContiguousAddress OS 回调函数,以便可以在物理连续内存中访问缓冲区。
通过在 IDDCX_ADAPTER_CAPS 中设置 IDDCX_ADAPTER_FLAGS_PREFER_PHYSICALLY_CONTIGUOUS 标志,显示驱动程序可以请求在物理连续系统内存中分配主要表面。 此功能允许驱动程序直接扫描输出没有中间副本的表面。
不能保证初始化期间的驱动程序请求会成功。 如果请求未成功,则 IddCxAdapterInitAsync 调用不会失败。 相反,一旦驱动程序执行 IddCxSwapChainReleaseAndAcquireBuffer(或 IddCxSwapChainReleaseAndAcquireSystemBuffer),它应调用 IddCxSwapChainGetPhysicallyContiguousAddress 来检索表面的物理地址。 IddCxSwapChainGetPhysicallyContiguousAddress 将首先等待任何挂起的呈现命令,然后刷新与存储表面的地址范围关联的 CPU 缓存并使其失效。 但是,如果要在物理连续内存中分配的表面初始请求失败,则 IddCxSwapChainGetPhysicallyContiguousAddress 将返回 E_NOINTERFACE。