LINUX.ORG.RU

NVIDIA Prime на не-Ubuntu

 , , ,


7

4

Эта инфа есть в Gentoo Wiki и Arch Wiki, но всё равно тема с завидной регулярностью поднимается на ЛОРе. Поэтому я решил написать об этом здесь. Красивой переключалки не будет: только правкой конфигов.

Практическая часть

Убедитесь что версия вашего ядра Linux ≥ 3.13, X-Server ≥ 1.13, xrandr ≥ 1.4, драйвера NVIDIA ≥ 319.xx. Версию ядра Linux, минимально необходимую для NVIDIA Prime, подняли в драйвере 364.xx: раньше была 3.9.

Создайте /etc/X11/xorg.conf со следующим содержимым:

Section "ServerLayout"
    Identifier "layout"
    Screen 0 "nvidia"
    Inactive "intel"
EndSection

Section "Device"
    Identifier "intel"
    Driver     "modesetting"
    Option     "AccelMethod" "none"
    BusID      "PCI:0:2:0"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID  "1:0:0"
    Option "AllowEmptyInitialConfiguration"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device     "nvidia"
    Option     "UseDisplayDevice" "none"
EndSection

Вместо PCI:1:0:0 и PCI:0:2:0 подставьте свои значения, узнав их с помощью lspci. Чаще всего, значения именно эти.

Добавьте в конфиг-файл своего графического менеджера входа в систему эти команды:

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

GDM:

Файл /etc/X11/gdm/Init/Default, просто добавьте в конец, перед «exit 0»

KDM:

Файл /usr/share/config/kdm/Xsetup, просто добавьте в конец.

LightDM:

Создайте файл /etc/lightdm/display_setup.sh со следующим содержимым:

#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

Выполните chmod +x /etc/lightdm/display_setup.sh.
В файле /etc/lightdm/lightdm.conf найдите секцию [Seat:*], а в нём display-setup-script=. Добавьте/раскомментируйте эту строку, затем приведите к виду:

[Seat:*]
display-setup-script=/etc/lightdm/display_setup.sh

Остальные графические менеджеры входа в систему

https://wiki.gentoo.org/wiki/NVIDIA/Optimus#Display_manager_configuration,
https://wiki.archlinux.org/index.php/NVIDIA_Optimus#Display_Managers

Решение бага с обрезанным экраном в Minecraft

В Minecraft, при нажатии клавиши F11, включается полноэкранный режим. С приведённым мной конфигом, вы увидите прямоугольник 640x480, и чёрный экран на остальной площади. С другими полноэкранными играми такого бага нет.

Я нашёл решение проблемы, когда читал Xorg.0.log. Виртуальный экран стартует с разрешением 640x480, затем пробрасывается на Intel, затем меняет размер на реальный. Нужно сделать так, чтобы виртуальный экран создался сразу с нужным разрешением.

В xorg.conf в секцию «„Screen“, Identifier „nvidia“», добавьте это (поменяв моё разрешение на ваше):

    SubSection "Display"
        Virtual     1600 900
    EndSubSection

Теоретическая часть

В 2010 году появились ноутбуки с технологией NVIDIA Optimus. Это гибридная графика: в ноутбуке установлено два видеочипа - Intel и NVIDIA - работающие в связке. Когда нужен слабый 3D-рендеринг (эффекты рабочего стола, офисные игры, казуальные игры, опенсорсные игры) используется Intel. Когда нужен сильный 3D-рендеринг, используется NVIDIA. Работают они по-очереди: пока один выводит графику, другой «спит». Вот вся суть в одной наклейке: если бы NVIDIA умела потреблять так мало энергии, то устанавливали бы только этот чип. Если бы Intel мог выдавать столько производительности, то ставили бы только его.

Это не первое поколение гибридной графики от NVIDIA: помните ещё был NVIDIA ION?

В Windows, чтобы использовать гибридную графику, необходим новый графический стек, который появился в Windows Vista. Помните такой? Как много было новостей в игровой и айти-прессе о том, как трудно на него переходят. Однако я ни разу не видел драйверов Optimus с поддержкой Vista: ION да, а Optimus - только 7 и новее.

А в Windows XP вам достаётся только видеочип Intel. На ноутбуках с ION можно было выбрать видеочип в BIOS, и пользоваться им в WinXP. Но в Optimus NVIDIA и не имеет физического вывода на монитор, а только записывает данные в видеопамять чипа Intel.

