Довелось мне заиметь ноутбук с технологией Nvidia Optimus.
Вкратце: в ноуте две видеокарты: интегрированная Intel и дискретная Nvidia. Nvidia карта работает используя Intel карту в качестве средства вывода изображения.
Intel карта маломощная, зато мало потребляет, Nvidia карта много потребляет, зато мощная и с реальным 3D ускорением.
Использование Intel карты с отключением питания у Nvidia карты снижает потребление на 10Вт, что выливается в продление времени работы от аккумуляторов.
Все бы ничего, но nvidia не хочет делать поддержку технологии Optimus для линукса. Под виндой все прозрачно: надо приложению мощь - задействуется nvidia.
Несколько месяцев назад возник проект Bumblebee, который используя VirtualGL позволил задействовать Nvidia и под линуксом.
Суть: для nvidia карты запускается отдельный X-сервер, приложение работает на нем (используя всю графическую мощь) а вывод уже отрендеренной картинки через VirtualGL направляется на основной X-сервер на intel карте.
В то время я попробовал это установить на slackware, но не получилось ;(
И вот, не далее как вчера, снова залез на страницу проекта и выяснил, что проект уже имеет форк, а автор сосредоточился на несколько других приоритетах и сделал еще свой форк
Страница основного форка:
https://github.com/Bumblebee-Project/BumblebeeВ нем чуток изменили идеологию, сосредоточились на стабильности и дистро-независимости. Решил попробовать и после пары часов ручных манипуляций (поддержки слаки изкаробки нет) у меня все получилось!
Хочу поделиться опытом и описать процесс.
Что требуется:
1. Архив самого проекта (на сейчас) - файл bumblebee-2.3.1.tar.gz (
https://github.com/Bumblebee-Project/Bumblebee/archives/master )
2. VirtualGL-2.2.90.tar.gz (
http://www.virtualgl.org/Downloads/VirtualGL )
3. libjpeg-turbo-1.1.1.tar.gz (
http://sourceforge.net/projects/libjpeg-turbo/ )
4. NVIDIA-Linux-x86-280.13.run (
http://nvidia.com )
5. дистрибутив slackware (серия x)
Установка.
1. Распаковываем, конфигурируем и устанавливаем libjpeg-turbo:
tar xzf libjpeg-turbo-1.1.1.tar.gz
cd libjpeg-turbo-1.1.1
./configure
# установка по умолчанию в /opt/libjpeg-turbo
make && make install
2. Установка VirtualGL:
tar xzf VirtualGL-2.2.90.tar.gz
cd VirtualGL-2.2.90
mkdir build
cd build
cmake -G "Unix Makefiles" ..
# установка по умолчанию в /opt/VirtualGL
make && make install
3. Установка драйверов Nvidia:
sh NVIDIA-Linux-x86-280.13.run --extract-only
cd NVIDIA-Linux-x86-280.13
# установка в /opt/nvidia
./nvidia-installer --x-prefix=/opt/nvidia --x-module-path=/opt/nvidia/modules --x-library-path=/opt/nvidia/lib \
--opengl-prefix=/opt/nvidia --utility-prefix=/opt/nvidia --documentation-prefix=/opt/nvidia/doc
3a. К сожалению, даже при установке в указанное место, инсталятор проверяет конфликты с системой и грохает несколько библиотек.
Чтобы восстановить статус-кво, идем в дистрибутив slackware в каталог x и делаем:
upgradepkg --reinstall mesa*txz xf86-video-intel*txz xorg-server*txz
4. Рспаковываем саму надстройку:
tar xzf bumblebee-2.3.1.tar.gz
По сути, весь проект - это обвязка над VirtualGL. Раскидываем файлы из каталога
install-files по соответствующими каталогам в системе:
mkdir /etc/bumblebee
mkdir /usr/lib/bumblebee
mkdir /usr/lib/bumblebee/drivers
cd bumblebee-2.3.1/install-files
cp bumblebee /usr/local/bin
cp optirun /usr/local/bin
cp common-functions /usr/lib/bumblebee
cp common-paths /usr/lib/bumblebee
cp bumblebee.conf /etc/bumblebee
cp xorg.conf.nvidia /etc/bumblebee
cp bumblebee.handler /etc/init.d/bumblebee # копируем под другим именем!
# создаем файлик, с заведомо излишней информацией
cat > /usr/lib/bumblebee/drivers/nvidia.options
#!/bin/bash
X_LD_LIB_PATH=/opt/nvidia/lib:/opt/nvidia:/opt/nvidia/modules:/opt/nvidia/modules/drivers:/opt/nvidia/modules/extensions:/usr/lib/modules:/usr/lib/modules/drivers:/usr/lib/modules/extensions
X_LD_LIB32_PATH=/opt/nvidia/lib:/opt/nvidia:/opt/nvidia/modules:/opt/nvidia/modules/drivers:/opt/nvidia/modules/extensions:/usr/lib/modules:/usr/lib/modules/drivers:/usr/lib/modules/extensions
X_LD_LIB64_PATH=/opt/nvidia/lib:/opt/nvidia:/opt/nvidia/modules:/opt/nvidia/modules/drivers:/opt/nvidia/modules/extensions:/usr/lib/modules:/usr/lib/modules/drivers:/usr/lib/modules/extensions
LD_LIBRARY_PATH=/opt/nvidia/lib:/opt/nvidia:/opt/nvidia/modules:/opt/nvidia/modules/drivers:/opt/nvidia/modules/extensions:/usr/lib/modules:/usr/lib/modules/drivers:/usr/lib/modules/extensions
MODULE_PATH="/opt/nvidia/lib,/opt/nvidia,/opt/nvidia/modules,/opt/nvidia/modules/drivers,/opt/nvidia/modules/extensions,/usr/lib/modules,/usr/lib/modules/drivers,/usr/lib/modules/extensions"
(тут жмем Ctrl-D)
Узнаем PCI ID nvidia карты:
lspci -d 10de: -n | grep '030[02]:' | cut -d' ' -f1 | tr . :
и прописываем его в файле /etc/bumblebee/xorg.conf.nvidia в строке с BusID
Накладываем следующий патч для файла /usr/lib/bumblebee/common-functions
--- common-functions.orig 2011-08-23 16:45:05.000000000 +0400
+++ common-functions 2011-08-31 00:16:18.000000000 +0400
@@ -204,18 +204,22 @@
BUMBLEBEE_GROUP=bumblebee
BUMBLEBEE_LOGFILE=/var/log/bumblebee.log
. "$BUMBLEBEE_CONFDIR/bumblebee.conf"
+PATH=$PATH:/opt/VirtualGL/bin
# allow the user to specify a custom xorg path, otherwise base on driver
[ -z "$X_CONFFILE" ] && X_CONFFILE="$BUMBLEBEE_CONFDIR/xorg.conf.${DRIVER}"
+ set_graphics_driver "$DRIVER"
+
# -config file use a certain xorg.conf so the nvidia drivers can be used
# -sharevts without this option, the current VTY running X becomes
# blank while the Bumblebee X server is running
# -nolisten tcp do not use start a TCP server listening for connections
# -noreset do not logout after the last program closes
- X_DAEMON_ARGS="-config $X_CONFFILE -sharevts -nolisten tcp -noreset"
+ X_DAEMON_ARGS="-config $X_CONFFILE \
+-modulepath $MODULE_PATH \
+-sharevts -nolisten tcp -noreset"
- set_graphics_driver "$DRIVER"
# Remove colon and everything before it: :1.0 -> 1.0
DISPLAY_NUMBER=${VGL_DISPLAY##*:}
И последний шаг: необходимо создать группу bumblebee и поместить себя в нее:
grep bumblebee /etc/group
bumblebee:x:1001:loe
Все Теперь можно запускать от root'а :
/etc/init.d/bumblebee startзапускать X-ы и в терминале запускать приложения (привожу пример запуска без и с акселерацией:
bash-4.1$ glxgears
Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
365 frames in 5.2 seconds = 69.732 FPS
300 frames in 5.1 seconds = 59.248 FPS
300 frames in 5.0 seconds = 59.643 FPS
bash-4.1$ optirun glxgears
4446 frames in 5.0 seconds = 889.065 FPS
5341 frames in 5.0 seconds = 1068.059 FPS
5242 frames in 5.0 seconds = 1048.386 FPS
Как видим, ускорение более чем в 10 раз
Хотя glxgears считает попугаи (да и привязывается к вертикальной развертке)
Более точную информацию дает glxspheres из комплекта VirtualGL:
bash-4.1$ /opt/VirtualGL/bin/glxspheres
Polygons in scene: 62464
Visual ID of window: 0x92
Context is Indirect
OpenGL Renderer: Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2
24.996526 frames/sec - 22.130924 Mpixels/sec
26.256435 frames/sec - 23.246398 Mpixels/sec
27.925248 frames/sec - 24.723897 Mpixels/sec
27.211555 frames/sec - 24.092022 Mpixels/sec
bash-4.1$ optirun /opt/VirtualGL/bin/glxspheres
Polygons in scene: 62464
Visual ID of window: 0x21
Context is Direct
OpenGL Renderer: GeForce 310M/PCI/SSE2
51.412526 frames/sec - 45.518594 Mpixels/sec
58.360952 frames/sec - 51.670453 Mpixels/sec
68.124850 frames/sec - 60.315017 Mpixels/sec
55.809707 frames/sec - 49.411682 Mpixels/sec
Не в 10 раз, но тоже не плохо
"No! Try not! Do. Or do not. There is no try." -- Yoda