關於 DRM 中 DUMB 和 PRIME 名字的由來

前言

在上一篇《DRM驅動程序開發(VKMS)》文章裏,我們學習瞭如何編寫一個最簡單的 KMS 驅動。而本篇,我將以敘述的形式爲大家講解 DRM GEM 的相關概念,代碼留到下一篇進行講解。

我知道,大多數的 DRM 初學人員,在剛接觸到 GEM 相關概念時,首先困惑的不是 GEM 架構有多難,而是 GEM 裏面的那些專業術語到底是怎麼來的?爲什麼要這樣命名?比如本篇要講的“DUMB”和“PRIME”,當你得知它們的作用時,你甚至會有些憤慨:它們的名字和它們的功能簡直毫無邏輯關係!是 DRM 社區的大佬們都喜歡故弄玄虛?還是我們的百度翻譯不夠準確?帶着這樣的疑問,我查閱了 DRM 相關的歷史資料,深挖這些術語的歷史來源,最終形成此文。希望通過我的講解,能爲各位掃去心中的疑惑。

DUMB Buffer

如果我們去百度翻譯上查詢“dumb”一詞的含義,得到的解釋有2種:

  1. “啞的” 2. “傻的”

啞的 buffer ?什麼鬼!而如果我們在 Ubuntu 下運行 man drm-memory 命令,則會得到如下關於 Dumb-Buffer 的解釋:

These buffers can be memory mapped via mmap(2) so you can render into them on the CPU. However, GPU access to these buffers is often not possible.

大意就是該 buffer 通常不能用於 GPU 硬件加速,只能給 CPU 使用。但是不能用於硬件加速的 buffer 爲什麼要叫 dumb buffer 呢?爲何不直接叫 simple buffer 呢?“dumb”一詞在這裏到底是什麼含義呢?其實這還得從上世紀80年代的VGA顯卡說起。

那時的顯卡由一塊很小的顯存(通常爲640x480)加一塊數模轉換電路(DAC)組成,說白了就是一塊 Framebuffer + Display Controller。顯卡的功能極其簡單,只負責將顯存中的圖像數據轉換成RGB信號發送出去即可,而所有的繪圖操作則都交給 CPU 來完成。行業裏將這種顯卡稱爲 VGA Card,它的顯存則被稱爲“Dumb Frame Buffer”。而到了後期,隨着顯卡技術的不斷髮展,許多原來由 CPU 乾的活,漸漸的都被顯卡取代了。從最初支持某些特定繪圖指令(如畫點、畫線)的顯卡,到後來支持視頻解碼的 Video Card,再到現代支持複雜3D渲染指令(如OpenGL)的 GPU 顯卡,CPU 繪圖的繁重任務徹底得到了解放。與 VGA Card 相比較,行業裏將後來顯卡的顯存稱爲“Smart Frame Buffer”。首先從這兩種稱謂上我們就可以看出,dumb 是 smart 的反義詞,因此 dumb 在這裏的解釋應該是“傻的”或“傻瓜式的”,而不是“啞的”。

在這裏插入圖片描述
(圖片來自1992年的計算機雜誌)

那爲什麼說用 CPU 畫的 framebuffer 就很傻,而 GPU 畫的 framebuffer 就很 smart呢?是歧視 CPU 嗎?不瞭解 GPU 的小夥伴可能不知道,當我們要讓 GPU 硬件渲染一副圖像的時候,並不是簡單的傳給 GPU 一塊 buffer 然後告訴他“你畫吧!”就完事了,而是要將好幾種不同類型的 buffer 都傳給它,這些 buffer 包括 Command Buffer (繪圖指令)、Vertex Buffer(頂點數據)、Texture Buffer(紋理數據,即圖片)、Framebuffer(GPU最終輸出的結果)等等,這樣 GPU 才知道自己應該如何去繪製一幅圖像(詳見本人翻譯的“Render Hell”文章)。而如果我們將這些 buffer 發送給一塊早期的 VGA 顯卡,那可就傻眼了!因爲它根本不會去解析 framebuffer 裏的數據,只會將它們一股腦的都發送出去,最終的結果可想而知。所以 dumb buffer 和 smart buffer 的區別就在於,你寫到顯存裏的數據,是可以直接上屏顯示的圖像內容,還是一堆需要 GPU 來解析的命令和資源數據。 如果是前者,那我們就稱之爲“傻瓜式的” framebuffer,即 dumb buffer。因爲它的“大腦”在 CPU 那,它的“智商”不足以解析 framebuffer 中的內容,所以它很“傻”。

