Sunday, December 14, 2008

一千零一夜之 DRI

這個系列是讀書筆記,作者可能沒有跟主題有關的開發經驗。


DRI 讓 X clients 可以直接利用硬體來做繪圖,這點可以利用下面指令看出來:

olvaffe@m500:~$ glxgears &
[1] 24684
olvaffe@m500:~$ cat /proc/24684/maps
08048000-0804b000 r-xp 00000000 08:03 80591 /usr/bin/glxgears
0804b000-0804c000 rw-p 00002000 08:03 80591 /usr/bin/glxgears
...
b38fa000-b58fa000 rw-s e6000000 00:0d 7315 /dev/dri/card0
b58fa000-b62fa000 rw-s e5000000 00:0d 7315 /dev/dri/card0
b62fa000-b6cfa000 rw-s e4000000 00:0d 7315 /dev/dri/card0
b6cfa000-b733a000 rw-s 2c200000 00:0d 7315 /dev/dri/card0
b733a000-b797a000 rw-s 2c200000 00:0d 7315 /dev/dri/card0
...
b79a0000-b7bbd000 r-xp 00000000 08:03 347365 /usr/lib/dri/i915_dri.so
b7bbd000-b7bd1000 rw-p 0021c000 08:03 347365 /usr/lib/dri/i915_dri.so
b7c00000-b7c07000 r-xp 00000000 08:03 66335 /usr/lib/libdrm.so.2.3.1
b7c07000-b7c08000 rw-p 00006000 08:03 66335 /usr/lib/libdrm.so.2.3.1
b7eb5000-b7f11000 r-xp 00000000 08:03 69724 /usr/lib/libGL.so.1.2
b7f11000-b7f17000 rw-p 0005b000 08:03 69724 /usr/lib/libGL.so.1.2
...

我們可以看到,glxgears 把 i915_dri.so (intel 的 driver) 載進來並且開啟了 /dev/dri/card0。而在不使用 DRI 的時候:

olvaffe@m500:~$ LIBGL_ALWAYS_INDIRECT=1 glxgears &
[1] 24834
olvaffe@m500:~$ cat /proc/24834/maps
08048000-0804b000 r-xp 00000000 08:03 80591 /usr/bin/glxgears
0804b000-0804c000 rw-p 00002000 08:03 80591 /usr/bin/glxgears
...
b7bd3000-b7bda000 r-xp 00000000 08:03 66335 /usr/lib/libdrm.so.2.3.1
b7bda000-b7bdb000 rw-p 00006000 08:03 66335 /usr/lib/libdrm.so.2.3.1
...
b7e88000-b7ee4000 r-xp 00000000 08:03 69724 /usr/lib/libGL.so.1.2
b7ee4000-b7eea000 rw-p 0005b000 08:03 69724 /usr/lib/libGL.so.1.2
...

則少了上述的檔案。這是因為繪圖方面都轉送給 X server 去處理。如果用 CPU usage 去看,也可以看出在這兩個情形下,比較忙的可能是 server 或著是 client。而就像 client 可以利用 DRI 做加速一樣,X server 在收到 client 的請求時,也可以利用 DRI 去完成這些請求,這個技術被稱為 AIGLX (Accelerated Indirect GLX)。

從上面的例子我們可以看出 DRI 這個架講的基本組成份子:提供 /dev/dri/card0 的 i915 kernel module、存取這個裝置用到的 libdrm、Mesa 提供的 libGL 與 i915_dri.so、最後 X server 那邊提供了 GLX 跟 DRI server extensions。值得一提的是,X server 這邊雖然沒有用到 libGL,但它其實用到了部份 Mesa 的 source 來實作 GLX 跟 DRI server extensions,在 AIGLX 的情況下,甚至會 dlopen i915_dri.so 來用。

1 comment:

David Wang said...

是card0不是card"o"

我是去年osdc上跟你討論過linux drm的David