HW Overlay 小檔案

看到這個題目在 wiki 只有英文和韓文, 忍不住想寫一個中文的精簡版. 不過寫著寫著就偏離主題, 變成了 Android 為何不全面支持 HW Overlay?

我們在 Windows 螢幕上看到的畫面, 基本上是由視窗疊加而成的, 前景擋住後景, 就成了我們看到的模樣. 在其他有視訊輸出的產品中, 同樣會有物件互相遮蔽的現象, 例如: 字幕浮現在電影上, 這樣就是兩個個物件. 如果再加上進度條 (progress bar), 就變成 3 個物件. 當繪圖系統需要依序畫出這三個物件時, 可以用軟體去檢查前後順序, 只把需要的部份畫出. 在 Android 系統中, Surface Flinger 就在做這件事 [註1].

既然有軟體的解法, 硬體解法會不會更快更有效率呢?是的, HW overlay 就是這個硬體的解法. 當每個物件都畫在自己的記憶體, 最後再依據每個物件的先後順序和透明度 (alpha blending) 一次疊加, 那麼每個物件就不用等來等去, 只要各畫各的就好. 如此一來, 雖然浪費了好幾塊記憶體, 控制卻變得很簡單. 特別是物件的更新速率差異很大時, 互等會導致大量浪費頻寬 – 例如電影 (30~60Hz) 與字幕 (大約 0.2~0.5 Hz).

Surface Flinger HW Overlay

上面這張圖有個小問題, 就是把 SurfaceFlinger 和 Overlay 畫成兩個獨立的模組. 實際上, 在 Android 中, HW Overlay 和 Surface Flinger 關係密切. HW Overlay 算是 SurfaceFlinger 的一個特例 [註 2]. 請參考下圖.

現在的 IC 幾乎都有 HW overlay 的能力, 應該沒甚麼好討論的, 可惜故事還沒有完. 大家如果把玩手上的 Android 手機或是平板, 可能會在設定裡面看到 “停用硬體重疊圖層" 這個選項. 既然 HW overlay 看起來比較好, 幹嘛把它停用呢? 每一個 OpenGL 的 process 都需要 2~8MB 的 RAM, 浪費記憶體就不用說了. GPU 還要挺高檔才行 [註 3].

每秒可以畫 1000 M pixel/second 的 200MHz SGX544, 在 1920×1080@60FPS (frame per second) 的輸出螢幕上, 能在每個 pixel render 8.0375 次. 若是換成了 SGX531就只能 render 4 次 [註 4]. 這  4 次如果用來畫一層背景, 一層電影. 一層進度條和 OSD (on screen display), 一層字幕, 就已經達到 GPU 的硬體極限. 此時只是做到 HW overlay 的水準而已, 但什麼 3D 動畫效果都畫不出來了.

以上都是說 Android 的壞話, 但 Google 卻可以藉著不支援 HW Overlay 來統一硬體的差異, copybit 不就在 Android 4.0 上被拔掉了嗎? 若是放任每一家廠商製作的 HW Overlay 都不相同, 當然就限制了 APP (跨平台的) 的互通性. 再者, GPU 只要聰明地用, 不要常常 redraw 沒用的畫面, 效率還是不會太差 [註 3]. 按照 Android 的官方說法, 全部的畫面都能進入 GPU 的話, 使用者將可以得到更多樂趣! 至於 GPU 的計算能力….當然必須夠, 這不是 Android 的責任範圍, 它只是個做軟體的. [註5]

Media effects for transforming images and video

A set of high-performance transformation filters let developers apply rich effects to any image passed as an OpenGL ES 2.0 texture. Developers can adjust color levels and brightness, change backgrounds, sharpen, crop, rotate, add lens distortion, and apply other effects. The transformations are processed by the GPU, so they are fast enough for processing image frames loaded from disk, camera, or video stream.

[註]

1.  Android Display (surfaceflinger and Overlay)

2. Android 显示系统

3. The truth about hardware acceleration on Android

4. PowerVR

5. Ice Cream Sandwich

3D graphic 的演進

昨天聽了台大簡韶逸教授的演講, 對 3D graphic 又多了一點認識. 先前我自修了幾個小時的 3D,  但是還是比不上聽 2 個小時的演講.