В Linux мы имели картину, аналогичную Windows XP. С тем лишь отличием, что в WinXP инсталлятор драйвера говорил, что чип не поддерживается в этой системе. А в Linux предлагал запустить себя с параметром --no-opengl-files, чтобы пользоваться CUDA и OpenCL (фактически, использовать чип NVIDIA в качестве сопроцессора). Это отличие говорит о том, что NVIDIA имела планы реализовать Optimus в Linux. Намёк на это давался в этом интервью: «отсутствие разгона на последней серии видеокарт - это следствие расставления приоритетов. Нам важнее реализовать поддержку XRandr 1.2 и новее, чем это». Как выяснилось позже, XRandr 1.2 и новее был нужен NVIDIA именно для Оптимуса.

Затем появилась гибридная графика от AMD. Обычно это был Mobility Radeon 4250 + что-нибудь крутое. В Catalyst для Linux можно было выбрать, через какой из чипов выводить: энергосберегающий или производительный. Чтобы применить изменения, нужно было перезапустить X-Server.

В середине 2011 года появилась прога под названием Bumblebee. Это программа от сторонних разработчиков (не NVIDIA), реализующая Optimus очень просто. На чипе NVIDIA включается виртуальный дисплей. На него выводится игра, или что вам там нужно? С помощью проги VirtualGL прямоугольник с игрой пробрасывается на реальный экран, подключенный к чипу Intel. Всё просто.

NVIDIA изменила сообщение, выводимое официальным инсталлятором в Linux при попытке запустить его на ноутбуке с Optimus-ом. «Используйте Bumblebee».

В 2012 году появился целый ряд технологий, явно направленных на работу гибридной графики в Linux, и для NVIDIA Optimus в том числе. DRI3, DMA-BUF, DRI-PRIME.

В 2013 году состоялся релиз драйвера NVIDIA 319.xx, начиная с которого поддержка Optimus была официально. Однако многие остались на Bumblebee: технология NVIDIA Prime (назовём её так) поддерживала только использование второго GPU как основного, но не переключаемую графику. А Bumblebee поддерживает и переключаемую графику тоже.

А опенсорсные драйверы intel, radeon и nouveau поддерживают запуск игры таким образом:

$ glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile
$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: Gallium 0.4 on NV1

В настоящее время происходит внедрение в дистрибутивы Linux технологии glvnd, которая позволит делать то же самое с проприетарным драйвером NVIDIA.

А пока рассмотрим то, что есть. Итак, вам по какой-то причине не нравится Bumblebee, и вы решили попробовать NVIDIA Prime. Однако только в Ubuntu Linux это делается в один клик мышью (картинка очень похожа на Catalyst по ссылке выше, не находите?), а в остальных дистрибутивах Linux нужно конфиги править. Давайте разберёмся, какие и как.

Что почитать?

http://ru.download.nvidia.com/XFree86/Linux-x86_64/384.69/README/randr14.html
https://github.com/Bumblebee-Project/Bumblebee/wiki/History-of-the-project
https://devtalk.nvidia.com/default/topic/957814/linux/prime-and-prime-synchronization/post/4964506/#4964506 Важная информация
https://wiki.gentoo.org/wiki/NVIDIA/Optimus
https://wiki.archlinux.org/index.php/NVIDIA_Optimus

Это я сказал для краткости. На самом деле, «спит» только NVIDIA, как самая энергопотребляемая. А Intel не спит даже когда активна NVIDIA: к ней физически подключен монитор, поэтому Intel выводит.

ZenitharChampion ★★★★★ ()

Я не стал писать в основной текст то, в чём не уверен. Мне кажется что NVIDIA ION в 2008 году, а также NVIDIA Optimus в 2010, появились в ответ на приобретение ATi компанией AMD. Я помню интеграшку Radeon HD 3250 в 2008 году, она нормально запускала Oblivion и Stalker. Это был огромный шаг вперёд по сравнению с первой интеграшкой от Intel, которую я увидел в 2005: она могла запускать в лучшем случае Quake III. Мне кажется что Intel сильно испугался, и поэтому заключил соглашение с NVIDIA. Не о покупке, правда, а о сотрудничестве. «Нам нужны годы, чтобы догнать интеграшки AMD. Сотрудничество с вами может дать нам такую отсрочку».

ZenitharChampion ★★★★★ ()

