WDDM 时序调用流程图
下图显示了从创建呈现设备到将内容呈现给显示器期间WDDM的时序调用流程图。
创建渲染设备
1.在应用程序请求创建呈现设备后,MIni小端口驱动程序将接收 DxgkDdiCreateDevice 调用。 Mini端口驱动程序通过返回指向DXGKARG_CREATEDEVICE结构的pInfo成员中的已填充DXGK_DEVICEINFO结构的指针,初始化 DMA) (的直接内存访问。
2.如果对MIni小端口驱动程序的 DxgkDdiCreateDevice 的调用成功,Microsoft Direct3D 运行时库将调用用户模式显示驱动程序的 CreateDevice 函数。
3.在 CreateDevice 调用中,用户模式显示驱动程序必须显式调用 pfnCreateContextCb 函数来创建一个或多个上下文,即在新创建的设备上执行的 GPU 线程。 Direct3D 运行时库返回D3DDDICB_CREATECONTEXT结构的pCommandBuffer和CommandBufferSize成员中的信息,以初始化命令缓冲区。
为设备创建表面
4.在应用程序请求为呈现设备创建表面后,Direct3D 运行时将调用用户模式显示驱动程序的 CreateResource 函数。
5.用户模式显示驱动程序的 CreateResource 调用 pfnAllocateCb 运行时提供的函数。
- 6.Mini小端口驱动程序接收 DxgkDdiCreateAllocation 调用,指示要创建的分配的数量和类型。DxgkDdiCreateAllocation 返回有关DXGKARG_CREATEALLOCATION结构的pAllocationInfo成员中DXGK_ALLOCATIONINFO结构数组中的分配的信息。
向内核模式提交命令缓冲区
7.在应用程序请求绘制到图面后,Direct3D 运行时将调用与绘图操作相关的用户模式显示驱动程序函数,例如 DrawPrimitive2。
8.若要将命令缓冲区提交到内核模式,Direct3D 运行时需要调用用户模式显示驱动程序的 Present 或 Flush 函数。 此外,如果命令缓冲区已满,用户模式显示驱动程序将提交命令缓冲区。
- 9.如果调用了 Flush,则用户模式显示驱动程序将调用pfnPresentCb运行时提供的函数; 如果调用了Flush ,则调用pfnRenderCb运行时提供的函数,或者命令缓冲区已满。
- 10.如果调用了pfnPresentCb ,则Mini小端口驱动程序将接收对DxgkDdiPresent函数的调用,如果调用了pfnRenderCb ,则接收DxgkDdiRender或DxgkDdiRenderKm函数。 显示微型端口驱动程序验证命令缓冲区,以硬件的格式写入 DMA 缓冲区,并生成一个描述所使用的表面的分配列表。
将 DMA 缓冲区提交给硬件
- 11.Microsoft DirectX graphics 内核子系统调用显示微型端口驱动程序的 DxgkDdiBuildPagingBuffer 函数来创建特殊用途的 DMA 缓冲区(称为分页缓冲区),该缓冲区将分配列表中指定的分配移到和移出 GPU 可访问的内存。请注意,不会为每个帧调用DxgkDdiBuildPagingBuffer 。
12.DirectX 图形内核子系统调用显示微型端口驱动程序的 DxgkDdiSubmitCommand 函数,以将分页缓冲区排队到 GPU 执行单元中。
13.DirectX 图形内核子系统调用显示微型端口驱动程序的 DxgkDdiPatch 函数,以将物理地址分配给 DMA 缓冲区中的资源。
14.DirectX 图形内核子系统调用显示微型端口驱动程序的 DxgkDdiSubmitCommand 函数,将 DMA 缓冲区排队到 GPU 执行单元中。 提交到 GPU 的每个 DMA 缓冲区都包含一个数字的隔离标识符。 GPU 完成处理 DMA 缓冲区后,GPU 将生成一个中断。
15..Mini小端口驱动程序会在其 DxgkDdiInterruptRoutine 函数中通知中断。 显示微型端口驱动程序应从 GPU 读取刚完成的 DMA 缓冲区的防护标识符。
16..Mini小驱动程序应调用 DxgkCbNotifyInterrupt 函数,通知 DirectX 图形内核子系统 DMA 缓冲区已完成。 显示微型端口驱动程序还应调用 DxgkCbQueueDpc 函数,以便将延迟的过程调用排队 (DPC) 。