支持跨适配器资源扫描 (CASO)

CASO 前性能 (双复制路径)

从 Windows 8.1 (WDDM 1.3) 开始,D3D9 和 DXGI 应用程序能够在多适配器配置(如混合系统)上使用跨适配器演示支持。 借助此支持,呈现是在呈现适配器 (通常是离散 GPU) 上完成的,然后完成两个副本,将内容获取到显示适配器 (通常是集成 GPU) ,以便扫描到显示器。

  • 复制 1 从呈现适配器资源复制到跨适配器资源。
  • 复制 2 从跨适配器资源复制到显示适配器资源。

这些副本可能会限制应用的性能,尤其是针对低延迟而优化的应用。

使用 CASO 优化翻转演示文稿模型 (单复制路径)

Windows Server 2022 (WDDM 2.9) 及更高版本的驱动程序可以声明对适当的跨适配器资源层的支持,从而允许系统的表示堆栈优化跨适配器呈现。 无论设备配置如何,驱动程序都必须根据自己的适配器功能声明对此功能的支持,以便功能值在所有适用的硬件配置之间缩放。 此缩放包括但不限于具有动态附加其他外部 GPU 的单个 GPU 设备。

如果显示适配器支持 CASO,则系统仅执行从呈现适配器图面到跨适配器图面的第一次复制,然后直接从跨适配器图面扫描。 此功能可减少处理、带宽、电源和延迟。

CASO 功能是为翻转演示模型的 DXGI 运行时实现的。

CASO 的 DDI 更改和添加

指示对跨适配器资源的层支持

DXGI 实现对跨适配器资源的三层支持:

  1. 向/从跨适配器资源复制 (最低层)
  2. 从跨适配器资源进行纹理化
  3. 扫描跨适配器资源 (最高层)

每个较高层支持都必须保证其下面的层 () 得到支持。 例如,若要声明对跨适配器资源的扫描支持,驱动程序还必须支持纹理和复制。

驱动程序通过在 DXGK_DRIVERCAPS 中设置以下 DXGK_VIDMMCAPS 位字段值来声明 对每个层的支持MemoryManagementCaps

层含义 DXGK_VIDMMCAPS值
第 1 层 复制支持:向/从跨适配器资源复制 CrossAdapterResource (通过D3DKMT_WDDM_1_3_CAPS中的SupportCrossAdapterResource 位由图形内核公开给用户模式
第 2 层 纹理支持:跨适配器资源的纹理) CrossAdapterResourceTexture (包括对着色器资源视图、无序访问视图和呈现目标)
第 3 层 CASO 支持:从跨适配器资源进行扫描 CrossAdapterResourceScanout

如果图形内核未以超集方式指示对三个层的支持,则适配器启动失败。 例如,如果设置了 CrossAdapterResourceTexture ,则必须设置 CrossAdapterResource

第 1 层支持要求

跨适配器资源的定义仍与用于 WDDM 1.3 第 1 层复制支持的相同。

第 2 层支持要求

这些要求类似于 D3D12 用户模式驱动程序 CrossAdapterRowMajorTextureSupported 功能 (上限) ;也就是说,设备支持着色器资源视图、无序访问视图和呈现跨适配器行主纹理的目标视图。 但是,尽管 D3D12 的 CrossAdapterRowMajorTextureSupported 需要支持所有相关纹理格式,但此第 2 层上限至少只需要对第 3 层支持要求中列出的 DisplayScanOut 格式的支持。

由于 D3D12 的 cap 是此第 2 层上限的超集, 因此 D3D12CreateDevice 还会验证是否设置了内核驱动程序的 CrossAdapterResourceTexture cap(如果设置了 其 CrossAdapterRowMajorTextureSupported cap),并且如果未设置,则无法创建设备。

第 3 层支持要求

系统必须能够对以下最低规范的跨适配器资源执行支持的翻转功能(如 DXGK_FLIPCAPS 中驱动程序声明的那样):

  • 跨适配器主缓冲区大小为 1920 x 1080 或更小
  • 任何受支持的 DisplayScanOut 格式的缓冲区像素格式。 自 Windows 10 版本 20H1 起,这些格式为:
    • DXGI_FORMAT_R16G16B16A16_FLOAT
    • DXGI_FORMAT_R10G10B10A2_UNORM
    • DXGI_FORMAT_R8G8B8A8_UNORM
    • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
    • DXGI_FORMAT_B8G8R8A8_UNORM
    • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB

如果驱动程序支持扫描更多纹理格式的跨适配器资源,则它还必须支持根据层支持要求从这些格式进行纹理处理。

注意

DXGI 运行时查询驱动程序以获取其 CrossAdapterResourceScanout 支持。 如果受支持,则表示堆栈会进入单一复制路径。 因此,声明支持 CrossAdapterResourceScanout 的驱动程序需要支持 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI。 此外,对于上述最低规范的跨适配器主节点,它还必须支持所有相关的与演示文稿相关的 DDI。 例如: pfnCreateResourcepfnCheckMultiplaneOverlaySupportpfnPresentMultiplaneOverlay/pfnPresent1。 有关详细信息,请参阅 多平面覆盖支持。 有关退出 CASO 的详细信息,请参阅 用于呈现优化的驱动程序 DDI

这两个层都附带用于验证的 HLK 测试

支持DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3的 StaticCheck 标志

StaticCheck 标志已添加到 WDDM 3.0 中的 DXGK_MULTIPLANE_OVERLAY_FLAGS。 此标志扩展了 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI 对 CASO 支持的使用。 此标志允许 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 查询驱动程序,以确定使用 StaticCheck 标志标记的平面是否能够进行扫描。此调用是一次性调用,不应影响实际的演示行为。 因此,对 来自 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 的当前信息执行任何缓存的驱动程序不应包含具有 StaticCheck 平面的 DDI 调用中的信息。 它们应仅以独立或静态方式执行支持确定。

设置了 StaticCheck 标志的DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3保证:

  • 恰好有一个平面标有标志
  • 不包含任何 PostComposition 平面信息

在创建缓冲区期间(例如在创建交换链或 ResizeBuffers 期间)期间,会从 DXGI 应用进程使用对设置了 StaticCheck 标志的DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3的调用,以尽力确定当前硬件配置是否支持 CASO。

HybridIntegrated 特殊情况

请务必注意, HybridIntegrated 驱动程序旨在提供第 3 层扫描输出支持。 从 WDDM 3.0 开始, 混合集成 驱动程序需要声明对 CrossAdapterResourceScanout 的支持。 HLK 测试验证此要求。

将来可能会考虑弃用现有的混合上限。 因此,必须分离 CrossAdapterResourceScanout 上限,以便进一步在此空间中发展更大的灵活性。 因此,即使不是 HybridIntegrated 的驱动程序也可以根据需要设置跨适配器支持层。

图形内核更改

从 WDDM 2.9 开始,针对跨适配器资源支持进行了以下添加/更改:

示例用法:

D3DKMT_CROSSADAPTERRESOURCE_SUPPORT KernelSupport = {};
D3DKMT_QUERYADAPTERINFO QueryAdapterInfo;
QueryAdapterInfo.hAdapter = m_hAdapter;
QueryAdapterInfo.Type = KMTQAITYPE_CROSSADAPTERRESOURCE_SUPPORT;
QueryAdapterInfo.pPrivateDriverData = &KernelSupport;
QueryAdapterInfo.PrivateDriverDataSize = sizeof( KernelSupport );
VERIFY_SUCCEEDED(D3DKMTQueryAdapterInfo(&QueryAdapterInfo));

// Use KernelSupport.SupportTier as appropriate

用于呈现优化的驱动程序 DDI

