PowerVR 圖形架構探索:tile-based渲染

原文鏈接:http://imgtec.eetrend.com/article/5282

我一直熱衷於講述我爲何加入Imagination公司的故事。這個故事沿着以下路線發展:儘管我獲得了圖形方面的工作offer,而且是在陽光充足氣候的城市,但最終我還是選擇了PowerVR Graphics公司,在英國這個明顯沒有太多陽光的地方工作,因爲我對磚牆式延遲渲染(TBDR)技術如何能在現實中應用實在是太感興趣了。一直到現在,我的圖像職業生涯大多時候聚焦在如今的概念簡化的直接模式渲染器(IMRs)——大多指GeForces和Radeons顯卡。

無意冒犯那羣設計GeForces和Radeons顯卡的傢伙——他們中的一些人也是我的朋友,我也很瞭解這羣人,但是現代分離式IMR 圖形處理器上的前端架構並不是世界上最激動人心的事情。這些GPU中包含大量的專用帶寬設計,以一種效率低下的方式進行像素描繪工作,但確實是一種概念簡單並且能在芯片中簡單表現出來的方式,從而使得GPU架構相對容易地進行設計、規範,並且已經被硬件團隊構建出來了。

直接模式渲染器運行機制

直接模式渲染器運行機制

在IMR下,你把任務交給GPU,然後就直接進行繪畫了。這其中已經畫了的部分,或者將要畫的部分之間沒有任何關聯。傳送三角形,然後着色。接着將它們光柵化至像素中,給這些像素着色。將這些渲染了的像素傳送至屏幕上。三角形輸入、像素輸出、繪圖任務完成!但關鍵是在已發生的事情、或將要發生的事情之間沒有任何前後關係的情況下,任務就完成了。

在這個方面,PowerVR GPU就很不一樣,這也是如今我爲什麼在這裏工作的原因:爲了探索PowerVR的架構、硬件團隊和軟件工程師是如何讓TBDR在實際產品中發揮作用。我的直覺是TBDR將很難構建,這樣它們纔會運行良好從而實際提供益處。我曾獲得一個機會來一探究竟,5年之後我依然在這裏,協助探索將來我們會怎麼發展它,以及研究GPU微體系結構的剩餘部分。

在圖形編程人員看來,PowerVR依舊看起來像三角形輸入、像素輸出、繪圖任務完成這個模式。但在面罩之下,一些激動人心的事情正在發生。這個激動人心的部分讓我坐在如今這個位置上,並且5年之後寫述它,除此之外,關鍵還因爲另一個E開頭的單詞:效率(efficient)!

總是由經典的TBDR vs.IMR辯論開始

爲了幫助理解原因,讓我們繼續討論IMR。阻止桌面類IMR繼續縮小以適應現代嵌入式應用處理器的功耗、性能和尺寸預算需求的因素之一是帶寬。這是一個非常稀缺的資源,甚至是在高端處理器上也一樣——通常受限於功耗、尺寸、佈線和封裝等其它因素,以至於你必須儘可能高效率的使用帶寬。IMR並沒有很好地做到這一點,特別是在像素着色方面。要記住不止是對於構成三角形的頂點,通常總會有大量額外的像素點也被渲染了。最重要的是,在IMR中,儘管有些像素從來沒有在屏幕上顯示,但經常還是被着色了,因而耗費了大量珍貴的帶寬和功率。下面是原因。

那些像素點的紋理需要被採樣,並且這些像素點需要寫到內存中去——也經常讀回來再寫回去!——在屏幕上進行繪製之前。儘管所有的現代IMR在硬件上有方法能嘗試避免一些多餘的工作,比如說創建在背景上的被畫在旁邊的徹底掩蓋,應用開發者可以做更多的事情來高效的禁止那些機制,例如總是優先繪製創建在背景上的內容。

在我們的架構下,應用開發者在屏幕上畫什麼並不重要。對於透明的幾何物體除外,此時開發者仍然需要管理,但除此之外,我們提交順序是無關的。這種能力我們已經在硬件中實現了,因爲之前我們是IP公司,並且現在還在製造我們自家的PC和遊戲圖形處理器。你可以先畫背景上的內容,接着是頂層前景上的內容,我們從不會對背景內容進行像素着色,不像IMR那樣。

爲了找出最頂層的三角形,我們高效地在GPU中對不透明的幾何對象進行分類,不管應用在何時以及怎樣提交這些對象。當然,如果一個開發者很好的歸類幾何對象,那麼IMR也能很接近我們的效率,但畢竟只是少數情況。

PowerVR TBDR原理

PowerVR TBDR原理

再想想所有能省去的工作,特別是對於現代內容:對於每一個像素着色,將進行不凡數量級的紋理搜尋來找出不同的東西,爲了達到正確的效果,幾十甚至上百個算邏單元週期會消耗在紋理數據的運行計算上,這常常意味着把像素寫到中間表面上去必須得在將來的渲染傳遞中又將其讀回來,然後接着在着色結束後,需要將像素存儲在內存中,這樣它才能顯示在屏幕上。

而這僅僅是我們的優化之一。因此儘管我們已經避免了處理完全封閉的幾何,在像素處理階段,仍然存在着可以完成的帶寬節省工作。因爲我們把屏幕分成了tile,我們找出所有能放在一個tile中去的幾何對象,使得我們只需處理我們需要處理的,並且我們精確的知道tile有多大(目前是32×32像素,但是在之前設計中更小並且不是方形),我們可以創建足夠大的片上存儲空間來同時處理那些幾個tile,當我們完成着色並想把最終像素輸出的時候,就不再需要使用外部存儲空間了。

PowerVR GPU把屏幕分成tile

PowerVR GPU把屏幕分成tile

同時處理屏幕和區域有第二個好處;這是個其它GPU也利用到的好處:因爲這很類似於屏幕上的像素點會和它鄰域的像素點共享一些信息,這有點像當我們要轉到相鄰像素點上進行處理時,我們已經把數據送到cache裏去,而不需要等待另一組外部存儲器讀取,又一次的節省了帶寬。這是一個經典的空間佈局利用,許多現代3D渲染中用到這個。

以上就是在處理和(特別是)帶寬效率上TBDR比起IMR在頂層視圖上的最大好處。但這在硬件上具體是怎麼實現的呢?如果你不是偏硬件方面的,那你可以就此止步。即使沒有看到下面的內容,你仍然已經理解了在嵌入式低功耗系統上我們最大化利用珍貴的可用帶寬所帶來的頂層上的巨大好處。

TBDR在硬件中的工作原理

對於那些對硬件裏的東西感興趣的人,讓我們一起談談現代Rogue GPU中上下文裏的tiler。

一款3D圖形應用開始於告訴我們幾何對象在內存中的位置,接着我們讓GPU去取出幾何對象,然後進行頂點着色。在我們的GPU中,存在着負責處理每一種任務類型的非可編程步驟的模塊,並稱之爲data master。它們代替通用着色集羣或者USC(我們的着色核)做了一堆不同的事情來充當任何工作負載的定點功能位,包括從內存中取出數據。由於我們是頂點着色,因此此時是vertex data master(VDM)根據驅動提供的信息來從內存中取出頂點數據。

PowerVR 7XT系列是Rogue GPU中的最新家族

PowerVR 7XT系列是Rogue GPU中的最新家族

數據在內存中能夠以線、三角形、點的形式存儲,分爲可索引和不可索引。有相關的着色程序和這些程序伴隨的數據。VDM取出所有需要的東西,此時需要用到另一組內部可編程模塊來幫忙,然後把它們全部送到USC進行頂點着色。USC運行着色程序,輸出的頂點存儲在片上。

接着它們被執行原始組裝的硬件利用,對特定種類的幾何對象進行剔除,然後進行剪切。如果這個幾何對象是背對着的,或者被判定爲完全可以從屏幕上去掉,那麼它就被剔除了。屏幕上所有剩下的正對着的幾何對象被送去剪切。對於不與剪切平面相交的幾何對象,有一個快捷的路徑可以使它進行向前的步驟,而沒有多餘的處理來阻擋相交測試。對於與剪切平面相交的幾何對象,剪切器產生出新的幾何對象,並確保傳遞的頂點在屏幕上(儘管它們可能在右邊緣)。剪切器能幹一些很酷的事情,但是要在大型圖像中要進行這樣的解釋,剪切器則表現得不太好。

