從本篇教程開始,咱們暫停代碼的學習,先來了解一下D3D11的管線,這些管線不涉及具體的硬件,而是着重於理解可以支持D3D11的管線實現。html
參考資料:windows
http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/api
經過前面的教程,咱們知道,要用D3D11畫一個三角形,咱們須要作如下步驟:多線程
這些步驟大體分爲四個階段,初始化階段,數據裝配階段,shader執行階段,以及合併輸出階段。這些步驟最終會在D3D11硬件設備上上執行。架構
咱們知道,顯卡都有驅動程序,也就是driver,經過driver,windows系統才能和顯卡硬件進行交互,完成渲染任務。app
一般顯卡(GPU)的driver有D3D driver和OpenGL driver。 因爲微軟各代D3D 之間並不徹底兼容,因此D3D driver有分爲D3D9 driver,D3D10 driver,D3D11 driver, D3D12 driver 等等。wordpress
首先是咱們的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,可能就要在這個特殊處理層中進行一些補救操做。針對某些特殊軟件的優化就放在特殊軟件處理層中處理,好比某些跑分程序。
在UMD和KMD之間還有DXGI,這是微軟的DirectX圖形基礎架構,它的設計主要是進行一些底層的操做,它能夠看做是KMD的運行庫,如今微軟把愈來愈多的底層管理放入到了DXGI中。好比顯存管理,commandbuffer的調度,同步操做,present後緩衝到前緩衝,顯示器的管理等等。3D應用程序也能夠直接訪問DXGI一部分功能,好比枚舉系統中使用的顯卡。
KMD( kernel mode driver),是指Kernel模式driver,KMD負責直接和硬件打交道,可能在系統中有多個UMD實例,但KMD只能有一個。一旦KMD崩潰,操做系統可能會出現藍屏錯誤,KMD主要功能包括:
一、在多個應用程序使用GPU的狀況下,KMD經過slice time分時操做來管理應用程序。
好比在一個時間片內一個app進行物理內存操做,另外一個時間片內另外一個app初始化GPU,設置顯示模式等,在不一樣app間切換時,就須要context switch,響應中斷等。
二、ASCI的初始化,一套driver會對應多代的顯卡,ASIC這兒就是指不一樣代的顯卡,它們可能架構不一樣,KMD要針對當前的硬件,選擇合適的ASCI設置。
3. 電源管理,GPU內存資源的分配,回收。
4. command buffer提交到GPU硬件,以便GPU硬件開始buffer中的packet。
下圖爲d3d11 api和driver的交互框圖,從中咱們能夠清晰的理解D3d api如何轉化爲硬件的packet,並被提交到硬件引擎的ring buffer。