Я привёл эту ссылку потому, что автор поста провёл тщательное исследование реализации Optimus от самой NVIDIA. Вот что он выяснил:

  • Если у вас Source-based дистрибутив Linux, вы обязаны собрать X-Server с поддержкой Glamor, но не использовать эту технологию от Intel. Лично для меня это стало подводным камнем: компилируя систему, я выключил USE-флаг «glamor». Слишком умный: знал что это такое, знал что NVIDIA это не поддерживает - ну и зачем тогда это собирать? А потом не понимал, почему ничего не работает.
  • В оригинальном xorg.conf от NVIDIA сначала идёт секция NVIDIA, а потом Intel. Начиная с X-Server 1.17, это не работает. Нужно чтобы сначала была секция Intel, а потом NVIDIA! Причём ещё и в Xorg.0.log ничто не указывает на проблему - только (WW) Falling back to old probe method for modesetting

Этот парень написал обо всём этом. И что странно, мануалку на сайте NVIDIA до сих пор не поправили.

ZenitharChampion ★★★★★ ()
Последнее исправление: ZenitharChampion (всего исправлений: 1)

В настоящее время происходит внедрение в дистрибутивы Linux технологии glvnd, которая позволит делать то же самое с проприетарным драйвером NVIDIA.

$y -Qs glvnd
multilib/lib32-libglvnd 0.2.999+g4ba53457-2
    The GL Vendor-Neutral Dispatch library
extra/libglvnd 0.2.999+g4ba53457-2
    The GL Vendor-Neutral Dispatch library

$y -Qi mesa
Name            : mesa
Version         : 17.1.7-2
Description     : an open-source implementation of the OpenGL specification
Architecture    : x86_64
URL             : http://mesa3d.sourceforge.net
Licenses        : custom
Groups          : None
Provides        : ati-dri  intel-dri  nouveau-dri  svga-dri  mesa-dri  mesa-libgl  opengl-driver
Depends On      : libdrm  wayland  libxxf86vm  libxdamage  libxshmfence  libelf  libomxil-bellagio  libtxc_dxtn  libunwind  llvm-libs  lm_sensors
                  libglvnd
Optional Deps   : opengl-man-pages: for the OpenGL API man pages
                  mesa-vdpau: for accelerated video playback
                  libva-mesa-driver: for accelerated video playback
Required By     : bumblebee  efl-git  gtk3-mushrooms  lib32-mesa  libglvnd  nvidia-xrun  xf86-video-intel
Optional For    : None
Conflicts With  : ati-dri  intel-dri  nouveau-dri  svga-dri  mesa-dri  mesa-libgl
Replaces        : ati-dri  intel-dri  nouveau-dri  svga-dri  mesa-dri  mesa-libgl
Installed Size  : 58.74 MiB
Packager        : Laurent Carlier <lordheavym@gmail.com>
Build Date      : Fri 25 Aug 2017 10:20:42 AM MSK
Install Date    : Sat 26 Aug 2017 06:03:35 PM MSK
Install Reason  : Installed as a dependency for another package
Install Script  : No
Validated By    : Signature

допустим mesa собрана с libglvnd - как это помогает получить аналогичную bumblebee функциональность ?

dhampire ★★★ ()
Последнее исправление: dhampire (всего исправлений: 1)
Ответ на: комментарий от dhampire

Нужно установить драйвер NVIDIA с параметрами:

--install-libglvnd --glvnd-glx-client --glvnd-egl-client

Первый параметр не обязательно - если у тебя Mesa уже собрана с этой библиотекой, значит у тебя в системе она уже есть.

Я подозреваю что это не все параметры, которые нужны. Ещё нужно --opengl-prefix, чтобы реализация NVIDIA не затирала Месу.

Но лучше подождать, когда это сделают авторы дистра. Чтобы они грамотно расположили файлы библиотек Mesa и NVIDIA.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=package... https://www.archlinux.org/packages/extra/x86_64/nvidia-utils/files/ судя по то что творится в PKGBUILD и содержимому пакета всё на месте, вот только чего с этим делать всё равно не ясно.

dhampire ★★★ ()
Ответ на: комментарий от dhampire

отключил шмеля загрузил модули nvidia добавил в ~/.xinitrc

xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
получилось после перезапуска иксов так
~|⇒ DRI_PRIME=1 glxinfo | grep "OpenGL renderer"
OpenGL renderer string: NVS 5400M/PCIe/SSE2
~|⇒ glxinfo | grep "OpenGL renderer"
OpenGL renderer string: NVS 5400M/PCIe/SSE2
~|⇒ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x2c3 cap: 0x1, Source Output crtcs: 2 outputs: 8 associated providers: 1 name:NVIDIA-0
Provider 1: id: 0x44 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 2 associated providers: 1 name:modesetting
получился весь рендер gl через nvidia.

Вывод: это «совсем» не аналог bumblebee, но скорее nvidia-prime или я что-то делаю не так.

dhampire ★★★ ()
Ответ на: комментарий от dhampire

