xorg 架構 將來 以及一些基本常識淺析

很多Xorg相關文章,值得一讀:

http://blog.chinaunix.net/uid/269931/abstract/1.html

 

xorg的未來
http://imtx.cn/archives/1119.html
http://www.linuxsir.org/bbs/thread345792.html

看到大家對xorg存在很多的誤解和迷惑,下面是我個人的理解
下面都是很簡單的問答的形式,力求簡單的回答一些常識性的問題,說多了倒還難以理解了。

dri
關於dri,這個是xfree86 4.x就出來了,
主要是用來加速本地應用。現在的機器基本上都是自己用了,關於glx,dri怎麼實現的,從底下硬件,到上面driver到xorg,到應用程序怎麼工作的,需要一大篇專門的文章來講
不適合放在這裏了。無論dri還是dri2都是類似的,至於drm是什麼,drm是實現dri這個框架,需要內核的支持,這個部分就是內核那個部分的東西了。主要是資源管理,鎖管理
這些了。光dri這裏需要很長的文章來講,dri實際上可以看作一箇中間層,所有的人都通過dri來操作資源,xorg一樣。當然client可以是xorg也可以是其他的程序
xorg可以和硬件剝離開了。

xaa/kaa/exa/uxa

xaa是傳統的加速框架了。很多基本操作的接口都留出來有硬件加速的接口。但是後來有人研究發現,只需要加速很少的函數就可以了。
http://www.usenix.org/event/usenix04/tech/freenix/full_papers/anholt/anholt.pdf
所以就有了kaa,
kaa
kaa本來是kdrive使用的,Kdrive Acceleration Architecture
什麼是 kdrive. kdrive是xserver的一種,有人覺得xfree86太龐大了,所以就有了kdrive,開始的時候叫tinyx,
不同的xserver在代碼裏面是不同的目錄樹,都存放在hw下面。
ailantian@vax:~/soft/xorg/temp/xorg-server-1.6.0$ tree -L 1 hw
hw
|-- Makefile.am
|-- Makefile.in
|-- dmx
|-- kdrive
|-- vfb
|-- xfree86
|-- xnest
|-- xquartz
`-- xwin

7 directories, 2 files
ailantian@vax:~/soft/xorg/temp/xorg-server-1.6.0$

xfree86就是xorg的版本了,kdrive下面存放的都是kdrive的代碼了。編譯完之後就會放在kdrive/src/下面了,編譯完成叫Xfbdev.

exa
exa是大家認爲kaa這個框架很好,所以移植過來放到了xorg裏面,改了個名字叫exa,給xorg用的,當然需要xserver和驅動兩方面的工作,
對於xorg這邊實現的exa,代碼在hw/xfree86/exa/下面,驅動裏面會註冊這些函數,當調用gc的繪圖的函數的時候就會判斷驅動是否支持
硬件加速,如果支持就會使用硬件的,所謂的xf86-video-xxx這樣的驅動,基本都是exa的實現了,部分還會提供xaa的實現。

uxa
uxa是intel在exa的基礎上改了一些東西過來的,現在被拋棄的應該說。在intel這個版本的驅動裏面有uxa的實現,和exa基本相同
ailantian@vax:/mnt/sdb1/ubd/soft/xorg/temp/xf86-video-intel-2.6.99.902$ ls
acinclude.m4  autogen.sh  configure.ac  COPYING  cscope.files  cscope.out  Makefile.am  man  README  src  uxa
ailantian@vax:/mnt/sdb1/ubd/soft/xorg/temp/xf86-video-intel-2.6.99.902$


關於xvideo
現在xvideo不是和berly,compiz等等在一起的時候就會閃嗎,
http://imtx.cn/archives/1119.html
比如上面的文章就說到用dri2就可以了,實際上根本原因是現在xvideo的實現,一般來說第一個port都是使用overlay來實現的。
這裏又涉及到顯卡的硬件了,各家的硬件是五花八門,所以xorg的驅動這裏也是很亂,架構也很亂,想統一起來比較困難。這個單開一個標題來說。
目前的顯卡基本都是支持3d的,新的顯卡是隻有3d沒有2d的,xvideo這裏本來也是可以用texure來實現xvideo,用tuxture來實現xvideo的話
是不會有這個問題的。一般現在的顯卡,比如ati的driver,第一個port是overlay,剩下的15個port都是用tuxture來實現的。
用這種port的xvideo來播放視頻,然後與composite來一起工作是沒有問題的,compiz/berly都是用的composite了。
Xvideo的設計初衷是爲了快速的顯示圖片視頻,所以結果是直接輸出到屏幕的,這樣減少週轉,但是和composite的設計就背離了。
Xvideo的硬件加速框架比較簡單,不過還是需要專門的一篇文章來講解。
xvideo這邊就目前來說,好像很多接口都已經沒有人用了,用的就是XvPutImage,因爲Video本身來說解碼完成之後就是一幀一幀的數據。
到最後的目的無非就是要把這個frame顯示到屏幕上面,中途copy越少越好,能夠用到硬件加速就好,硬件的實現多種多樣,但是基本的要具備
格式轉換,比如yuv->rgb,因爲我們的屏幕是rgb的,但是mpeg4或者h264等等解開一般都是yuv格式的,當然yuv格式又分成很多種,硬件不一定
都支持,這個時候就需要軟件轉換,這個就是copyplanerdata或者copypackedata的工作了,他們都是用來封裝數據的,把數據封裝成硬件所支持的方式
然後就交給硬件去顯示,還有另外一個基本的功能,自然就是縮放了,比如視頻原始的分辨率是800x600,但是我們要全屏播放的時候就需要放大,
gpu其實很容易完成這個功能的。無論是pc級別的顯卡,還是現在application processor裏面的圖形加速單元,或者MDP(mobile display processor)
都能輕鬆的完成這樣的工作,這個如果用cpu來算,速度會慢的出奇,當然這個硬件加速需要另外專門的文章來講,因爲解碼編碼這裏需要很多的硬件資源。
各個流程之間的有可以整合的地方,以便讓系統發揮最大的性能優勢。

關於composite
Xomposite是一Xserver的一個擴展
composite可以完全用軟件來實現,比如metacity,xfwm,等等現在基本都可以自己支持composite了,composite下面實際上也可以調用硬件加速,
比如metacity的實現是使用的Xrender。XrenderComposite實際上這個跑到驅動裏面去的話,如果有exa就會調用到exapreparecomposite,checkcomposite
composite,donecomposite這些實現,如果要加速composite的話,就需要實現這些exa的擴展了,
composite的運作機制,實際上所有的畫面都是先離屏畫的,也就是說畫在一塊內存/顯存裏面,這塊內存是不直接顯示的,然後到最後把所有的窗口做alpha blending
然後才顯示到屏幕上面,這樣我們就可以看到透明效果了。
composite爲什麼打開之後系統變慢?原因很明顯,因爲所有的畫圖結果都不能直接顯示到屏幕,要先畫到後臺,然後windowmanager把當前所有window的buf
做alpha blending之後才顯示出來,本身這個框架就導致延遲,然後就是alpha 運算本身很慢了。


關於exa和Xrender的關係
說簡單一點就是Xrender是對上層應用的接口,上層的程序都是Xlib寫的,可以發起Xrender的請求,他們看到的都是Xrender的接口,當然這個是如果你想用Xrender
這個擴展的話,比如cairo,他繪圖的時候就可以選擇很多的後端,比如Xlib這個後端使用的就是Xrender,cairo還可以使用很多其他的後端,比如glx(使用的是glitz),



clutter
clutter這個東西是一個做程序的庫,可以用3d來做2d的程序,讓2d的程序有一些很庫的效果,其實就是做動畫。如果還是不明白就想想flash做的遊戲就可以了。
這個東西其實本來就是做animation用的,所有的東西都可以比對電影,比如timeline,比如actor,比如stage。clutter也有很多不同的後端,比如xlib
比如egl(使用的是opengles1.1或者2.0)或者eglx(使用的是egl+eglx的實現)

cairo
這個東西是一個2d矢量庫,用來做2d的矢量圖的,比如我們以前畫圖像tc裏面,就會有lineto,moveto,現在cairo看起來也是一樣的,不過cairo畫出來的是矢量圖。
也就是說在畫的時候算的。而不是像素的圖,如果是像素圖的話,放大就會很不清楚了。而矢量圖如果放大,實際上就是需要重新算,然後生成一個新的圖片,
比如圓,初始半徑是5,放大之後,它會重新畫一個半徑是10的圓,如果實在不清楚,就google一下矢量圖和位圖的區別。cairo是可以使用


gallium3d
這個東西是mesa的最新發展,主要是解決3d加速的問題了。因爲xorg的歷史悠久,遠遠老於linux了,從最早的時候來說,顯卡應該是沒有任何硬件加速能力的,
我沒有見過那麼古老的東西,不過sm501這樣的多媒體協處理器可能比較像早期的顯卡吧,不過好歹sm501還有一些硬件加速,算是2d的。後來慢慢發展顯卡有了2d加速單元
就類似sm501了,再後來顯卡支持了3d加速,就是離我們不遠吧,我們這代人可能沒用過有2d加速單元的顯卡,好像都是3d的,再後來顯卡就只有3d加速單元了,無非
2d是3d的一個特例。到現在顯卡支持更多的功能,比如shader,比如硬件解碼高清等等。一些人立志改變這種狀況,但是實際上這些東西都是商業公司在推動,如果
沒有商業公司的支持,就不可能發展了,當然另外一個方面是他們自己要用,開放出來有更多的人來看代碼,debug,還有就是3d這裏的框架本身就比較複雜了,就算開放出來
大家也還是需要一段時間來理解他們到底是怎麼設計的,因爲要按照這樣的框架來開發驅動。目前支持intel,amd,這些開源的驅動。
就目前的理解來說,無論用什麼來操作,比如directx,或者opengl,或者opengles,或者openvg,或者shader,或者其他的,無非都是畫一塊緩衝區。
然後後來輸出如果是xorg,那麼就調用xputimage去輸出這個緩衝區,xorg這邊因爲有exa的加速,所以也可以很快的輸出,xorg就不會去管理3d的任何東西了,
很多人一直想讓xorg的工作更加單純,只是管理這些窗口,clip region等等。不要搞的和硬件相關。gallium3d的發展趨勢來說,看起來是想統一圖形加速這一塊
無論是3d加速還是2d加速。

目前2d/3d加速的框架
目前用的最多的還是2d使用exa,3d使用dri,當然,exa這邊也可以使用dri來實現,所以到最終做事的還是dri這個框架。這樣就統一到dri了。
無論是dri還是dri2



硬件加速的實現
硬件加速無非就是寫寄存器了。數據傳遞了,這些。由於硬件實現的不同,對應用程序提供的接口也不同,
大家可以多看看開源的驅動就知道這些東西到底是怎麼工作的了。


Xgl的失敗
Xgl已經廢棄了。個人感覺失敗應該說是必然的。
xgl是基於kdrive的,這個的東西更新的相對來說很慢,xorg的代碼更新的很快,導致kdrive有些功能已經不能使用,連基本的鼠標處理流程都有問題了。
driver的問題,nvidia等廠家在xds的時候已經明確說明這種框架會導致dual port的驅動很難開發。而xgl的初衷就是爲了讓這些硬件廠家給linux提供高質量的opengl的driver
這個根本就沒有達到
glitz這個東西本來現在是隻能使用opengl,而opengles的接口做的很差勁
本來這個東西novel開始是閉源開發的。後來可能是不行所以開源了,然後後來xgl就轉向了嵌入式dri/egl這邊,但是mesa的egl的擴展一直沒有得到驅動廠商的支持,
這樣導致兩邊都不行。

從設計上來說xgl的所有的繪圖操作都是使用glitz的,但是glitz本身就是新開發的東西,那個時候未程序,而kdrive自己也有很大問題,而mesa/egl這邊也是剛開始做。
基本沒有一個東西是可用的,另外xgl自己也是新設計的東西,從頭開始實現的。

xgl下面的所有操作都是用glitz,所以就不存在所謂的2d加速了(沒仔細研究).因爲所有的東西都是走的GL,因爲現代的顯卡都只有3d加速單元和硬件視頻解碼單元了,
嵌入式application processor除外。


aiglx
這個東西,感覺沒什麼用,現在雖然已經成爲了標準的glx loader。但是好像就是爲了berly/compiz這樣的應用而存在的,需要mesa也做擴展。爲了好看,就要多做很多工作。


framebuffer
本來顯卡比如有512M的顯存,但是隻有一塊顯存是對應到我們的屏幕的。這個就是framebuffer了,
沒仔細看代碼,按理說/dev/fb這個抽象出來的設備應該就是把這塊內存抽象成這個設備,然後用戶空間可以mmap訪問了。


KMS
現在能夠操作顯卡的程序太多了,而且彼此不知道對方在幹什麼,比如framebuffer的driver就不知道xorg的driver在幹什麼,
所以開機的時候framebuffer的驅動初始化,顯示東西,然後等到啓動xorg的時候這個過程還要再來一遍,等到我們使用ctrl+alt+fx的時候又要關閉xorg這邊回到console
其實這個只要做一次就行了,所以有了kms。設置顯卡的mode只通過唯一的接口,當然這樣會導致操作fb的driver要改,比如目前的framebuffer框架要擴展一下,intel又走在前面
了,畢竟是開源的驅動。然後就是xorg的driver也要改一下,因爲xorg不需要做那麼多工作了,還有就是內核當然要提供這些kms的接口了。


暫時就說這些吧,硬件加速的實現之後在慢慢寫。講講kaa硬件加速和xvideo的硬件加速的實現。xorg+exa原理上來說差不多的。
需要一些圖片說明:)

國內做xorg或者kdrive相關的文章很少,硬件加速的實現就更少了,想分享出來大家一起學習。

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