驱动程序使用以下 DDI 来指示是否支持跨适配器扫描输出:

  • DXGK_VIDMMCAPS::CrossAdapterResourceScanout cap

    系统尽早查询此上限,以确定驱动程序是否支持 CASO 功能。

    如果驱动程序支持 CASO,则 DXGI 将继续使用单一副本 CASO 路径;否则,DXGI 会回退到双复制路径。

  • pfnCreateResource Ddi

    在单副本 CASO 路径上,DXGI 通过 pfnCreateResource 将跨适配器资源创建为显示适配器上的主要资源。 驱动程序应根据资源属性评估它是否可以从该资源中扫描出来。

    如果驱动程序支持基于资源属性进行扫描,则 DXGI 将继续使用单一副本 CASO 路径。 否则,驱动程序应通过返回 DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT来选择退出扫描。 在这种情况下,DXGI 回退到双复制路径。 仅当资源属性超出 第 3 层支持要求中列出的最低要求时,才会发生此回退。

  • pfnCheckMultiplaneOverlaySupport Ddi

    根据当前行为,桌面 Windows 管理器 (DWM) 调用显示驱动程序的 pfnCheckMultiplaneOverlaySupport DDI 以准确确定是否可以扫描主表面。如果驱动程序支持,则进行扫描。 否则,DWM 将回退到 DWM 组合模式。

    请注意,DWM 组合的呈现可能不如 独立翻转 (iFlip) 通过双复制路径或 iFlip 通过单一复制 CASO 路径。 因此,可能存在呈现带宽受限的常见显示方案(例如旋转或多显示器),其中驱动程序可能会一直无法通过 DWM 中的 pfnCheckMmultiplaneOverlaySupport 支持,从而导致比双复制路径更差的体验。

    为了缓解负回退体验,DXGI 在缓冲区创建期间调用 pfnCheckMultiplaneOverlaySupport ,并将交叉适配器资源用作标有 StaticCheck 标志的平面,以在给定现有已知带宽特征的情况下,以高准确度验证驱动程序是否可以执行扫描。 如果支持,DXGI 将继续使用单一副本 CASO 路径;否则,它将回退到双复制路径。

HLK 测试

添加了 WDDM 3.0 HLK 要求和功能及其相应的 HLK 测试。 此要求与驱动程序可以声明 的DXGK_VIDMMCAPS 支持相关联;具体而言, CrossAdapterResourceTextureCrossAdapterResourceScanout

CrossAdapterResourceTexture

添加了 HLK 测试来验证着色器资源视图 (SRV) 跨适配器资源上的操作。

  • 对于 D3D12,已将 Device.Graphics.AdapterRender.D3D12Core.CoreRequirement 测试的现有 HLK“D3D12 - 跨适配器资源 DX12”添加到;具体而言,CrossAdapterResource::CrossAdapterTextureSRV 测试用例。

    添加到此 HLK 测试用例的是验证 CrossAdapterResourceTexture KMD cap 和 D3D12 UMD CrossAdapterRowMajorTextureSupported cap 之间的超集关系。 同样, 在 D3D12CreateDevice 中添加了逻辑,以确保如果设置了其 UMD 上限,也必须设置内核第 2 层驱动程序上限,否则设备创建失败。

  • 对于 D3D11,上述测试用例已添加到 Device.Graphics.WDDM30.Render.CrossAdapterScanOut 的 HLK 测试中;具体而言,D3DConf_11_CrossAdapterResource::CrossAdapterResourceSRV。

跨适配器资源扫描

添加了以下 HLK 测试:

  • Device.Graphics.WDDM30.Render.CrossAdapterScanOut

    • 一个 HLK 测试,用于验证驱动程序是否可以成功创建跨适配器主资源,而无需通过 DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT 标志选择退出扫描行为。
    • 用于验证这些驱动程序是否支持 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI HLK 测试。
    • 测试人员手动执行 HLK 测试,用于手动验证:
      • 扫描出的交叉适配器表面没有视觉损坏/伪像或意外撕裂
      • 交叉适配器表面直接扫描出来,无需任何先前的内部转换或副本。

    这些端到端测试还会自然地验证跨适配器资源是否支持 CheckMultiplaneOverlaySupport 和 Present DDI。 手动测试应用具有一些特定的硬件要求,例如高分辨率和高刷新率监视器。 有关详细信息,请参阅测试随附的 参考文档

  • Device.Graphics.WDDM30.Render.CoreRequirement

    • 用于验证声明 HybridIntegrated cap 的驱动程序是否也声明 CrossAdapterResourceScanout 上限的 HLK 测试。
  • System.Fundamentals.Graphics.HybridGraphics.MultiGPU

    • 一种基于系统的 HLK 测试,使 OEM 能够在能够执行 DXGI 的单一副本路径作为端到端系统验证的一部分的混合设备上运行这些测试。