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剔除。ide

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方法,驅動就是隱式地插入一個解壓縮的步驟。這樣反而形成了更多地存儲佔用和更多地計算負擔。ui

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

目前也沒有擴展進行顯式的控制(待查證),若是一個Texture被做爲FrameBuffer的Color Output寫入以後立刻被Compute Shader用到了,那不是還得解壓縮一份?這個問題有待實驗考證。排序

參考資料:隊列

  1. The Mali GPU: An Abstract Machine
  2. Arm Mali GPU Bast Practices Programmer Guide
相關文章
相關標籤/搜索