接着對比IMR,我們就到了一些奇蹟發生的地方。我們在硬件上進行多階段的計算,使效率和準確度最大化:先是一個前端階段來跟蹤着色的幾何對象然後把它裝進tile中,接着下一個階段中使用裝好的數據,將其光柵化然後傳去像素着色,最終將其寫出。爲了確保事情儘可能的高效進行,兩個主要階段之間的中間加速結構必須是最佳的。

顯然創建及把它讀回來帶來的是帶寬消耗,這也是在進行比對時,我們的競爭者認爲勝過我們的地方。誠然這是對的;IMR不需要處理它。但是考慮到我們處理模型中的帶寬節省,建立那個加速結構——我們稱之爲參數緩衝器(PB)——在光柵處理之前,最終在典型的渲染情景下,特別是一些複雜遊戲類的情景,我們有巨大的帶寬優勢。

那麼我們怎麼產生PB?剪切器把原始數據流和渲染目標ID輸出送到內存當中,這個由渲染目標分組。可以把它當做收集相關幾何對象的容器。這裏面的關係很嚴格:我們稍後既不想讀取它,也不想消耗裏面的大部分數據,因爲這樣很浪費。存儲在PB中的主要數據結構是這個階段的輸出。接着我們壓縮內存,通常情況下壓縮地很好,因而相比單獨的步驟,我們節省了很多的PB創建帶寬。

tiling的概念

那麼就現在到了我們硬件架構上,並且可以說是大多數人都理解的點了:tiling。tiling引擎有一個主要的任務:輸出一些標記的tile區域數據、一些相關的狀態、指向構成那個區域的幾何對象的指針。我們也存儲遮罩以防原始的幾何對象雖沒有構成區域,但還是存儲在內存當中了。這讓我們節省了一些帶寬,也減少了對那個幾何對象的處理,因爲這個幾何對象並不是tile的構成之一。

我們把結果數據結構稱爲原始序列。如果你曾經購買了我們的開發者文檔,你會看到在其中曾提到將原始序列稱之爲前端階段和像素處理階段間的中間數據結構。接下來是更神奇的PowerVR處理方式。

設想你正在負責構建這個點上的架構任務,對於一個給定的幾何對象集,此時你需要決定什麼區域需要被光柵化。這裏你有一個明顯可以選擇的算法:邊界框。在三角形周圍畫上一個覆蓋它邊界的框,與那個框相接觸的tile即是你要爲那個三角形進行光柵化的對象。這種方法很快,效率很高。

設想要把一個方向任意並且相對長窄的三角形畫在屏幕上。你可以迅速想象到那個三角形的邊界框將要跨過一些實際上這個三角形並沒有接觸的tile。因而當你進行光柵化的時候,你將給你的着色核增加一些工作量,而實際上這並有沒給屏幕上的顯示帶來任何貢獻。

取而代之,我們有一個迴歸到硬件上的算法,稱爲perfect tiling。它運作起來就好像你希望我們只生成tile中的幾何對象確實覆蓋了一些區域的tile列表。這是這個設計中最佳也是效率最高的地方之一。對於一個給定的幾何對象集,這個完美的tiling引擎生成完美的tile列表。

PowerVR 完美tiling vs.邊界框(或者分層tiling)

PowerVR 完美tiling vs.邊界框(或者分層tiling)

tile信息連同原始tile列表被儘可能高效的打包至參數緩衝器PB中,概念上很接近它了。現實當中,在tiling的後端階段,硬件裏總有一些見鬼的事情發生,填裝PB,然後爲外部內存寫入進行管理和引導實際內存訪問,但在功能性方面仔細想想,我們還是做得很好。

對比我們的競爭者,我們前端的硬件架構確實是現代PowerVR GPU中效率能大塊增長的地方。令那些知道真相的人驚訝的是,它是硬件架構上的一部分,我們的硬件架構也沒有特別不一樣,至少在頂層與Rogue和SGX比起來。儘管我們徹底重新設計Rogue的着色核,前端架構將和你在後代SGX GPU IP核裏看到的很類似。它起作用了,並且效果很好。那麼現在我就完成了TBDR中tiling部分的講解任務,這是個停下來的好藉口。在將來的博客中,我會來講述延遲渲染部分,因此請您繼續關注。

原文鏈接:
http://blog.imgtec.com/powervr/a-look-at-the-powervr-graphics-architectu...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章