天天看点

Submitting a Command Buffer(MSDN翻译)Submitting a Command Buffer

Submitting a Command Buffer

要在Vista的图形栈中传递Command buffer需要进行如下操作。

  1. 如果D3D RT调用下列任一UMD函数来执行指定的操作,则UMD会开始提交Command buffer。
    • Present - 显示图形.
    • Flush - 提交硬件指令.
    • Lock - lock在当前指令块中使用的一个资源。
    Note 另外UMD总会在UMD bufferf填满时开始提交command buffer.
  2. UMD调用D3D RT的pfnRenderCb方法来提交Command buffer 给D3D RT。
  3. DXGK子系统调用KMD的DxgkDdiRender或DxgkDdiRenderKm来验证Command Buffer,然后用改变格式将Command Buffer的内容写入DMA Buffer并且声称一个surface需要使用的Allocation列表。注意DMA buffer这时并没有被patched(被指定物理地址(PS:这里的未指定物理地址的含义应该是指显示物理地址,即GPU能通过该地址访问到系统内存))。Note: 如果该Command buffer提交是因为D3D RT调用UMD 的Present发起,DXGK子系统会调用KMD的DxgkDdiPresent而不是DxgkDdiRender或DxgkDdiRenderKm。 
  4. VMM调用KMD的DxgkDdiBuildPagingBuffer来创建特殊目的的DMA buffer,即Paging Buffer。Paging Buffer用来将DMA buffer相应的Allocation list中引用的allocation内容Page in或 out显存。详细信息参见Paging Video Memory Resources。
  5. GPU Scheduler调用KMD的DxgkDdiPatch来为DMA buffer中的资源指定物理地址(为GPU能访问的物理地址)。但是Scheduler并不会为Paging buffer调用DxgkDdiPatch来指定物理地址,因为Paging buffer用到的物理地址在DxgkDdiBuildPagingBuffer的时候就被传递并指定了。
  6. GPU Scheduler 调用KMD的DxgkDdiSubmitCommand来请求KMD将Paging buffer插入GPU执行单元的队列。
  7. GPU Scheduler调用KMD的DxgkDdiSubmitCommand来请求KMD将DMA buffer插入GPU执行单元的队列。每一个提交的DMA buffer中包含一个fence id。GPU会在执行完DMA buffer之后产生一个中断通知OS。
  8. KMD通过DxgkDdiInterruptRoutine收到这个中断并从GPU硬件中读取刚执行完成的DMA buffer的fence id。
  9. KMD应该调用DxgkCbNotifyInterrupt通知GPU Scheduler相应的DMA buffer被执行完成。
  10. KMD应调用DxgkCbQueueDpc来排队DPC(deferred procedure call)任务。
  11. KMD会在DPC回调中处理有关DMA buffer的大部分操作。