當然,如果從另一個角度去理解,smart buffer 中的繪圖命令和資源數據可以看作是 CPU 和 GPU 交流的媒介,它使得 smart buffer 對 GPU 而言具有了“交流”的能力,那麼 dumb buffer 因爲沒有這種交流能力而被當成是個“啞巴”,似乎也說的過去。。。

總之,不管是“啞巴”還是“傻瓜”,dumb buffer 就代表了所有的繪圖操作都由 CPU 來完成的 framebuffer。它只是一種軟件功能上的定義,與你係統上是否帶 GPU 硬件無關。即使你的硬件支持 GPU 加速,也不妨礙你使用 dumb buffer 來做 CPU 純軟繪的工作。正因爲 dumb buffer 的這一功能特性,使得它普遍應用於簡單 UI 場景,如 Android 的 Recovery 模式。

與 dumb buffer 命名類似的還有:

  • dumb-terminal:不支持特殊字符的終端,如“清屏”、“粗體”、“彩色字符”等等
  • dumb-panel:不帶 GRAM 的 panel
  • dumb-TV:與 Smart-TV 相反,指以前老式的黑白電視


如今的 IT 領域,dumb 一詞更多的代表 “功能簡單的”、“老式的”、“傳統的” 含義。

PRIME

“prime”一詞在百度翻譯中被解釋爲“主要的”、“典型的”,如果只是想表達“主要的”一詞,爲什麼不用“primary”?而用過 drm-prime 的小夥伴都知道,PRIME 在 DRM 驅動中其實是一種 buffer 共享機制,它是基於 dma-buf 來實現的。既然如此,那爲什麼不直接叫 drm-dmabuf 呢?光從字面上看, PRIME 和 DMA-BUF 沒有半點關係,這讓初學者在剛接觸 drm-prime 的時候感到十分困惑。其實 PRIME 這個名字的由來是有背景故事的,故事還得從 NVIDIA 說起。

2010年2月9日,NVIDIA 官方發佈了一項新的雙顯卡技術 —— Optimus Technology。該技術主要運用於帶雙顯卡的筆記本(集成顯卡+獨立顯卡),可以根據當前集成顯卡的工作負載,自動的將一部分圖形任務交給獨立顯卡去處理,以此來達到功耗和性能的最佳平衡。舉例來說,一個帶 Intel 集成顯卡和 NVIDIA 獨立顯卡的筆記本,通常將集成顯卡做爲默認顯卡,且充當了 Display Controller 的角色。當用戶使用辦公軟件時,由於需要渲染的任務量不多,此時直接由 Intel 集成顯卡來完成。而當用戶玩3D遊戲時,由於圖形渲染的負載較重,此時系統會將部分或全部的任務交給 NVIDIA 獨立顯卡去處理,等處理完後再將結果送回給集成顯卡做最後的合成顯示。而這整個過程都是由軟硬件自動完成的,中間無需人爲干預,用戶體驗十分流暢。只可惜,該技術只能用在 Windows 系統上,Linux 系統不支持。

在這裏插入圖片描述
再看當時的 Linux 開源社區,Dave Airlie (RedHat Graphics 工程師,DRM 社區 maintainer)正如火如荼地向社區提交着他的 vga_switcheroo patch —— 一種用於 Linux 下雙顯卡切換的技術,但同一時刻只能有1個GPU處於工作狀態(請注意和 Optimus 技術區分開來,Optimus 允許同一時刻有2個 GPU 同時處於工作狀態)。當 Dave 完成了他的 vga_switcheroo 提交後,他開始在業餘時間裏研究起 Optimus 技術,並琢磨着怎樣在 Linux 平臺上實現類似的功能。結果不到2周時間,他就做出了該方案的原型設計,並在自己的筆記本上(Intel集成顯卡+ATI獨立顯卡)實現了該功能的驗證。

就像他在自己博客中所描述的,他將這項技術命名爲“PRIME”:

So NVIDIA unveiled their optimus GPU selection solution for Windows 7, so I decided to see what it would take to implement something similar under DRI. I’ve named it PRIME for obvious reasons.

關鍵是這句 “I’ve named it PRIME for obvious reasons.” 許多國人看不明白,怎麼就 obvious 了?博客裏也沒給出進一步的解釋。其實如果把 Optimus 和 Prime 組合在一起,它是一個人的名字,誰的名字?
在這裏插入圖片描述
沒錯!Optimus Prime 就是變形金剛 擎天柱 的名字!《變形金剛》系列動畫最早從1984年就開始在美國盛行,後來在2007年的時候又開始推出一系列3D真人版大電影,因此對於當時國外的年輕人來說,Optimus Prime 這個名字是再熟悉不過的了。這裏也不得不誇讚一下 NVIDIA 當初給他們 Optimus 技術命名的精妙之處:擎天柱本身所具有的變形能力,形象的表達了 Optimus 這項技術可以在功耗和性能之間來回自由變換;而擎天柱作爲汽車人的統領,象徵着 NVIDIA 是行業裏雙顯卡技術的領軍人物!回過頭來再說 Dave 將他這項 Linux 下的技術命名爲 “PRIME”,其實是很巧妙的玩了一把文字遊戲,同時也隱晦的告訴大家:DRM Prime 技術就是用來對標 NVIDIA Optimus 技術的!

不過需要注意的是,當時的 PRIME 並不是基於 dma-buf 的,而是基於 shm (共享內存)的。但只可惜,Dave 提出了他的 PRIME 原型設計後,就沒有再進一步跟進下去,理由是該項工作除了需要修改 DRM 公共代碼,還涉及到底層 GPU 硬件驅動的修改,以及上層 X Server 整個架構的改動,工作量實在太大了。而此後他一直致力於 Multi-GPU 的上層修改中,直到2年後 dma-buf 被合入到 linux-3.3 後,他才又回到 PRIME 的開發中來,並於2012年3月最終合入到 linux-3.4 主線版本中,也就是我們今天看到的基於 dma-buf 架構的 PRIME 版本。

這裏順便提一下,在 PRIME 概念提出之後,另有一羣開源愛好者爲了讓 NVIDIA Optimus 硬件也能在 Linux 下正常使用 ,他們發起了一個新的項目,名字叫“Bumblebee”!
在這裏插入圖片描述
沒錯,Bumblebee 就是變形金剛裏奶狗奶狗的大黃蜂!如果說 PRIME 是 Linux 下 Multi-GPU Rendering (或者叫 GPU Offloading)的通用技術方案,那麼 Bumblebee 則是爲 NVIDIA 硬件專門定製的 Linux 下 Optimus 全套技術解決方案。該項目也是幾經波折,中間還出現了不少鬧劇,甚至人們一度懷疑該項目已經死了,但它其實到現在都還在維護中,感興趣的同學可以直接點此鏈接訪問它們的官網,這裏就不贅述了。

結尾

總之,DRM 有太多的歷史講不完,但至少通過本文,你應該已經瞭解了爲什麼 DRM 中會有 DUMB 和 PRIME 這兩個莫名其妙的詞語了。下一節,我們將開始真正動手寫一個最簡單的 GEM 驅動程序,敬請期待!

參考資料

  1. Frame Buffer FAQ
  2. Google: PC Mag 1992年7月
  3. 百度百科:NVIDIA Optimus
  4. Dave Airlie: GPU offloading - PRIME - proof of concept
  5. Phoronix: Hybrid Graphics Comes To Linux In Crude Form
  6. Phoronix: Last Minute For Linux 3.4: DMA-BUF PRIME Support
  7. The Bumblebee Project
  8. History of the bumblebee project

文章彙總: DRM (Direct Rendering Manager) 學習簡介

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