Optimus

Материал из ALT Linux Wiki

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

Ссылки