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