3D Graphic 的技術基本上是硬體愈做愈多, 但軟體卻也沒有愈做愈少. 假設 3D 技術可分為 Transform and Lighting ( T&L – 幾何轉換及光源), Rasterize, Texture, Blend and Z-buffer 這幾個單元的話, 早期的 3D graphic card 只包含 Texture 和 Z-buffer 這兩部分 (1998 年以前).

Milestone 1:

3dfx 的巫毒卡 (VOODOO), 我聽說它效能很讚, 也去敗了一張. 這張卡的特色就是把整張圖切細, 比方說用 4 個 sub-frame 來計算整個畫面, 最後再接起來. 因為這個技巧的確有效, 所以它也紅了一陣子.

Milestone 2:

1999 年的下半年, NVIDIA 的GeForce 256,首次支援硬體的 T&L. 這樣一來,  CPU 就不用算很多浮點數了, 效能自然是大大地增強. 可惜 Voodoo 不知道在堅持什麼? 始終都不支援 T&L, 最後就被 NVIDIA 給併購了.

2001 年, NVIDIA 引進 programmable vertex / pixel shader 的觀念. 所謂 vertex shader 就是 T&L 的進階版,  pixel shader 或是 fragment shader 就是 texture 的進階版. 怎樣進階呢? 就是把原本寫死的硬體, 做成可以程式化的巨量運算單元, 再以程式來控制想要輸出的 vertex 或 pixel 運算. 這個概念影響了 Direct X 8 的方向, 使得新版的 Direct X 都伴隨著 shader model 的更新.

老師的講法, programmable pixel shader 在 2002-2003 才出現. 但網路上的說法, pixel shader 和 vertex shader 應該都是 2001 年的 Geforce 3 的發明.

Milestone 3:

2002 年, ATI 推出 Radeon 9700 這顆 IC. 裡面用到的新技術還頗不少, 比方說這是第一顆 flip chip 的 IC, 對於散熱問題有了不少改善. 在驅動程式方面也產生了很大的突破, 由於可程式化的技術已經相進步; Wiki 上說它執行抗鋸齒(AA)和各異向性過濾(AF)運算時,在所有情況下,它能比 GeForce 4 的 Ti 4600快上40-100%。這顆 IC 因為效能遠勝 NVIDIA 而大賣了 3 年.


Milestone 4:

2006 年 11 月, NVIDIA 再度推出具有 unified shader 概念的 GeForce 8800. 所謂 unified shader 就是把 vertex shader 和 pixel shader 整合在一起. 同一個 shader 既可以做 vertex shader, 也可以做 pixel shader.

網路上的講法說, unified shader 就是 steam processor. 但是簡教授認為的 stream processor 至少要有 register 的概念, 才比較像 processor. 這是發生在 2007 年.

Milestone 5:

2008年2月, NVIDIA 收購 AGEIA, 推出 CUDA 語言, 使得顯示卡變身為平行處理電腦. 這邊就算是 GPGPU (general purpose GPU) 的起點吧!

綜合以上資料, 應該有一個 milestone 是把所有的 buffer (Vertex buffer, Texture buffer, Z-buffer) 整合成 unified buffer. 但是哪一顆 IC 率先推出這個改進就不得而知了.

總之, 搞繪圖卡的這些人頭腦還挺不錯的. 在激烈的競爭之下, 大家接力地推出可以徹底打敗敵人的招數. 目前 ATI, NVIDIA, Intel 雖然表現出三雄鼎立的架勢, 但誰可以在下一個階段勝出呢? 真是很有趣的一個問題. 繪圖卡愈來愈像小型 super computer, 到時候應該要比誰對軟體的支援最強吧?

另一個觀察的角度是: 當局者迷. 事後看來, 後面發展的路徑好像是顯而易見的, 但是十年前的人也都那麼聰明, 為何他們都想不到呢? 最好的解釋或許是人們不喜歡質變, 由量變過渡到質變的話則可以逐漸接受. 有誰一次想太遠的話, 只會被當作瘋子~~

Ref:

[1] 物竞天择适者生存!显卡10年技术漫谈

[2] http://zh.wikipedia.org/zh-tw/Radeon_R300