共用方式為


Windows 顯示驅動程式模型 (WDDM) 作業流程

下圖顯示了從建立渲染裝置到將內容呈現到顯示器時所涉及的WDDM作業流程。 圖表後面的資訊會更詳細地描述作業流程的排序順序。

顯示WDDM作業流程的圖表,從建立轉譯裝置到顯示內容。

  • 建立轉譯裝置

    應用程式要求建立轉譯裝置之後:

    • 1: DirectX 圖形核心子系統 (Dxgkrnl) 會呼叫內核模式顯示迷你端口驅動程式 (KMD) 的 DxgkDdiCreateDevice 函式。

      KMD 透過在DXGKARG_CREATEDEVICE結構的pInfo成員中返回一個已填滿的DXGK_DEVICEINFO結構指標來初始化直接記憶體存取(DMA)。

    • 2:如果 對 DxgkDdiCreateDevice 的呼叫成功,Direct3D 運行時間會呼叫使用者模式顯示驅動程式的 ( UMD) CreateDevice 函式。

    • 3:在 CreateDevice 呼叫中,UMD 必須明確呼叫運行時間的 pfnCreateContextCb 函式,以建立一或多個 GPU 內容,這些是新建立裝置上執行的 GPU 線程。 運行時間會將資訊傳回 UMD,放在 D3DDDICB_CREATECONTEXT 結構的 pCommandBufferCommandBufferSize 成員中,以初始化指令緩衝區。

  • 建立裝置的表面

    應用程式要求為渲染裝置建立表面之後:

  • 將命令緩衝區提交至核心模式

    應用程式要求繪製至表面之後:

    • 7: Direct3D 執行時間會呼叫與繪圖作業相關的 UMD 函式,例如 DrawPrimitive2

    • 8: Direct3D 運行時間會呼叫 UMD 的 PresentFlush 函式,讓命令緩衝區提交至核心模式。 注意:當命令緩衝區已滿時,UMD 也會提交命令緩衝區。

    • 9:為了回應步驟 8,UMD 會呼叫下列其中一個運行時間提供的函式:

      • 如果呼叫了 Present,則會使用運行時間的 pfnPresentCb 函式。
      • 僅當呼叫 Flush 或命令緩衝區已滿時,運行階段的 pfnRenderCb 函式將被呼叫。
    • 10:如果呼叫 pfnPresentCb,則會呼叫 KMD 的 DxgkDdiPresent 函式,如果呼叫 pfnRenderCb,則呼叫 DxgkDdiRender 或 DxgkDdiRenderKm 函式。 KMD 會驗證命令緩衝區、以硬體格式寫入 DMA 緩衝區,併產生描述所使用介面的配置清單。

  • 將 DMA 緩衝區提交至硬體

    • 11Dxgkrnl 會呼叫 KMD 的 DxgkDdiBuildPagingBuffer 函式,以建立特殊用途的 DMA 緩衝區,以將配置清單中指定的配置移至 GPU 可存取記憶體或從 GPU 存取的記憶體。 這些特殊的 DMA 緩衝區稱為分頁緩衝區。 不會針對每個畫面呼叫 DxgkDdiBuildPagingBuffer

    • 12Dxgkrnl 會呼叫 KMD 的 DxgkDdiSubmitCommand 函式,將分頁緩衝區排入佇列至 GPU 執行單位。

    • 13Dxgkrnl 會呼叫 KMD 的 DxgkDdiPatch 函式,將實體位址指派給 DMA 緩衝區中的資源。

    • 14Dxgkrnl 會呼叫 KMD 的 DxgkDdiSubmitCommand 函式,將 DMA 緩衝區排入 GPU 執行單位佇列。 提交給 GPU 的每個 DMA 緩衝區都包含柵欄標識碼,也就是數位。 GPU 完成處理 DMA 緩衝區之後,GPU 會產生中斷。

    • 15:KMD 會在其 DxgkDdiInterruptRoutine 函式中收到中斷的通知。 KMD 應該從 GPU 讀取已完成 DMA 緩衝區的柵欄標識碼。

    • 16:KMD 應該呼叫 DxgkCbNotifyInterrupt ,以通知 Dxgkrnl DMA 緩衝區已完成。 KMD 也應該呼叫 DxgkCbQueueDpc 來將延遲程序呼叫 (DPC) 排入佇列。