天天看點

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的大部分操作。