提交命令缓冲区

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

  1. 如果 Direct3D 运行时调用以下用户模式显示驱动程序函数之一来执行指定操作,则用户模式显示驱动程序将启动命令缓冲区提交:

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

    请注意,用户模式显示驱动程序也始终在命令缓冲区已满时启动命令缓冲区提交。

  2. 用户模式显示驱动程序调用 Direct3D 运行时的 pfnRenderCb 函数,将命令缓冲区提交到运行时。

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

  4. 视频内存管理器调用显示微型端口驱动程序的 DxgkDdiBuildPagingBuffer 函数,以创建特殊用途的 DMA 缓冲区(称为分页缓冲区),用于将 DMA 缓冲区随附的分配列表中指定的分配移入 GPU 可访问内存和从中移动。 有关详细信息,请参阅 分页视频内存资源

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

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

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

  8. 显示微型端口驱动程序在其 DxgkDdiInterruptRoutine 函数中收到中断的通知。 显示微型端口驱动程序应从 GPU 读取刚刚完成的 DMA 缓冲区的围栏标识符。

  9. 显示微型端口驱动程序应调用 DxgkCbNotifyInterrupt 函数,以通知 GPU 计划程序 DMA 缓冲区已完成。

  10. 显示微型端口驱动程序应调用 DxgkCbQueueDpc 函数,以将延迟过程调用 (DPC) 排队。

  11. 显示微型端口驱动程序的 DPC 会收到通知,以处理大部分 DMA 缓冲区处理。