Optimus: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Строка 1: Строка 1:
На данный момент существуют две технологии, которые позволяют использовать Optimus в Linux: Optimus/Prime и Bubmlebee. Эти технологии взаимоисключающие: необходимо использовать одну из их в один момент. Эта статься описывает Optimus/Prime. Для bumblebee есть [[Nvidia optimus, настройка и запуск bumblebee|отдельная статья]].
На данный момент существуют две технологии, которые позволяют использовать Optimus в Linux: Optimus/Prime и Bubmlebee. Эти технологии взаимоисключающие: необходимо использовать одну из их в один момент. Эта статься описывает Optimus/Prime. Для bumblebee есть [[Nvidia optimus, настройка и запуск bumblebee|отдельная статья]].
 
=Optimus/Prime=
== 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==
=== DRI2 / nouveau ===
Для работы Optimus/Prime необходимы:
 
* обновлённый графический стек (ядро, xserver, mesa)
Для работы Optimus/Prime необходимо:
* загруженные драйвера KMS и DDX для обеих графических карт
 
* Обновлённый графический стек (ядро, xserver, mesa)
* Загруженные драйвера KMS для обеих графических карт
* Загруженные драйвера DDX для обеих графических карт
 
Если всё хорошо, то <code>xrandr --listproviders</code> должен отобразить два ''провайдера'':
Если всё хорошо, то <code>xrandr --listproviders</code> должен отобразить два ''провайдера'':
 
$ xrandr --listproviders  
<pre>
Providers: number : 2
$ xrandr --listproviders  
Provider 0: id: 0x8a cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 2 outputs: 2 associated providers: 1 name:Intel
Providers: number : 2
Provider 1: id: 0x66 cap: 0x7, Source Output, Sink Output, Source Offload crtcs: 2 outputs: 5 associated providers: 1  
Provider 0: id: 0x8a cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 2 outputs: 2 associated providers: 1 name:Intel
name:nouveau
Provider 1: id: 0x66 cap: 0x7, Source Output, Sink Output, Source Offload crtcs: 2 outputs: 5 associated providers: 1 name:nouveau
===3D-офлоуд===
</pre>
 
==== 3D оффлоадинг ====
 
Важно сказать Prime'у какую карту использовать для оффлоадинга. Например, для того, чтобы использовать Nouveau для оффлоадинга Intel'овской карточки:
Важно сказать Prime'у какую карту использовать для оффлоадинга. Например, для того, чтобы использовать Nouveau для оффлоадинга Intel'овской карточки:
 
$ xrandr --setprovideroffloadsink nouveau Intel
<pre>
$ xrandr --setprovideroffloadsink nouveau Intel
</pre>
 
Когда это сделано, очень просто выбрать карту, которая должна использоваться. Для оффлоадинга приложения на дискретную карту, нужно передать ему переменную окружения DRI_PRIME=1. Когда приложение будет запущено, Оно будет использовать дискретную карту для рендеринга. Если нужно использовать встроенную карту, необходимо установить DRI_PRIME в 0 или не передавать его. Поведение можно посмотреть на следующем примере:
Когда это сделано, очень просто выбрать карту, которая должна использоваться. Для оффлоадинга приложения на дискретную карту, нужно передать ему переменную окружения DRI_PRIME=1. Когда приложение будет запущено, Оно будет использовать дискретную карту для рендеринга. Если нужно использовать встроенную карту, необходимо установить DRI_PRIME в 0 или не передавать его. Поведение можно посмотреть на следующем примере:
 
$ DRI_PRIME=0 glxinfo | grep "OpenGL vendor string"
<pre>
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
</pre>
 
====Использование видеовыходов на дискретной карте====
Если на дискретной карте есть видеовыходы, недоступные на первичной, то их можно использовать с помощью "Reverse PRIME". После чего первичная видеокарта будет задействована под рендериг изображения, которое затем будет отправлено на дискретную видеокарту. Для этого нужно выполнить:
Если на дискретной карте есть видеовыходы, недоступные на первичной, то их можно использовать с помощью "Reverse PRIME". После чего первичная видеокарта будет задействована под рендериг изображения, которое затем будет отправлено на дискретную видеокарту. Для этого нужно выполнить:
  $ xrandr --setprovideroutputsource nouveau Intel
  $ xrandr --setprovideroutputsource nouveau Intel
После чего видео-выход карты nvidia станет доступен в xrandr, и для добавления второго монитора, подключённого к карте NVidia, можно сделать сделать следующее:
После чего видео-выход карты nvidia станет доступен в xrandr, и для добавления второго монитора, подключённого к карте NVidia, можно сделать сделать следующее:
  $ xrandr --output HDMI-1 --auto --above LVDS1
  $ xrandr --output HDMI-1 --auto --above LVDS1
 
==DRI2 / NVidia==
=== DIR2/NVidia ===
=== Использование дискретной видеокарты в качестве основной ===
 
==== Использование дискретной видеокарты в качестве основной ====
 
(взято [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=ini>
  Section "Module"
  Section "Module"
     Load "modesetting"
     Load "modesetting"
Строка 63: Строка 41:
     Option "AllowEmptyInitialConfiguration"
     Option "AllowEmptyInitialConfiguration"
  EndSection
  EndSection
 
</source>
В такой форме первичным экраном становится тот, что воткнут в дискретную карту, а экран ноутбука, отвечающий за интегрированную, доступен, но не управляется.
В такой форме первичным экраном становится тот, что воткнут в дискретную карту, а экран ноутбука, отвечающий за интегрированную, доступен, но не управляется.
  $ 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 не работает, потму что NVidia подсовывает свою проприетарно захаканую Mesa, но оно там и не нужно.


Изменять разрешение ''обоих'' экранов одной командой <code>xrandr</code> я пока не научился, но, например, KDE5 такие настройки понимает и умеет изменять.
Изменять разрешение ''обоих'' экранов одной командой <code>xrandr</code> я пока не научился, но, например, KDE5 такие настройки понимает и умеет изменять.
=== DRI3 ===
==DRI-3==
Реализация DRI3 стремится предоставить более пригодный способ использовать PRIME. Он требует несколько дополнительных шагов для установки:
Реализация DRI3 стремится предоставить более пригодный способ использовать PRIME. Он требует несколько дополнительных шагов для установки:
* ядро версии 3.17 или выше
* ядро версии 3.17 или выше
Строка 98: Строка 71:
== Ссылки ==
== Ссылки ==
*[http://nouveau.freedesktop.org/wiki/Optimus/ Оптимус]
*[http://nouveau.freedesktop.org/wiki/Optimus/ Оптимус]
* [[Nvidia_optimus,_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_bumblebee|Бамблби]]
*[[Nvidia_optimus,_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_bumblebee|Бамблби]]
*[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]
[[Категория:Руководства]]
[[Категория:Руководства]]
{{Category navigation|title=Видеодрайвера|category=Видеодрайвера|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Видеодрайвера|category=Видеодрайвера|sortkey={{SUBPAGENAME}}}}

Версия от 16:07, 22 августа 2023

На данный момент существуют две технологии, которые позволяют использовать 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

3D-офлоуд

Важно сказать 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

DRI2 / 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

В такой форме первичным экраном становится тот, что воткнут в дискретную карту, а экран ноутбука, отвечающий за интегрированную, доступен, но не управляется.

$ 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

Ссылки