ElementaryOS Luna: OSS Radeon + VDPAU на примере R600

04.04.2014

Некоторое время назад (если быть точным, до этого момента) пользоваться аппаратным ускорением на видеочипах Radeon можно было только с проприетарным драйвером AMD Catalyst. Драйвер этот был палкой о двух концах: с одной стороны, он давал отличную производительность OpenGL, поддерживал аппаратное декодирование видео (vaapi) и управление питанием GPU, но с другой — не умел KMS, медленно запускал X.org, зависел от собранного модуля ядра (блоба), имел проблемы с Flash-роликами и вообще в системе смотрелся как классический костыль.

К счастью, в последнее время открытый драйвер Radeon приблизился к Катаклизму по производительности и полностью догнал его в плане функциональности. Организовать аппаратное ускорение стало возможно и с открытым драйвером, и называется это VDPAU. У этой функции есть 2 основных применения:

  • снижение нагрузки на CPU при просмотре Flash-контента в браузере (пример, как это сделано для чипов Intel)
  • снижение нагрузки на CPU при декодировании видеофайла, за счёт использования аппаратного декодера (кино должно быть сжато кодеком, который поддерживается декодером, например H264)

В последних версиях Ubuntu (13.04, 13.10 и 14.04) наладить VDPAU сравнительно просто, нужно лишь подключить готовый PPA и установить из него libg3dvl-mesa. Особенность ElementaryOS в данном случае заключается в относительно «возрастной» платформе 12.04, для которой уже не получится поставить самую свежую Mesa 10.x. Однако, я выяснил, что организовать связку OSS Radeon+VDPAU в ElementaryOS Luna всё же можно. Мы будем использовать библиотеку libvdpau_r600.so, взятую из Арча, а сама Mesa останется в исходной версии 8.0. Да, у нас не будет последних оптимизаций из Mesa 10.0, но для наших задач это некритично: основная цель будет достигнута.

Основное исходное требование перед началом работы — ядро версии 3.10+, подхватившее прошивку (firmware) для вашего чипа Radeon. Подробно о том, как это сделать, я описал в своём мега-обзоре Прокачиваем ElementaryOS Luna.

Итак, поехали:

sudo apt-get install vdpauinfo vainfo
mkdir vdpau && cd vdpau
wget http://mirror.hatcolorsoft.com/testing/os/x86_64/ati-dri-8.99.git_20121006-1-x86_64.pkg.tar.xz
tar -xvf ati-dri-8.99.git_20121006-1-x86_64.pkg.tar.xz
sudo cp usr/lib/vdpau/libvdpau_r600* /usr/lib/x86_64-linux-gnu/
mkdir ~/libllvm && cd ~/libllvm
wget ftp://ftp.naist.jp/pub/Linux/archlinux/pool/packages/llvm-amdgpu-lib-snapshot-20130403-3-x86_64.pkg.tar.xz
tar -xvf llvm-amdgpu-lib-snapshot-20130403-3-x86_64.pkg.tar.xz
sudo cp usr/lib/libLLVM-3.2svn.so /usr/lib/x86_64-linux-gnu/

export LIBVA_DRIVER_NAME=vdpau

Проверьте вывод команд vainfo и vdpauinfo. Первая сообщит о работоспособности драйвера, вторая расскажет подробно о поддерживаемых функциях. Далее нужно указать под-драйвер для самого VDPAU. Как узнать, какой именно под-драйвер VDPAU вам нужен? Вот так:

cat /var/log/Xorg.0.log | grep -i vdpau

У меня это r600, у вас может быть любой (поддерживаются почти все радеоны)

Запустим браузер с целью комфортного просмотра Flash-контента:

VDPAU_DRIVER=r600 firefox

Запустим кино:

mplayer -vc ffh264vdpau кино.mp4

Примечание. Если запускать mplayer c параметром -vo vdpau, то это только включит вывод через VDPAU, декодирование будет выполняться по-прежнему программно. Нужно явно указывать кодек.

Далее нужно озаботиться тем, чтобы команда export LIBVA_DRIVER_NAME=vdpau была в автозагрузке, т.к. речь идёт о глобальной переменной. Без этой команды vainfo будет сообщать об ошибке.