Linux圖形棧-從X到Wayland


       1980年代初,麻省理工學院計算機科學系(以下簡稱MIT)的Bob Scheifler 着手為新的窗口系統制定規則。他決定取名為X,因為此窗口系統是基於W窗口系統的一個改進,W窗口系統源於V系統。X窗口系統將掀起一場圖形領域的革命。當時X確實成為了所有類UNIX窗口系統的標准圖形服務器,因為它的特點和理念遠遠超越了競爭對手。短短幾年時間,UNIX社區全部接納了X窗口系統。
  在這篇文章中,我們將一瞥Linux圖形棧的發展歷程,從最初的X客戶端/服務器到現在的Wayland所做的一系列努力。
  X變得如此特殊,不得不說,這簡直是一個傳奇。X是面向網絡、基於分布式的第一個圖形服務器。在分時系統上,一個X服務器可以同時為多個客戶端服務。X的網絡協議使本地窗口能夠顯示在遠程機器上。實際上,X就是面向網絡的,協議獨立於硬件。通過網絡協議發送顯示請求,運行於某個類UNIX平台的X客戶端可以在完全不同硬件平台的類UNIX系統上顯示。
  窗口外觀獨立於X服務器。X協議定義了顯示設備和窗口原語信息,窗口的具體外觀只與控件庫、窗口管理器和桌面環境有關。
  在Bob Scheifler的主導和MIT的管理下,更多的人開始對此萌發興趣。為了X將來更好的發展 ,那時的企業翹楚,例如美國的數字電子公司(DEC),可免費獲取到源代碼。同時,一批廠商詢問MIT,是否有某種措施能夠維持源代碼的完整性,好讓X能夠造福於所有對此感興趣的組織機構。MIT同意了,不久之后,MIT X 協會成立,同時發布了源碼,包括DEC對X的改善部分。此次X源碼的發布確實是一個值得關注的事件。廠商們意識到,X已經有很高的價值了,需要避免某個公司獲得對X的控制,更好的保護大家的心血,而維持X源碼的開放是最重要的原則,同時MIT X 協會一直對X源碼擁有版權,避免了X被私人商業公司擁有。
  1988年,協會招募了一個高級開放者Keith Packard,他將重新實現X服務器的核心。現在,Packard在Linux圖形棧領域已經眾人皆知了。
  盡管X在UNIX和Linux圖形棧領域占據統治地位,但由於X的流行,基於X的、產生大量繪制請求的軟件和大量的軟件最終拖累了X本身。90年代,Linux快速流行起來,對於運行於同一機器上的X Server/client,開始使用X配置文件,同時X開始捆綁在很多Linux發行版上。對於本地顯示來說,X基於網絡的設計毫無用處,這一曾經大肆吹噓的優點現在反而成為視頻繪制的瓶頸。
  這段時間,個人電腦的銷售激增,專業圖形顯卡的復雜特性開始超越X的處理能力,更多高性能的顯卡持續不斷的開發出來。
轉換表映射(以下簡稱TTM)的出現
  2004年左右,一些Linux開發者開始對X緩慢的發展逐漸感到失望。1992年,他們開始轉向OpenGL,一種圖像渲染API,最初是用來顯示2D和3D圖形的(源於硅谷圖形公司開發的)。經過幾年X在顯卡上繪制3D圖形的嘗試,最終沒有一個方案可行。
  然后在2007年,Thomas Hellstrom, Eric Anholt, 和 Dave Airlie共同開發了一個內存管理模塊,他們稱做TTM。TTM用於顯存和系統內存之間的緩沖拷貝。當時在Linux社區引起了很大反響。它為那些對3D性能有嚴格要求的圖形應用帶來了希望。這個方法就是將內存緩沖區作為第一個類對象傳遞給應用程序使用,同時允許應用程序分配和處理內存緩沖區中的圖形信息。TTM可以管理主機上所有應用程序的緩沖區,並且提供GPU和CPU之間的同步,這個過程是通過一個特殊信號fence完成的。當GPU完成對某個緩沖區的顯示處理后,通過fence信號將此緩沖區的控制權交給此緩沖區對應的應用程序,此時CPU重新接管緩沖區。
  平心而論,應用程序對GPU訪問方式的標准化,TTM確實做了一個勇敢的嘗試,它是Linux上針對所有顯卡驅動的內存管理器,簡言之,TTM嘗試提供所有圖形應用程序可能需要的所有操作。不幸的是,TTM代碼量和API過於龐大,而每一個獨立的開源驅動僅僅只需要API集合中的一個小子集。大量的API容易使開發者迷惑,他們需要決定選擇使用哪個API。最大的抱怨是TTM還有一些性能問題,可能是由於CPU和GPU之間的信號同步機制(fence)導致,或者是緩沖區對象的拷貝效率太低。TTM可能確實要處理很多事情,不過這不能成為它變得緩慢的借口。
  2008年,Reenter Keith Packard宣布了一個TTM的替代方案。Keith到目前為止還在Intel工作。得益於Eric開發TTM的經驗教訓,同時在Eric的幫助下,他們重寫了TTM。新的API叫圖形執行管理器(以下簡稱GEM),一般開發者通過API就能大致猜到下一步要做什么,相對於TTM龐大的API,開發者不會迷失於GEM的API中。
  相對於TTM,GEM有很多提升,其中一個計較有意義的提升就是API接口的設計很嚴謹,同時TTM中傷腦筋的fence信號概念也去掉了。Keith和Eric讓應用程序接管API之上的內存部分,GEM則專心處理GPU可訪問的內存部分,並處理顯卡執行的上下文信息。應用與內核空間的交互訪是通過ioctl()調用,不存在TTM那種不停的緩沖區拷貝。GEM更像是一個面向流的API,而不是內存管理器。
  GEM允許應用程序共享內存緩沖區,GPU處理的內存空間就不需要重新裝載。以下是原始的發行說明:
“Gem為Linux操作系統提供簡單的機制來管理圖形數據和控制執行流程。很多內核子系統實現了這種機制。”
  隨着GEM在2008年5月的出現,給Linux的圖形棧帶來了更多的希望。GEM並不處理所有事情。例如,GPU執行的命令由設備對應驅動提供。因為Keith和Eric在Intel工作,GEM對Intel驅動支持的開源代碼編寫工作理所當然落在了他們身上。同時希望GEM能夠支持更多其他的驅動,例如三個最大的顯卡制造商。
  然而,采用GEM的非intel顯卡驅動很慢。一些跡象表明AMD驅動選擇了一個“類似GEM和TTM管理器”的方案,預示着AMD並不願意加入到GEM的陣營,GEM面臨單槍匹馬的危險。
  TTM和GEM嘗試在X中整合對GPU的操作以解決Linux圖形棧上的3D加速問題。兩者都是為了更好的提升不同圖形庫的顯示性能,例如OpenGL(依賴於X), Qt(依賴於X)和GTK+(也是依賴於X)。問題是X處於所有圖形庫和內核之間,只有內核能夠訪問設備驅動,然后驅動才能訪問到GPU。
  X已經老掉牙了。X擁有數百萬行代碼,很多代碼已經很陳舊,那是還沒有GPU,沒有專業的晶體管處理可編程着色技術或者旋轉操作以及頂點翻轉,既不知道高密度采樣和用插值法減少反鋸齒效果的概念,也不清楚如何創建極高精度的顏色空間。此時不同往日,X已經不能滿足現在的需求了。
Wayland:一個新的顯示管理器
  2008年,一個叫Kristian  H?gsberg 的軟件工程師在波士頓的市郊上開着車,可能是去往工作的路上,亦或是回家,軟件工程師正深入的思考着,有時他們會花費大量時間解決復雜的問題,將問題打散並進行重構。當他們工作疲勞休息時,會產生一些靈感,這種靈感往往能夠為項目帶來更大的突破。當人們在洗澡或者在廚房烹飪時,或者在駕駛途中,這種靈感更易產生。 當H?gsberg驅車於馬薩諸塞州Wayland一個很小的村庄時,他的大腦中迸出一個想法並漸漸成型,這個想法用他自己的話說:
“核心思想是所有窗口被重定向,我們可以讓所有客戶端自己去渲染自己,然后傳遞一個緩沖句柄給顯示服務器,顯示服務器中的混合器完成窗口顯示工作。其中一個目標就是讓X服務器運行於Wayland上,首先支持全屏窗口(例如Xnest),然后支持父窗口等,直到X被最終淘汰。”
  他的想法是寫一個全新的顯示管理器,管理器可繞過X直接向內核發送3D顯示請求。X自己就是顯示管理器的一個客戶端,正如以上作者所說,新的顯示管理器取名為“Wayland”,以此表達對這個小鎮的敬意。
  這僅僅只是一個想法。很多人每天都會產生大量聰明的想法,但最終都被生活中的雜事所磨滅。 H?gsberg正從事於圖形渲染庫方面的工作,他大概覺得,如果應用程序都能直接訪問GPU,沒有X在中間攪局,那一切事情都變得簡單了。他着手寫代碼解決這個問題。根據Intel的員工Keith Packard所說,兩周后,H?gsber完成了雛形。
  Wayland的一個關鍵特點是完成渲染工作的API完全不依賴X。為了保持兼容性,X服務器本身就是Wayland的客戶端,所有X所做的渲染直接發給Wayland。像X一樣,Wayland僅僅定義協議。Wayland的體系結構和X本身的特點,給X客戶端的移植帶來了很大便利,同時還兼容以前的X客戶端程序。
  Wayland顯示管理器會使用內核中的GEM(圖形執行管理器)、evdev(輸入事件驅動)和kms(內核模式切換)。Wayland有自己的混合器,這與X形成鮮明的對比,X依賴外部的混合器處理顯示相關的內存緩沖。
  Wayland也會使用DRI2。Wayland混合器和Wayland客戶端都能夠訪問屏幕顯示相關的資源。當客戶端更新了這個緩沖,混合器將更新桌面,並重繪屏幕。
  Wayland確實解決了很多X無法解決的問題,大家對此項目感到興奮,一群聰明的人正在實現它,並且Intel和redhat也在支持這個項目。
  但是還有一些障礙需要克服。兩個最大的障礙就是開發兼容NVIDIA和AMD的開源驅動。第三大顯卡廠商Intel已經兼容了Wayland,因為GEM內核模塊就是基於Intel驅動開發的。
  誰會為Wayland更新AMD和NVIDIA的開源驅動?對開發者來說,Linux下開源顯卡驅動的開發很折磨人,因為你沒有完整的硬件規范手冊,甚至什么資料都沒有,只能通過枯燥的逆向工程獲取顯卡規范信息。
  nouveau驅動就是一個很好的例子。當時,NVIDIA開發者放出話來,表示我們沒有支持Wayland的計划。所有工作壓向Linux社區,有時有一些廠商的支持,有時什么都沒有。在nouveau項目中,開發者正通過逆向工程積極的開發NVIDIA驅動。一個叫做Renouveau(nouveau的逆向工程)的執行流程如下:
1. 記錄MMIO寄存器的內容;
2. 繪制圖形;
3. 記錄寄存器中的新值;
  然后向Renouveau工程的ftp服務器發送繪制前后內存轉儲的文本格式差異信息,這些文件是為以后的顯卡分析做准備。
  相對於NVIDIA,AMD這方面的工作進展更順利。過去幾年中,新成立的團隊正在開發AMD的開源驅動,根據開發團隊周期性發布的規范說明,各地開發者皆可持續驅動的研發。驅動名稱是fglx(FireGL and Radeon for X),Linux社區每月都可以從AMD獲得顯卡的最新信息。
Wayland在Linux圖形棧方面很有優勢。最近,Ubuntu計划在Wayland上使用他們自己的窗口管理器Unity。為了確保硬件驅動能在新的圖形架構上發揮最大性能,Intel強力支持協助開發GEM,雇佣了Wayland的開發者們。
  除此以外,圖形領域正在兩極分化。AMD和NVIDIA正忙於爭奪市場份額的激烈競爭,開源社區的開發需求還排不上他們的議程。
  Linux社區是基於協作來完成開發。多年以來,通過合作和開放,Linux急速發展,而Linux圖形棧似乎不為所動。圖形硬件廠商可選擇是否向開源社區貢獻力量,但很多廠商持不情願開源的態度。那些擁有高性能圖形顯卡的廠商難道不想讓他們的用戶擁有最好的用戶體驗?將產品信息隱藏起來,這些難道不會傷及他們的產品線?可以毫無疑問的說-他們違反了開源精神。


免責聲明!

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



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