Optimus: различия между версиями
Дым (обсуждение | вклад) (→DRI3) |
|||
(не показано 16 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
На данный момент существуют две технологии, которые позволяют использовать Optimus в Linux: Optimus/Prime и Bubmlebee. | На данный момент существуют две '''взаимоисключающие''' технологии, которые позволяют использовать Optimus в Linux: Optimus/Prime и Bubmlebee. Использовать возможно только одну из них. Эта статья описывает Optimus/Prime. Для bumblebee есть [[Nvidia optimus, настройка и запуск bumblebee|отдельная статья]]. | ||
=Optimus/Prime= | |||
Optimus/Prime позволяет использовать Optimus в двух режимах: 'PRIME GPU offloading' и 'Reverse PRIME'. Для его работы ему необходимы загруженные KMS- и DDX-драйвера для Intel'овской карточки и NVidia-карты. До недавнего времени KMS-драйвер для NVidia был только nouveau. В последнее время он появился и для проприетарного блоба от NVidia. | Optimus/Prime позволяет использовать Optimus в двух режимах: 'PRIME GPU offloading' и 'Reverse PRIME'. Для его работы ему необходимы загруженные KMS- и DDX-драйвера для Intel'овской карточки и NVidia-карты. До недавнего времени KMS-драйвер для NVidia был только nouveau. В последнее время он появился и для проприетарного блоба от NVidia. | ||
==DRI-2 — nouveau== | |||
== | Для работы Optimus/Prime необходимы: | ||
*обновлённый графический стек (ядро, xserver, mesa); | |||
Для работы Optimus/Prime | *загруженные драйвера KMS и DDX для обеих графических карт. | ||
Если всё в наличии, то <code>xrandr --listproviders</code> должен отобразить два ''провайдера'': | |||
* | $ xrandr --listproviders | ||
* | Providers: number : 2 | ||
Provider 0: id: 0x8a cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 2 outputs: 2 associated providers: 1 name:Intel | |||
Provider 1: id: 0x66 cap: 0x7, Source Output, Sink Output, Source Offload crtcs: 2 outputs: 5 associated providers: 1 | |||
Если всё | name:nouveau | ||
===Выгрузка рендеринга=== | |||
Важно сказать Prime-у, какую карту использовать для вывода отрендерённого изображения. Например, чтобы использовать Nouveau для выгрузки с Intel'овской карточки: | |||
$ xrandr --listproviders | $ xrandr --setprovideroffloadsink nouveau Intel | ||
Providers: number : 2 | Когда это сделано, очень просто выбрать карту, которая должна использоваться. Для выгрузки картинки из приложения на дискретную карту, требуется передать ему переменную окружения DRI_PRIME=1. Будучи запущено, для рендеринга оно задействует дискретную карту. Если же нужно использовать встроенную карту, следует установить DRI_PRIME в 0 или просто не передавать его. Поведение можно посмотреть на следующем примере: | ||
Provider 0: id: 0x8a cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 2 outputs: 2 associated providers: 1 name:Intel | $ DRI_PRIME=0 glxinfo | grep "OpenGL vendor string" | ||
Provider 1: id: 0x66 cap: 0x7, Source Output, Sink Output, Source Offload crtcs: 2 outputs: 5 associated providers: 1 name:nouveau | OpenGL vendor string: Intel Open Source Technology Center | ||
$ DRI_PRIME=1 glxinfo | grep "OpenGL vendor string" | |||
OpenGL vendor string: nouveau | |||
=== | ===Использование видеовыходов на дискретной карте=== | ||
Если на дискретной карте есть видеовыходы, недоступные на первичной, то их можно использовать с помощью "Reverse PRIME". После чего первичная видеокарта будет задействована под рендериг изображения, которое затем будет отправлено на дискретную видеокарту. Для этого нужно выполнить: | |||
Важно сказать Prime | $ xrandr --setprovideroutputsource nouveau Intel | ||
После чего видео-выход карты nvidia станет доступен в xrandr, и для добавления второго монитора, подключённого к карте NVidia, можно сделать сделать следующее: | |||
$ xrandr --output HDMI-1 --auto --above LVDS1 | |||
$ xrandr --setprovideroffloadsink nouveau Intel | ==DRI-2 — NVidia== | ||
=== Использование дискретной видеокарты в качестве основной === | |||
Когда это сделано, очень просто выбрать карту, которая должна использоваться. Для | |||
$ DRI_PRIME=0 glxinfo | grep "OpenGL vendor string" | |||
OpenGL vendor string: Intel Open Source Technology Center | |||
$ DRI_PRIME=1 glxinfo | grep "OpenGL vendor string" | |||
OpenGL vendor string: nouveau | |||
Если на дискретной карте есть | |||
$ xrandr --setprovideroutputsource nouveau Intel | |||
$ xrandr --output HDMI-1 --auto --above LVDS1 | |||
== | |||
(взято [https://wiki.archlinux.org/index.php/NVIDIA_Optimus отсюда]) | (взято [https://wiki.archlinux.org/index.php/NVIDIA_Optimus отсюда]) | ||
Необходимо донастроить Xorg (либо <code>/etc/X11/xorg.conf</code>, либо, что правильнее, что-то вроде <code>/etc/X11/xorg.conf.d/40-nvidia.conf</code>: | Необходимо донастроить Xorg (либо <code>/etc/X11/xorg.conf</code>, либо, что правильнее, что-то вроде <code>/etc/X11/xorg.conf.d/40-nvidia.conf</code>: | ||
<source lang=bash> | |||
Section "Module" | |||
Load "modesetting" | |||
EndSection | |||
Section "Device" | |||
Identifier "nvidia" | |||
Driver "nvidia" | |||
BusID "<Здесь надо вставить BUS ID NVidia карточки, например, 2:0:0>" | |||
Option "AllowEmptyInitialConfiguration" | |||
EndSection | |||
</source> | |||
BUS ID можно увидеть с помощью команды lspci | |||
<syntaxhighlight lang="text"> | |||
lspci | grep -i Vga | |||
0b:00.0 VGA .... Nvidia .... | |||
</syntaxhighlight> | |||
0b:00.0 - это и есть BUS ID карты | |||
====Выгрузка рендеринга==== | |||
В такой форме первичным экраном становится тот, что воткнут в дискретную карту, а экран ноутбука, отвечающий за интегрированную, доступен, но не управляется. | В такой форме первичным экраном становится тот, что воткнут в дискретную карту, а экран ноутбука, отвечающий за интегрированную, доступен, но не управляется. | ||
$ xrandr --listproviders | $ xrandr --listproviders | ||
<TODO показать пример вывода> | <TODO показать пример вывода> | ||
Для xrandr этот второй экран пока недоступен, надо вручную включить пересылку картинки: | Для xrandr этот второй экран пока недоступен, надо вручную включить пересылку картинки: | ||
$ xrandr --setprovideroutputsource modesetting NVIDIA-0 | $ xrandr --setprovideroutputsource modesetting NVIDIA-0 | ||
$ xrandr --auto | $ xrandr --auto | ||
После чего xrandr видит оба экрана : | После чего xrandr видит оба экрана : | ||
$ xrandr | $ xrandr | ||
<TODO показать пример вывода> | <TODO показать пример вывода> | ||
В результате всё вычисление и отрисовка идёт на NVidia, а получившаяся картинка сливается на intel. 3D на intel не работает, потому что NVidia подсовывает свою проприетарно захаканную Mesa, но оно там и не нужно. | |||
В результате всё вычисление и отрисовка идёт на NVidia, а получившаяся картинка сливается на intel. 3D на intel не работает, | |||
Изменять разрешение ''обоих'' экранов одной командой <code>xrandr</code> я пока не научился, но, например, KDE5 такие настройки понимает и умеет изменять. | Изменять разрешение ''обоих'' экранов одной командой <code>xrandr</code> я пока не научился, но, например, KDE5 такие настройки понимает и умеет изменять. | ||
==DRI-3== | |||
Реализация DRI3 стремится предоставить более пригодный способ использовать PRIME. Он требует несколько дополнительных шагов для установки: | Реализация DRI3 стремится предоставить более пригодный способ использовать PRIME. Он требует несколько дополнительных шагов для установки: | ||
* ядро версии 3.17 или выше | |||
* XServer 1.16 с поддержкой DRI3 | |||
* Mesa 10.3 с поддержкой DRI3 | |||
* загруженные драйвера KMS для обеих карт | |||
* загруженный драйвер DDX для первичной карты | |||
''Необходимо, чтобы пользователь входил в группу <code>xgrp</code>.'' | ''Необходимо, чтобы пользователь входил в группу <code>xgrp</code>.'' | ||
Если всё хорошо, то | Если всё хорошо, то выгрузка на дискретную карту осуществляется с помощью DRI_PRIME=1: | ||
$ DRI_PRIME=0 glxinfo | grep "OpenGL vendor string" | |||
OpenGL vendor string: Intel Open Source Technology Center | |||
$ DRI_PRIME=0 glxinfo | grep "OpenGL vendor string" | $ DRI_PRIME=1 glxinfo | grep "OpenGL vendor string" | ||
OpenGL vendor string: Intel Open Source Technology Center | OpenGL vendor string: nouveau | ||
$ DRI_PRIME=1 glxinfo | grep "OpenGL vendor string" | |||
OpenGL vendor string: nouveau | |||
== Ссылки == | == Ссылки == | ||
*[http://nouveau.freedesktop.org/wiki/Optimus/ | *[[Nvidia optimus, настройка и запуск bumblebee|Бамблби]] | ||
*[http://nouveau.freedesktop.org/wiki/Optimus/ Optimus] | |||
*[https://lists.altlinux.org/pipermail/hardware/2019-August/016760.html PRIME render offload] | *[https://lists.altlinux.org/pipermail/hardware/2019-August/016760.html PRIME render offload] | ||
*[https://bugzilla.altlinux.org/35779 Заявка на Оптимус-менеджер и его настройку из системного лотка] | |||
[[Категория:Руководства]] | [[Категория:Руководства]] | ||
{{Category navigation|title=Видеодрайвера|category=Видеодрайвера|sortkey={{SUBPAGENAME}}}} | {{Category navigation|title=Видеодрайвера|category=Видеодрайвера|sortkey={{SUBPAGENAME}}}} |
Текущая версия от 10:13, 1 марта 2024
На данный момент существуют две взаимоисключающие технологии, которые позволяют использовать Optimus в Linux: Optimus/Prime и Bubmlebee. Использовать возможно только одну из них. Эта статья описывает Optimus/Prime. Для bumblebee есть отдельная статья.
Optimus/Prime
Optimus/Prime позволяет использовать Optimus в двух режимах: 'PRIME GPU offloading' и 'Reverse PRIME'. Для его работы ему необходимы загруженные KMS- и DDX-драйвера для Intel'овской карточки и NVidia-карты. До недавнего времени KMS-драйвер для NVidia был только nouveau. В последнее время он появился и для проприетарного блоба от NVidia.
DRI-2 — nouveau
Для работы Optimus/Prime необходимы:
- обновлённый графический стек (ядро, xserver, mesa);
- загруженные драйвера KMS и DDX для обеих графических карт.
Если всё в наличии, то xrandr --listproviders
должен отобразить два провайдера:
$ xrandr --listproviders Providers: number : 2 Provider 0: id: 0x8a cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 2 outputs: 2 associated providers: 1 name:Intel Provider 1: id: 0x66 cap: 0x7, Source Output, Sink Output, Source Offload crtcs: 2 outputs: 5 associated providers: 1 name:nouveau
Выгрузка рендеринга
Важно сказать Prime-у, какую карту использовать для вывода отрендерённого изображения. Например, чтобы использовать Nouveau для выгрузки с Intel'овской карточки:
$ xrandr --setprovideroffloadsink nouveau Intel
Когда это сделано, очень просто выбрать карту, которая должна использоваться. Для выгрузки картинки из приложения на дискретную карту, требуется передать ему переменную окружения DRI_PRIME=1. Будучи запущено, для рендеринга оно задействует дискретную карту. Если же нужно использовать встроенную карту, следует установить DRI_PRIME в 0 или просто не передавать его. Поведение можно посмотреть на следующем примере:
$ DRI_PRIME=0 glxinfo | grep "OpenGL vendor string" OpenGL vendor string: Intel Open Source Technology Center $ DRI_PRIME=1 glxinfo | grep "OpenGL vendor string" OpenGL vendor string: nouveau
Использование видеовыходов на дискретной карте
Если на дискретной карте есть видеовыходы, недоступные на первичной, то их можно использовать с помощью "Reverse PRIME". После чего первичная видеокарта будет задействована под рендериг изображения, которое затем будет отправлено на дискретную видеокарту. Для этого нужно выполнить:
$ xrandr --setprovideroutputsource nouveau Intel
После чего видео-выход карты nvidia станет доступен в xrandr, и для добавления второго монитора, подключённого к карте NVidia, можно сделать сделать следующее:
$ xrandr --output HDMI-1 --auto --above LVDS1
DRI-2 — NVidia
Использование дискретной видеокарты в качестве основной
(взято отсюда)
Необходимо донастроить Xorg (либо /etc/X11/xorg.conf
, либо, что правильнее, что-то вроде /etc/X11/xorg.conf.d/40-nvidia.conf
:
Section "Module"
Load "modesetting"
EndSection
Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID "<Здесь надо вставить BUS ID NVidia карточки, например, 2:0:0>"
Option "AllowEmptyInitialConfiguration"
EndSection
BUS ID можно увидеть с помощью команды lspci
lspci | grep -i Vga
0b:00.0 VGA .... Nvidia ....
0b:00.0 - это и есть BUS ID карты
Выгрузка рендеринга
В такой форме первичным экраном становится тот, что воткнут в дискретную карту, а экран ноутбука, отвечающий за интегрированную, доступен, но не управляется.
$ xrandr --listproviders <TODO показать пример вывода>
Для xrandr этот второй экран пока недоступен, надо вручную включить пересылку картинки:
$ xrandr --setprovideroutputsource modesetting NVIDIA-0 $ xrandr --auto
После чего xrandr видит оба экрана :
$ xrandr <TODO показать пример вывода>
В результате всё вычисление и отрисовка идёт на NVidia, а получившаяся картинка сливается на intel. 3D на intel не работает, потому что NVidia подсовывает свою проприетарно захаканную Mesa, но оно там и не нужно.
Изменять разрешение обоих экранов одной командой xrandr
я пока не научился, но, например, KDE5 такие настройки понимает и умеет изменять.
DRI-3
Реализация DRI3 стремится предоставить более пригодный способ использовать PRIME. Он требует несколько дополнительных шагов для установки:
- ядро версии 3.17 или выше
- XServer 1.16 с поддержкой DRI3
- Mesa 10.3 с поддержкой DRI3
- загруженные драйвера KMS для обеих карт
- загруженный драйвер DDX для первичной карты
Необходимо, чтобы пользователь входил в группу xgrp
.
Если всё хорошо, то выгрузка на дискретную карту осуществляется с помощью DRI_PRIME=1:
$ DRI_PRIME=0 glxinfo | grep "OpenGL vendor string" OpenGL vendor string: Intel Open Source Technology Center $ DRI_PRIME=1 glxinfo | grep "OpenGL vendor string" OpenGL vendor string: nouveau