Mali GPU的獨有特性


Mali GPU的獨有特性

眾所周知,Tile Based Rendering已經成為了事實上的移動平台GPU標配,不僅如此,intel的新一代集成顯卡也悄悄地加上這一特性的支持。移動平台GPU御三家(Adreno,Mali,PowerVR)也在自己的解決方案里,紛紛加上了自己的私貨,不僅能夠優化性能,如果被標准化組織(Khronos)看上了列為下一代API的標配,又可以在市場競爭中多一份籌碼。下面介紹Mali-GPU提供的一些獨有特性。

FPK(Forward Pixel Killing)

在一個Render Pass中,每一個Tile中的每個像素可能會被繪制多次,由此帶來的Overdraw問題不可忽視。通常的做法是采取對模型的渲染順序進行排序,按照Opaque:從近到遠,Transparent:從遠到近來進行,這樣可以充分利用Early-Z進行剔除。但是這樣的做法要求很高,一般很難做到完美。Mali的做法是,如果每個Pixel會被渲染多次(假設都是Opaque),那么將其放入一個隊列中,不會馬上進行Fragment計算,如果后進入的Fragment深度比隊列中前面的要小(假設ZTest為Less),那么前面的將會被拋棄掉。

和PowerVT的HSV(Hidden Surface Removal)相比,這個方案存在一定的剔除不干凈的可能(隊列中的Fragment已經被處理了),但是其實現起來簡單,如果不生效,隊列就退化成正常渲染所用的隊列。不過Mali推薦還是使用排序的方式以充分進行Overdraw剔除。

TE(Transaction Elimination)

Transaction Elimination也是一種很有效的降低帶寬的方法。在有些情況下,只有部分Tile中的內容會變化(例如攝像機不動,一個Tile中只有靜態物體)。此時通過比較該Tile前一次和本次的渲染結果的CRC值,可得到Tile是否變化的結論,如果不變,那么就沒有必要執行Tile到System Memory的寫回操作了,有效地降低了帶寬占用。

AFBC(Arm FrameBuffer Compression)

FrameBuffer中的內容,以無損的壓縮格式存儲,不僅降低了傳輸帶寬,還降低了顯存占用,是一種用時間換空間/帶寬的技術(這個技術貌似AMD的顯卡也用了)。

然而這種技術有一定的局限性,如果Texture僅作為FrameBuffer的Color Output和Shader中使用texture()進行讀取,那是沒問題的,可如果使用了imageLoad和imageStore方法,驅動就是隱式地插入一個解壓縮的步驟。這樣反而造成了更多地存儲占用和更多地計算負擔。

從上面的描述可以看出,這種算法可能是一種基於塊的壓縮算法,如果使用texture()去讀,會去走texture緩存那條讀取通道,這條通道上本來就有各種壓縮格式的解壓縮算法,再加一種也不是什么事。而imageLoad和imageStore走的是另一條通用的存儲讀寫通道,這條通道如果想加上on the fly的壓縮/解壓縮,看上去不是很現實。

目前也沒有擴展進行顯式的控制(待查證),如果一個Texture被作為FrameBuffer的Color Output寫入之后馬上被Compute Shader用到了,那不是還得解壓縮一份?這個問題有待實驗考證。

參考資料:

  1. The Mali GPU: An Abstract Machine
  2. Arm Mali GPU Bast Practices Programmer Guide


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM