X Window System で 3D ハードウェアアクセラレーションを利用するための仕組みを DRI (Direct Rendering Interface/Infrastructure) と呼ぶ。 本稿では、FreeBSD 上で DRI を利用する方法を記述する。
drm-kmod-0.9.6 の対応による。 リスト参照。
※注: 以上は 2004/09/19 時点でのサポート状況である。
大雑把にまとめると、FreeBSD 4.8-RELEASE 以前のリリースでは、 Matrox Gシリーズ、ATI Rage128 と RADEON (7500、8500) シリーズ、 3DFX Voodoo シリーズがサポートされる。
4.8-RELEASE 以降なら Radeon 9000/9100、5-STABLE、6-CURRENT なら、 さらに SiS 630、730 などがサポートされる。
DRI を利用するには、OS 側、X 側の両方で準備が必要となる。 以下、その手順について解説する。
OS 側では、AGP チップセットをサポートするドライバ (agp) と 各ビデオチップをサポートするドライバをカーネルに組み込む 必要がある。ドライバはモジュールとしても組み込むことができる。
ports (/usr/ports/graphics/drm-kmod) でカーネルモジュールを インストールする。
# cd /usr/ports/graphics/drm-kmod # make install clean # cd /usr/local/etc/rc.d # mv drm.sh.sample drm.sh
agp ドライバは 2002/12/30 以降 GENERIC カーネルに組み込まれている。 ビデオチップ用のモジュールをロードするよう /boot/loader.conf に記述する。
device agp device mgadrm device "r128drm" device radeondrm device tdfxdrm
"device agp" は必須、それ以外のチップ依存のドライバについては、 必要な行をひとつ選んでコンフィグファイルに書き加える。
agp ドライバがカーネルに組み込まれており、 ビデオチップ用のモジュールは自動的にロードされるため、 特に操作する必要は無い。
カーネルコンフィグファイルに以下の記述を加えてカーネルをコンパイルする。
device mgadrm device "r128drm" device radeondrm device sisdrm device tdfxdrm
上の中から、必要な行をひとつ選んでコンフィグファイルに書き加える。
以上、いずれの場合においても、OS 起動時に AGP デバイスが認識されていることを確認すること。
# dmesg | grep agp agp0: <Intel 82815 (i815 GMCH) host to PCI bridge> mem 0xe0000000-0xe3ffffff at device 0.0 on pci0
この行が出ていない場合は、AGP チップセットがサポートされていないものと 思われる。
X については、Xorg の 6.7.0 以降、もしくは XFree86 の 4.3.0 以降を用意して、xorg.conf (または XF86Config) ファイルに以下の記述を加える。
Section "Module"
Load "dri"
Load "glx"
EndSection
一般ユーザ権限でも DRI を有効にするためには、以下の記述も必須である。
Section "DRI"
Mode 666
EndSection
X サーバを起動して、DRI が動作しているかどうか確認してみる。
/var/log/Xorg.0.log (XFree86.0.log) に、 以下のような行があれば導入成功である。
# grep drm /var/log/Xorg.0.log (II) Loading sub module "drm" (II) LoadModule: "drm" (II) Loading /usr/X11R6/lib/modules/freebsd/libdrm.a (II) Module drm: vendor="X.Org Foundation" drmOpenDevice: minor is 0 drmOpenDevice: node name is /dev/dri/card0 drmOpenDevice: open result is 6, (OK) drmOpenDevice: minor is 0 drmOpenDevice: node name is /dev/dri/card0 drmOpenDevice: open result is 6, (OK) drmOpenDevice: minor is 0 drmOpenDevice: node name is /dev/dri/card0 drmOpenDevice: open result is 6, (OK) drmGetBusid returned '' (II) RADEON(0): [drm] created "radeon" driver at busid "PCI:1:0:0" (II) RADEON(0): [drm] added 8192 byte SAREA at 0xc1ad6000 (II) RADEON(0): [drm] mapped SAREA 0xc1ad6000 to 0x28380000 (II) RADEON(0): [drm] framebuffer handle = 0xd0000000 (II) RADEON(0): [drm] added 1 reserved context for kernel (II) RADEON(0): [drm] register handle = 0xe5000000 (II) RADEON(0): [drm] installed DRM signal handler (II) RADEON(0): [drm] Added 32 65536 byte vertex/indirect buffers (II) RADEON(0): [drm] Mapped 32 vertex/indirect buffers (II) RADEON(0): [drm] dma control initialized, using IRQ 5 (II) RADEON(0): [drm] Initialized kernel GART heap manager, 5111808 (II) RADEON(0): [drm] removed 1 reserved context for kernel (II) RADEON(0): [drm] unmapping 8192 bytes of SAREA 0xc1ad6000 at 0x28380000
DRI 有効のときと無効のときの性能を比較するため、ベンチマークを取ってみた。 環境は以下の通り。
DRI によって OpenGL のハードウェアアクセラレーションが効くはずなので、 OpenGL のベンチマークを取ってみる。ソフトウェアは glclock 同梱の woodclock を利用した。
# woodclock
FPS で単純比較して、約20倍の性能向上が確認できた。
次に、X サーバの総合性能試験として xengine を使用した。
# xengine
この試験では OpenGL のハードウェアアクセラレーションは無関係のはずだが、 2倍近く性能が向上している。このあたりの理屈は、私にはよく解らないが。