У меня тоже не получилось. Возможно, нужно грузиться с драйвером i965, не создавать специальный конфиг xorg.conf, и не прописывать xrandr. Возможно, это пока не работает официально. Я не знаю.

ZenitharChampion ★★★★★ ()
Последнее исправление: ZenitharChampion (всего исправлений: 1)

Решение для тех, у кого dm нет будет?

p.s. минимально установленный прайм не отображается в nvidia-settings

А так же плюется эррорами во время загрузки связанными с lightdm, которого у меня нет и не будет

p.s.2

nvidia-settings

ERROR: Error querying enabled displays on GPU 0 (Missing Extension).


ERROR: Error querying connected displays on GPU 0 (Missing Extension).

** Message: PRIME: No offloading required. Abort
** Message: PRIME: is it supported? no

ERROR: nvidia-settings could not find the registry key file. This file should
       have been installed along with this driver at
       /usr/share/nvidia/nvidia-application-profiles-key-documentation. The
       application profiles will continue to work, but values cannot be
       prepopulated or validated, and will not be listed in the help text.
       Please see the README for possible values and descriptions.

BitSum ★★ ()
Последнее исправление: BitSum (всего исправлений: 3)
Ответ на: комментарий от BitSum

То есть, с моим xorg.conf, а также с изменениями в конфиг-файл GDM/KDM/etc из Wiki, не работает. А как проявляется?

Я дополнил статью информацией о том, что хотя у большинства PCI:1:0:0, нужно проверить, а вдруг нет.

ZenitharChampion ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

То есть, с моим xorg.conf, а также с изменениями в конфиг-файл GDM/KDM/etc из Wiki, не работает. А как проявляется?

<<

С вашим xorg конфигом никаких изменений нет вообще, визуальных.

В nvidia-settings пусто, а прайм при запуске nvidia-settings бьёт ошибки. При загрузки системы прайм требует DM, в частности lightdm.

dm я устанавливать не буду, тк меня устраивает вход через терминал с последующей загрузкой иксов через ~/.bash_profile и виртуалбокса.

p.s. вывод с lspci:

01:00.0 VGA compatible controller: NVIDIA Corporation GK107M [GeForce GT 730M] (rev a1)

BitSum ★★ ()
Последнее исправление: BitSum (всего исправлений: 1)
Ответ на: комментарий от BitSum

> dm я устанавливать не буду, тк меня устраивает вход через терминал с последующей загрузкой иксов через ~/.bash_profile и виртуалбокса.

Тогда:

The X server does not automatically enable displays attached to the non-NVIDIA graphics device in this configuration. To do that, use the xrandr command line tool:

$ xrandr --setprovideroutputsource modesetting NVIDIA-0
$ xrandr --auto

This pair of commands can be added to your X session startup scripts, for example by putting them in $HOME/.xinitrc before running startx.

ZenitharChampion ★★★★★ ()
Последнее исправление: ZenitharChampion (всего исправлений: 2)

Зачем? Это борьба за глобальное потепление? За тиринг? За пустые батареи? Я с Убунты свалил, потому что (кроме всего прочего) эта сука постоянно пыталась включить мне прайм, после чего я получал чёрный экран. Нет, конечно, я же мог поправить Xorg.conf вручную, дажлый раз (но зачем?). А вы добровольно на этот кактус лезете???

Deleted ()
Ответ на: комментарий от Deleted

'Этот кактус' имеет более интересные фичи, чем дебиан, в частности максимально минимальную базовую систему через нетинсталл, минимальные пакеты и энтерпрайзные фичи.

То есть - неплохо умеет десктоп и сервер. Но проблемы есть у всех, как же без этого.

BitSum ★★ ()
Ответ на: комментарий от ZenitharChampion

То есть, .xinitrc выполняется раньше, чем

cat .bash_profile 
startx

?

p.s. Иксы не стартуют, ругается на NVIDIA-0

кстати, в логах можно наблюдать ещё это;

[ 15.553] (EE) Failed to initialize GLX extension (Compatible NVIDIA X driver not found)

BitSum ★★ ()
Последнее исправление: BitSum (всего исправлений: 2)
Ответ на: комментарий от BitSum

Либо нет файла nvidia_drv.so в одной из следующих директорий:

/usr/lib/xorg/modules/drivers/
/usr/lib/xorg/modules/updates/drivers/

Там ещё может быть поддиректория, я не помню как там в Debian после перехода на мультилиб.

Либо файл есть, но у тебя слишком новый X-Server. Какой-нибудь 1.20.

ZenitharChampion ★★★★★ ()