Windows 顯示驅動程式模型 (WDDM) 作業流程
下圖顯示當呈現裝置呈現至顯示內容時,從 建立轉譯裝置時發生的WDDM作業流程。 圖表後面的資訊會更詳細地描述作業流程的排序順序。
建立轉譯裝置
應用程式要求建立轉譯裝置之後:
1:D irectX 圖形核心子系統 (Dxgkrnl) 會呼叫內核模式顯示迷你埠驅動程式的 (KMD) DxgkDdiCreateDevice 函式。
KMD 會傳回DXGKARG_CREATEDEVICE 結構之 pInfo 成員中填滿DXGK_DEVICEINFO結構的指標,以初始化直接記憶體存取(DMA)。
2:如果對 DxgkDdiCreateDevice 的呼叫成功,Direct3D 運行時間會呼叫使用者模式顯示驅動程式的 (UMD) CreateDevice 函式。
3:在 CreateDevice 呼叫中,UMD 必須明確呼叫運行時間的 pfnCreateContextCb 函式,以建立一或多個 GPU 內容,這些是新建立裝置上執行的 GPU 線程。 運行時間會將資訊傳回 pCommandBuffer 和 CommandBufferS D3DDDICB_CREATECONTEXT ize 結構中的 UMD,以初始化命令緩衝區。
建立裝置的 Surface
應用程式要求建立轉譯裝置介面之後:
4:D irect3D 運行時間會呼叫 UMD 的 CreateResource 函式。
5:CreateResource 會呼叫運行時間提供的 pfnAllocateCb 函式。
6:運行時間會呼叫 KMD 的 DxgkDdiCreateAllocation 函式,並指定要建立的配置數目和類型。 DxgkDdiCreateAllocation 會傳回DXGKARG_CREATEALLOCATION結構之 pAllocationInfo 成員中DXGK_ALLOCATIONINFO結構數位中配置的相關信息。
將命令緩衝區提交至核心模式
應用程式要求繪製至介面之後:
7:D irect3D 運行時間會呼叫與繪圖作業相關的 UMD 函式,例如 DrawPrimitive2。
8:D irect3D 運行時間會呼叫 UMD 的 Present 或 Flush 函式,讓命令緩衝區提交至內核模式。 注意:UMD 也會在命令緩衝區已滿時提交命令緩衝區。
9:為了回應步驟 8,UMD 會呼叫下列其中一個運行時間提供的函式:
- 如果呼叫 Present,則運行時間的 pfnPresentCb 函式。
- 如果呼叫 Flush 或命令緩衝區已滿,則運行時間的 pfnRenderCb 函式。
10:如果呼叫 pfnPresentCb,則會呼叫 KMD 的 DxgkDdiPresent 函式,如果呼叫 pfnRenderCb,則呼叫 DxgkDdiRender 或 DxgkDdiRenderKm 函式。 KMD 會驗證命令緩衝區、以硬體格式寫入 DMA 緩衝區,併產生描述所使用介面的配置清單。
將 DMA 緩衝區提交至硬體
11:D xgkrnl 會呼叫 KMD 的 DxgkDdiBuildPagingBuffer 函式,以建立特殊用途的 DMA 緩衝區,以將配置清單中指定的配置移至 GPU 可存取記憶體或從 GPU 存取的記憶體。 這些特殊的 DMA 緩衝區稱為分頁緩衝區。 不會針對每個畫面呼叫 DxgkDdiBuildPagingBuffer 。
12:D xgkrnl 會呼叫 KMD 的 DxgkDdiSubmitCommand 函式,將分頁緩衝區排入佇列至 GPU 執行單位。
13:D xgkrnl 會呼叫 KMD 的 DxgkDdiPatch 函式,將實體位址指派給 DMA 緩衝區中的資源。
14:D xgkrnl 會呼叫 KMD 的 DxgkDdiSubmitCommand 函式,將 DMA 緩衝區排入 GPU 執行單位佇列。 提交給 GPU 的每個 DMA 緩衝區都包含柵欄標識碼,也就是數位。 GPU 完成處理 DMA 緩衝區之後,GPU 會產生中斷。
15:KMD 會在其 DxgkDdiInterruptRoutine 函式中收到中斷的通知。 KMD 應該從 GPU 讀取剛完成之 DMA 緩衝區的柵欄標識碼。
16:KMD 應該呼叫 DxgkCbNotifyInterrupt ,以通知 DXGK DMA 緩衝區已完成。 KMD 也應該呼叫 DxgkCbQueueDpc 來將延遲過程調用排入佇列(DPC)。