天天看點

Directx11教程(13) D3D11管線(1)

      從本篇教程開始,我們暫停代碼的學習,先來了解一下D3D11的管線,這些管線不涉及具體的硬體,而是着重于了解能夠支援D3D11的管線實作。

參考資料:

<a href="http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/">http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/</a>

<a href="http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/"></a>

通過前面的教程,我們知道,要用D3D11畫一個三角形,我們需要做以下步驟:

Directx11教程(13) D3D11管線(1)

       這些步驟大緻分為四個階段,初始化階段,資料裝配階段,shader執行階段,以及合并輸出階段。這些步驟最終會在D3D11硬體裝置上上執行。

     我們知道,顯示卡都有驅動程式,也就是driver,通過driver,windows系統才能和顯示卡硬體進行互動,完成渲染任務。

     通常顯示卡(GPU)的driver有D3D driver和OpenGL driver。 由于微軟各代D3D 之間并不完全相容,是以D3D driver有分為D3D9 driver,D3D10 driver,D3D11 driver,  D3D12 driver 等等。

Directx11教程(13) D3D11管線(1)

     首先是我們的3D應用程式, 它通過調用D3D11 API函數,實作建立資源(比如頂點緩沖),設定狀态(比如深度模版狀态),調用drawIndex函數等等。

     D3D運作庫會跟蹤我們設定的狀态,驗證函數的參數是否正确,驗證shader代碼以及shader連結庫, 編譯shader(把shader從原始的HLSL編譯成DX ASM, dx的彙編格式shader),另外它還有記憶體管理以及裝置管理的功能。DX運作庫的會把應用程式的調用最終傳送到使用者模式driver(UMD)中,從某種程度上來說,我們可以把DX運作庫看成一個包裝器,它是應用程式和UMD之間的接口。

    UMD(user mode driver)是指使用者模式driver,它其實就是一些動态連結庫(dll),完全運作在cpu端。GPU廠商都願意把更多的功能寫入UMD,因為其僅是一個dll,容易調試、可以實作多線程操作(比如一個線程編譯shader,一個線程處理紋理),即使UMD崩潰了,也不會引起系統藍屏,因為它和我們普通的應用程式沒有本質差別。

    UMD主要功能:編譯shader(把DX ASM編譯成特殊的IL,中間語言,再編譯成對應硬體的機器碼),轉化應用程式的狀态設定和drawcall到硬體識别的packet,并把packet放入到command buffer,另外UMD也有一些記憶體管理功能,比如虛拟位址管理。

    UMD最終會産生GPU中各個引擎的workload,比如圖形引擎,視訊編解碼引擎,DMA引擎,computer引擎等等,這些workload都以command buffer的形式傳到KMD中,再傳給相應的硬體引擎,讓它們去做這些工作。

    在UMD中,BLT操作管理是處理2D功能,主要就是buffer操作,比如stretch blt,color buffer clear,msaa resolve,記憶體copy等待。位址庫決定memory的布局,比如tile mode,對齊方式,swizzle操作等待。

    UMD中還有特殊硬體處理層和特殊軟體處理層,因為現在driver都是統一架構的,一套driver驅動不同代的顯示卡,是以UMD中特殊硬體處理層就是對特殊硬體進行一些操作,比如某代顯示卡有bug,可能就要在這個特殊處理層中進行一些補救操作。針對某些特殊軟體的優化就放在特殊軟體處理層中處理,比如某些跑分程式。

Directx11教程(13) D3D11管線(1)

     在UMD和KMD之間還有DXGI,這是微軟的DirectX圖形基礎架構,它的設計主要是進行一些底層的操作,它可以看作是KMD的運作庫,現在微軟把越來越多的底層管理放入到了DXGI中。比如顯存管理,commandbuffer的排程,同步操作,present後緩沖到前緩沖,顯示器的管理等等。3D應用程式也可以直接通路DXGI一部分功能,比如枚舉系統中使用的顯示卡。

      KMD( kernel mode driver),是指Kernel模式driver,KMD負責直接和硬體打交道,可能在系統中有多個UMD執行個體,但KMD隻能有一個。一旦KMD崩潰,作業系統可能會出現藍屏錯誤,KMD主要功能包括:

1、在多個應用程式使用GPU的情況下,KMD通過slice time分時操作來管理應用程式。

    比如在一個時間片内一個app進行實體記憶體操作,另一個時間片内另一個app初始化GPU,設定顯示模式等,在不同app間切換時,就需要context switch,響應中斷等。

2、ASCI的初始化,一套driver會對應多代的顯示卡,ASIC這兒就是指不同代的顯示卡,它們可能架構不同,KMD要針對目前的硬體,選擇合适的ASCI設定。

3. 電源管理,GPU記憶體資源的配置設定,回收。

4. command buffer送出到GPU硬體,以便GPU硬體開始buffer中的packet。

下圖為d3d11 api和driver的互動框圖,從中我們可以清晰的了解D3d api如何轉化為硬體的packet,并被送出到硬體引擎的ring buffer。

Directx11教程(13) D3D11管線(1)

繼續閱讀