LINUX.ORG.RU
ФорумTalks

Немного аналитики по поводу полноценного NVIDIA Optimus

 ,


0

0

Когда NVIDIA Optimus появился для Linux, Optimus там на самом деле не было, Смотрим конфиг:

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

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "<BusID for NVIDIA device here>"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    # Uncomment this line if your computer has no display devices connected to
    # the NVIDIA GPU.  Leave it commented if you have display devices
    # connected to the NVIDIA GPU that you would like to use.
    #Option "UseDisplayDevice" "none"
EndSection

Section "Device"
    Identifier "intel"
    Driver "modesetting"
EndSection

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

Получается что Intel отключен и используется только для вывода картинки с NVIDIA. А должно быть так: когда нагрузки мало, используется Intel и экономится батарея, а когда нагрузки много - включается NVIDIA. Можно только догадываться почему так. У меня есть версия.

Единственный поддерживаемый официально способ установить драйвер NVIDIA - установка из run-файла. RUN-файл, если кто-то не знает, это такой самораспаковывающийся архив. За 10 лет существования инсталлятор претерпел мало изменений (одно из недавних изменений - поддержка DKMS). Он тупо затирает системный OpenGL (/usr/lib/libGL.so.1) и копирует свой. При удалении (ключ --uninstall) инсталлятор возвращает прежний OpenGL из резервной копии. Это главный момент моей версии, которая будет ниже. Но есть и не главный: раньше инсталлятор также устанавливал заголовочные файлы (/usr/include/GL), но так как уже давно во всех стандартах в линуксе обязана быть установлена Mesa OpenGL, инсталлятор NVIDIA больше этого не делает. И то же самое пора бы делать с самой библиотекой. Речь об этом пойдёт ниже.

Таким образом, поддержку 3D-ускорения на компьютере с технологией Optimus получает либо Intel, либо NVIDIA. В зависимости от того, какой libGL.so.1 лежит в /usr/lib. Именно поэтому реализовать полноценный Optimus невозможно: представьте себе что разработчики NVIDIA оставили только свой OpenGL, а Intel оставили в режиме 2D. Народ бы не понял. Поэтому было сделано то, что сделано.

Но есть и неофициальные инсталляторы. Это пакеты из дистрибутивов Linux. Давайте посмотрим список файлов RPM-пакета для openSUSE (ссылка, tar.gz 9 Кб). Mesa OpenGL не затирается, так как NVIDIA OpenGL лежит здесь: /usr/lib/X11R6/lib/libGL.so.1. Если в такой системе взять любую 3D-игру и сделать ldd на её бинарнике, то будет не:

libGL.so.1 => /usr/lib64/libGL.so.1

а:

libGL.so.1 => /usr/X11R6/lib64/libGL.so.1

Путь до OpenGL был изменён где-то в системных настройках. То есть получается, что в одной системе всё-таки могут быть установлены и Mesa OpenGL, и NVIDIA OpenGL! Но так как официальный инсталлятор NVIDIA так не делает, то настоящего Optimus'а мы до сих пор не имеем.

P.S. А вот драйвер ATi/AMD официально предоставляет RPM/DEB, и его OpenGL лежит в /usr/X11R6/lib/fglrx/libGL.so.1. Заметьте, они создали отдельный каталог для своего OpenGL, то есть в этом /usr/X11R6 может лежать сколько угодно OpenGL. Также там есть программа switchGL, которая переключает системный OpenGL с MESA на AMD и обратно. Но к сожалению, приходится перезагружать графическую оболочку.

P.P.S. На Gentoo переключение OpenGL существовало ещё раньше, чем у AMD. «eselect opengl list», «eselect opengl set nvidia». А ldd на файлик игры выдаёт такой путь:

 libGL.so.1 => /usr/lib64/opengl/nvidia/lib/libGL.so.1

Вот же не лень тебе эти простыни со «срывом покровов» набирать.

Путь до OpenGL был изменён где-то в системных настройках.

/etc/ld.so.conf
/etc/ld.so.conf.d/*

То есть получается, что в одной системе всё-таки могут быть установлены и Mesa OpenGL, и NVIDIA OpenGL! Но так как официальный инсталлятор NVIDIA так не делает, то настоящего Optimus'а мы до сих пор не имеем.

Для Optimus'а они должны работать вместе, а не быть установлены вместе.

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

Но так как официальный инсталлятор NVIDIA так не делает, то настоящего Optimus'а мы до сих пор не имеем.

А я вот сижу на bumblebee, bbswitch и virtualgl с проприетарным блобом и даже об этом не догадывался.

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

Вот и я о том же. Bumblebee как раз работает в одной системе с двумя разными библиотеками OpenGL. Официальный Optimus - нет. Проблема в официальном инсталляторе и в том что он по-прежнему затирает MESA OpenGL.

ZenitharChampion ★★★★★ ()

Именно поэтому реализовать полноценный Optimus невозможно

Не поэтому. Оптимус это в первую очередь управление питанием, именно для этого и задумывался. Библиотеками ты всего лишь разруливаешь через что выводить картинку. Но если у тебя nvidia и так всё время вклчена то просто выводи картинку через неё и всё.

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

Проблема в официальном инсталляторе и в том что он по-прежнему затирает MESA OpenGL.

Не юзай официальный инсталлятор.

derlafff ★★★★★ ()

затирает системный OpenGL (/usr/lib/libGL.so.1)

Мне сейчас лень искать, но я как то на этом форуме приводил ссылку на рассылку mesa-dev в которой обсуждалась идея изменения стандарта на название libGL.so. Идея была в том что бы каждый вендор мог иметь свои libGL.so и они не конфликтовали между собой а подгружались в зависимости от ситуации. Так же была идея сделать различные библиотеки для OpenGL 1-2 и 3, и для OpenGL ES.

Behem0th ★★★★★ ()

В зависимости от того, какой libGL.so.1 лежит в /usr/lib. Именно поэтому реализовать полноценный Optimus невозможно

Разрабы bumblebee недоумевают.

fang90 ★★★★★ ()

То есть получается, что в одной системе всё-таки могут быть установлены и Mesa OpenGL, и NVIDIA OpenGL!

В альтлинуксе может быть установлено одновременно:
несколько драйверов nvidia
fglrx
mesa
поддержка 3д для virtualbox
и переключение между ними есть.
Правда оно там не очень качественно сделано.

onon ★★★ ()

Также там есть программа switchGL, которая переключает системный OpenGL с MESA на AMD и обратно.

Не напомните, кто её написал? Кажется Alberto Milone <alberto.milone@canonical.com>.

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

Правильно иметь один стандартый libGl с которым линкуются приложения и вендорские реализации, которые загружаются в runtime, то есть как в винде :)

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

В сусе, например, вместо switchGL есть switchlibGL. И написал его Sebastian Siebert.

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

нууу, как я понял из поста ТС, тут пофиг на шашечки - ехать надо. А ехать получается только с разными libGl:(

fang90 ★★★★★ ()

УМВР на Mint 13. По-дефолту используется интел. Стартеры optirun и primusrun запускают приложение на нвидии. При переходе в режим сбережения энергии все приложения перекладываются на интел. В общем, так же, как и на оффтопике.

segfault ★★★★★ ()

Добро пожаловать из криокамеры в 2013 год.

Deleted ()

Получается что Intel отключен и используется только для вывода картинки с NVIDIA. А должно быть так: когда нагрузки мало, используется Intel и экономится батарея, а когда нагрузки много - включается NVIDIA. Можно только догадываться почему так. У меня есть версия.

Если бы все дело было в libGl драйвер использовался intel, а не modsetting.

onon ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.