使用跨适配器资源在独立的 GPU 中进行渲染

从 Windows 8.1 开始,离散 GPU跨适配器资源用作:

  • 位块传输的目标 (bitblt) 或呈现操作,但没有拉伸或颜色转换。
  • 操作系统请求用户模式显示驱动程序向/从中执行 bitblt 或呈现操作的资源。

集成的 GPU 使用跨适配器资源作为:

  • 桌面窗口管理器在合成过程中 (DWM) 纹理。
  • GDI 硬件加速的呈现目标。
  • 显示主副本。
  • 不作为三维操作的呈现目标。

以下部分介绍应用程序在混合系统中的离散 GPU 上呈现的三种可能方案中涉及的体系结构和过程。

重定向的 bitblt 表示模型

显示用于在离散 GPU 上呈现的混合图形重定向 bitblt 模型的示意图。

  1. 顶级窗口的跨适配器资源是在内核模式下创建的,作为集成 GPU 上的标准分配。
  2. 在离散 GPU 上打开此资源时,DirectX 图形内核子系统 (Dxgkrnl.sys) 调用 DxgkDdiGetStandardAllocationDriverData 函数,并使用与集成 GPU 相同的后备存储 (大容量存储设备) 在离散 GPU 上创建新资源。
  3. Direct3D 运行时指示离散 GPU 的用户模式显示驱动程序使用专用驱动程序数据打开跨适配器资源。
  4. DirectX 应用程序在离散 GPU 上呈现到后台缓冲区资源。 请参阅图中的“呈现”操作。
  5. 当 DirectX 应用程序调用 Present 方法时,Direct3D 运行时会调用独立 GPU 的用户模式驱动程序的 PresentDXGI (或 pfnPresent) 函数,以将后台缓冲区复制到跨适配器资源。 请参阅图中的“Present”操作。
  6. 当 Windows 图形设备接口 (GDI) 应用程序呈现到顶级窗口时,DirectX 图形内核子系统调用集成 GPU 的显示微型端口驱动程序的 DxgkDdiRenderKm 函数,并指示跨适配器资源是呈现目标。 请参阅图中的 GDI 应用程序与跨适配器图面之间的连接。
  7. DWM 进程在集成 GPU 中打开跨适配器资源,并在合成期间将其用作源纹理。 请参阅图中的“合成”操作。

直接翻转演示文稿模型

说明用于在离散 GPU 上呈现的混合图形直接翻转模型的示意图。

  1. Direct3D 运行时指示离散 GPU 的用户模式显示驱动程序为每个交换链图面创建跨适配器资源。
  2. 在离散 GPU 上,如果直接翻转模式可用,Direct3D 运行时可能会设置 D3DDDI_ALLOCATIONINFO 结构的 PrimaryVidPnSourceId 成员。 调用 pfnAllocateCb 函数时,应传递这些成员值。
  3. Direct3D 运行时指示集成 GPU 的用户模式显示驱动程序打开要由 DWM 管理的跨适配器资源。
  4. 应用程序使用呈现目标纹理作为目标在离散 GPU 上呈现。 请参阅图中的“呈现”操作。
  5. 当应用程序调用 Present 方法时,Direct3D 运行时调用 BltDXGI (或 pfnBlt) 离散 GPU 的用户模式驱动程序的函数,以执行到跨适配器资源的复制。 然后,运行时调用分立 GPU 的用户模式驱动程序的 PresentDXGI (或 pfnPresent) 函数,并将源设置为跨适配器资源,目标分配设置为 NULL。 请参阅图中的“复制”操作。
  6. DWM 使用集成 GPU 中的资源执行其组合。 如果需要直接翻转操作 (DXGK_SEGMENTFLAGSDirectFlip 设置为) ,DWM 指示集成的 GPU 的显示微型端口驱动程序执行从一个跨适配器分配到另一个跨适配器分配的翻转操作。 请参阅图中的“DWM 翻转”操作。

全屏模型

  1. Direct3D 运行时指示集成的 GPU 的用户模式显示驱动程序为每个交换链图面创建跨适配器共享的主分配。
  2. Direct3D 运行时指示离散 GPU 的用户模式显示驱动程序打开跨适配器资源。
  3. 应用程序使用呈现目标纹理作为目标在离散 GPU 上呈现。
  4. 当应用程序调用 Present 方法时,Direct3D 运行时会指示离散 GPU 的用户模式显示驱动程序执行到跨适配器资源的复制。
  5. 指示集成 GPU 的用户模式显示驱动程序和显示微型端口驱动程序翻转到此跨适配器资源。