NVIDIA: Difference between revisions
imported>Shyim No edit summary |
imported>Nh2 Fix+clarify PRIME/offload; see https://github.com/NixOS/nixpkgs/pull/66601#issuecomment-643842954 |
||
Line 1: | Line 1: | ||
== | == Determining the type of your GPU == | ||
* MXM / output-providing card (shows as | * MXM / output-providing card (shows as <code>VGA Controller</code> in <code>lspci</code>), i.e. graphics card in desktop computer or in some laptops | ||
* muxless/non-MXM Optimus cards have no display outputs and show as | * muxless/non-MXM Optimus cards have no display outputs and show as <code>3D Controller</code> in <code>lspci</code> output, seen in most modern consumer laptops | ||
MXM cards allow you to use the Nvidia card standalone, in Non-Optimus mode. Non-MXM cards ''require'' [https://en.wikipedia.org/wiki/Nvidia_Optimus Optimus], Nvidia's integrated-vs-discrete GPU switching technology. | |||
'''You need MXM card'''. Follow [https://nixos.org/nixos/manual/#sec-x11-graphics-cards-nvidia NVIDIA Graphics Cards] section in official manual. | == Non-Optimus mode == | ||
'''You need an MXM card''' (see above) for Non-Optimus mode. Follow [https://nixos.org/nixos/manual/#sec-x11-graphics-cards-nvidia NVIDIA Graphics Cards] section in official manual. | |||
In case of laptop you may also need to use a BIOS option to select which card to use for the internal display. | In case of laptop you may also need to use a BIOS option to select which card to use for the internal display. | ||
Line 12: | Line 14: | ||
== Optimus == | == Optimus == | ||
'''Mostly useful for laptops'''. There are currently two solutions available under NixOS: | '''Mostly useful for laptops'''. There are currently two solutions available under NixOS, described in detail below: | ||
* Official solution: Nvidia PRIME (in on-demand "offload" mode, and always-on "sync" mode) | |||
* Previous open-source solution: Bumblebee (now deprecated) | |||
=== Nvidia PRIME === | === Nvidia PRIME === | ||
Line 20: | Line 25: | ||
==== offload mode ==== | ==== offload mode ==== | ||
'''Currently only in unstable, to be included in 20.09'''. In this mode | '''Currently only in unstable, to be included in 20.09''' (see [https://github.com/NixOS/nixpkgs/pull/66601 #66601]). In this mode the Nvidia card is only activated on demand when you run program(s) with specific environment variables, i.e., here's a sample script called <code>nvidia-offload</code> that you can run wrapped around your exacutable, for example <code>nvidia-offload glxgears</code>: | ||
{{file|nvidia-offload|bash|<nowiki> | {{file|nvidia-offload|bash|<nowiki> | ||
Line 30: | Line 35: | ||
</nowiki>}} | </nowiki>}} | ||
To configure Offload mode, you firstly you need to enable the proprietary Nvidia driver: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
{ | { | ||
services.xserver.videoDrivers = [ "nvidia" ]; | services.xserver.videoDrivers = [ "nvidia" ]; | ||
... | ... | ||
</nowiki>}} | </nowiki>}} | ||
Note that on '''certain laptops''' and/or if you are using a custom kernel version, you may have issues with your NixOS system finding the primary display. In this case you should also specify modesetting in videoDrivers as well, i.e. | Note that on '''certain laptops''' and/or if you are using a custom kernel version, you may have issues with your NixOS system finding the primary display. In this case you should also specify <code>"modesetting"</code> in <code>videoDrivers</code> as well, i.e.: | ||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
{ | { | ||
services.xserver.videoDrivers = [ "modesetting" "nvidia" ]; | services.xserver.videoDrivers = [ "modesetting" "nvidia" ]; | ||
... | ... | ||
</nowiki>}} | </nowiki>}} | ||
Line 58: | Line 57: | ||
The Nvidia driver expects the bus ID to be in decimal format; However, <nowiki>lspci</nowiki> shows the bus IDs in hexadecimal format. | The Nvidia driver expects the bus ID to be in decimal format; However, <nowiki>lspci</nowiki> shows the bus IDs in hexadecimal format. | ||
You can convert the value by | You can convert the value by: | ||
* Stripping any leading zeros from the bus numbers or if the number is above 09, convert it to decimal and use that value. | * Stripping any leading zeros from the bus numbers or if the number is above 09, convert it to decimal and use that value. | ||
Line 68: | Line 67: | ||
'''Output from lspci''' | '''Output from lspci''' | ||
< | <code>09:1f.0 VGA compatible controller: NVIDIA Corporation Device 1f91 (rev a1)</code> | ||
'''Converted and correct format''' | '''Converted and correct format''' | ||
< | <code>PCI:9:31:0</code> | ||
A possible configuration: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
Line 93: | Line 92: | ||
services.xserver.videoDrivers = [ "nvidia" ]; | services.xserver.videoDrivers = [ "nvidia" ]; | ||
hardware.nvidia.prime = { | hardware.nvidia.prime = { | ||
offload.enable = true; | |||
# Bus ID of the Intel GPU. You can find it using lspci, either under 3D or VGA | |||
intelBusId = "PCI:0:2:0"; | |||
# Bus ID of the NVIDIA GPU. You can find it using lspci, either under 3D or VGA | |||
nvidiaBusId = "PCI:1:0:0"; | |||
}; | }; | ||
} | } | ||
Line 106: | Line 105: | ||
==== sync mode ==== | ==== sync mode ==== | ||
In this mode | In this mode the Nvidia card is turned on constantly, having impact on laptop battery and health. | ||
Possible issues: | Possible issues: | ||
* Hangs of applications after resume from suspend | * Hangs of applications after resume from suspend | ||
* Wrong DPI calculation (in this case provide dpi manually < | * Wrong DPI calculation (in this case provide dpi manually <code>services.xserver.dpi = 96;</code>) | ||
* Black screen after system upgrade | * Black screen after system upgrade (e.g. <code>nixos-rebuild swtich</code>; use <code>nixos-rebuild boot</code> instead and reboot) | ||
* No video playback acceleration available (vaapi) | * No video playback acceleration available (vaapi) | ||
===== Example for NixOS 20.03 ===== | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
{ | |||
services.xserver.videoDrivers = [ "modesetting" "nvidia" ]; | |||
hardware.nvidia.optimus_prime = { | |||
enable = true; | |||
# Bus ID of the NVIDIA GPU. You can find it using lspci, either under 3D or VGA | |||
nvidiaBusId = "PCI:1:0:0"; | |||
# Bus ID of the Intel GPU. You can find it using lspci, either under 3D or VGA | |||
intelBusId = "PCI:0:2:0"; | |||
}; | |||
} | |||
</nowiki>}} | |||
===== Example for NixOS 20.09/unstable ===== | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
{ | { | ||
services.xserver.videoDrivers = [ "modesetting" "nvidia" ]; | services.xserver.videoDrivers = [ "modesetting" "nvidia" ]; | ||
hardware.nvidia. | hardware.nvidia.prime = { | ||
sync.enable = true; | |||
# Bus ID of the NVIDIA GPU. You can find it using lspci, either under 3D or VGA | |||
nvidiaBusId = "PCI:1:0:0"; | |||
# Bus ID of the Intel GPU. You can find it using lspci, either under 3D or VGA | |||
intelBusId = "PCI:0:2:0"; | |||
}; | |||
} | } | ||
</nowiki>}} | </nowiki>}} |