提交命令缓冲区

必须执行以下操作序列以通过 Windows 图形堆栈传递命令缓冲区:

  1. 当 Direct3D 运行时调用以下任一 UMD 函数以执行指定操作时,用户模式显示驱动程序(UMD)将启动命令缓冲区提交。

    • 用于显示图形的 Present 函数。
    • 用于提交硬件命令的 Flush 函数。
    • 用于锁定资源(在当前命令批处理中使用的 Lock 函数)。

    只要命令缓冲区已满,UMD 也会启动命令缓冲区提交。

  2. UMD 调用 Direct3D 运行时的 pfnRenderCb 函数,将命令缓冲区提交到运行时。

  3. DirectX 图形内核子系统 (Dxgkrnl) 调用内核模式显示微型端口驱动程序 (KMD) DxgkDdiRender 或 DxgkDdiRenderKm 函数来验证命令缓冲区,以硬件格式编写 DMA 缓冲区,并生成描述所用图面的分配列表。 请注意,DMA 缓冲区尚未修补(即分配的物理地址)。 注意如果运行时通过调用 UMD 的 Present 函数启动命令缓冲区提交,图形子系统将调用 KMD 的 DxgkDdiPresent 函数,而不是 DxgkDdiRender 或 DxgkDdiRenderKm

  4. 视频内存管理器调用 KMD 的 DxgkDdiBuildPagingBuffer 函数,以创建特殊用途的 DMA 缓冲区(称为分页缓冲区),该缓冲区将 DMA 缓冲区随附的分配移入和移出 GPU 可访问的内存。 有关详细信息,请参阅 分页视频内存资源

  5. GPU 计划程序调用 KMD 的 DxgkDdiPatch 函数,将物理地址分配给 DMA 缓冲区中的资源。 但是,计划程序不需要调用 DxgkDdiPatch 将物理地址分配给分页缓冲区,因为分页缓冲区的物理地址是在 DxgkDdiBuildPagingBuffer 调用期间传入和分配的。

  6. GPU 计划程序调用 KMD 的 DxgkDdiSubmitCommand 函数,请求驱动程序将分页缓冲区排队到 GPU 执行单元。

  7. GPU 计划程序调用 KMD 的 DxgkDdiSubmitCommand 函数,请求驱动程序将 DMA 缓冲区排队到 GPU 执行单元。 提交到 GPU 的每个 DMA 缓冲区都包含围栏标识符。 GPU 处理完 DMA 缓冲区后,GPU 将生成中断。

  8. KMD 在其 DxgkDdiInterruptRoutine 函数中收到中断的通知。 KMD 应从 GPU 中读取刚刚完成的 DMA 缓冲区的栅栏标识符。

  9. KMD 应调用 DxgkCbNotifyInterrupt 函数,以通知 GPU 计划程序 DMA 缓冲区已完成。

  10. KMD 应调用 DxgkCbQueueDpc 函数来排队延迟过程调用(DPC)。

  11. KMD 的 DPC 被通知来负责大部分 DMA 缓冲区的处理。