Since disabling hardware cursors is still an important part of having a good time on Hyprland with NVIDIA hardware, it should be better clarified instead of linking to the Variables page with only a warning about WLR_NO_HARDWARE_CURSORS being depreciated.
11 KiB
weight | title |
---|---|
8 | NVidia |
Foreword
There is no official Hyprland support for Nvidia hardware. However, many people have had success with the instructions on this page.
You can choose between the proprietary Nvidia drivers or the open source Nouveau driver. For the proprietary drivers, there are 3 of them: the current closed source driver named 'nvidia' (or 'nvidia-dkms' to use with custom linux kernels) which is under active development; the legacy closed source drivers 'nvidia-3xxxx' for older cards which Nvidia no longer actively supports; and the 'nvidia-open' driver which is currently an alpha stage attempt to open source a part of their closed source driver for newer cards.
If the proprietary drivers support your graphics card, it's generally recommended to use them instead, as it includes significantly improved gaming performance and power management for recent GPUs.
However, keep in mind that if the proprietary Nvidia drivers do not work properly on your computer, the Nouveau driver might work fine. This will most likely be the case for older cards.
How to get Hyprland to possibly run on Nvidia (Proprietary)
Install the correct headers package for your current kernel. For the example of
the linux-zen
kernel on Arch Linux, this package would be linux-zen-headers
.
Install the required nvidia packages. For most cases, this would be nvidia-dkms
(or nvidia-open-dkms
for the open source ones),
and nvidia-utils
. If you'd like to game via Wine or even natively, it would be
in your best interest to also install lib32-nvidia-utils
.
{{< callout >}}
Even if your GPU is listed as supported by the nvidia-open-dkms
driver, at this
point in time, it is still not up to feature parity with the current closed source drivers.
One issue with the open drivers is that it could cause problems with suspend in
general, let that be closing the lid on your laptop or by manually triggering one.
Overall, you'd be better off with nvidia-dkms
right now, but Hyprland should work
similarly between the two.
{{< /callout >}}
Take care to also install egl-wayland
(libnvidia-egl-wayland1
and
libnvidia-egl-gbm1
on Ubuntu) if you are using the proprietary drivers.
It provides the necessary compatibility layer, instead of falling back to
zink/Vulkan.
Next up, you need to enable modeset for nvidia, this can be done via editing the kernel paramaters for your bootloader.
If you use systemd-boot
you can do this adding nvidia_drm.modeset=1
to the end of
/boot/loader/entries/arch.conf
. If you use
grub you can do this by adding
nvidia_drm.modeset=1
to the end of GRUB_CMDLINE_LINUX_DEFAULT=
in
/etc/default/grub
, then running sudo grub-mkconfig -o /boot/grub/grub.cfg
.
For others check out
kernel parameters and how
to add nvidia_drm.modeset=1
to your specific bootloader.
{{< callout >}}
There has been a lot of debate on which of nvidia_drm
or nvidia-drm
is correct for this kernel parameter. It has been confirmed that either
of these will work.
{{< /callout >}}
in /etc/mkinitcpio.conf
add nvidia nvidia_modeset nvidia_uvm nvidia_drm
to
your MODULES
For example, a clean MODULES
line would now look like this:
MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
Now, run sudo mkinitcpio -P
. This will regenerate the initcpios for all kernels
currently installed on the system. If you see any errors here about missing
nvidia modules, it is highly probable that you forgot to install the correct
headers package. Make sure you install the headers package for your kernel and
run this command again.
More information is available here: https://wiki.archlinux.org/title/NVIDIA#DRM_kernel_mode_setting
Export these variables in your hyprland config:
env = LIBVA_DRIVER_NAME,nvidia
env = XDG_SESSION_TYPE,wayland
env = GBM_BACKEND,nvidia-drm
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
cursor {
no_hardware_cursors = true
}
{{< callout type=warning >}}
Previously used WLR_NO_HARDWARE_CURSORS
environment variable has been deprecated.
Do not set it in your configs. Use cursor:no_hardware_cursors
instead.
{{< /callout >}}
Lastly, you also need to install a few packages to get some apps to function natively with Wayland. Have a look at the Master Tutorial.
Reboot your computer.
Launch Hyprland.
It should work now.
VA-API hardware video acceleration
We can achieve VA-API acceleration on Nvidia and Wayland with the help of the nvidia-vaapi-driver. This may solve certain issues in Electron apps, and it will also allow for GPU decoding for videos on the web, with benefits including higher performance video playback and also higher power efficiency during video playback.
Its install instructions are available in the README, however, a quick guide will be given here:
-
Install the package. On Arch, this is
libva-nvidia-driver
in the official repos. -
export this variable in your hyprland config:
env = NVD_BACKEND,direct
see here for more information on this environment variable.
-
Enable the services
nvidia-suspend.service
,nvidia-hibernate.service
andnvidia-resume.service
-
Add
nvidia.NVreg_PreserveVideoMemoryAllocations=1
to your kernel parameters if you don't have it already. This will solve issues with corrupted desktop / videos after waking. -
You can check the README to get it working for Firefox.
Other issues to look out for
Regarding environment variables
-
If you encounter crashes in Firefox, remove the line
env = GBM_BACKEND,nvidia-drm
. -
If you face problems with Discord windows not displaying or screen sharing not working in Zoom, first try running them in Native Wayland (more details below). Otherwise, remove or comment the line
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
.
How to possibly get multi-monitor working with hybrid graphics
On a hybrid graphics device (a laptop with
both an Intel and an Nvidia GPU), you will need to remove the optimus-manager
package if installed (disabling the service does not work). You also need to
change your BIOS settings from hybrid graphics to discrete graphics.
Fixing flickering in Electron / CEF apps
This flickering is likely caused by these apps running in XWayland. To fix the flickering, try running the apps with native Wayland instead.
For most Electron apps, you should be fine just adding this environment variable to your config:
env = ELECTRON_OZONE_PLATFORM_HINT,auto
This has been confirmed to work on Vesktop, VSCodium and Obsidian and will probably work on other Electron apps as well.
For other apps, including CEF apps, you will need to launch them with these flags:
--enable-features=UseOzonePlatform --ozone-platform=wayland
To do this easily for Spotify, Arch Linux has a spotify-launcher
packages
in their official repos. You should use that instead of the spotify
package in the AUR. Then, enable the Wayland backend in
/etc/spotify-launcher.conf
by uncommenting this line:
extra_arguments = ["--enable-features=UseOzonePlatform", "--ozone-platform=wayland"]
Some CEF / Electron apps may also have a respective flags file in ~/.config.
For example, for VSCodium, you can add the flags to ~/.config/codium-flags.conf
and for Obsidian, you can add the flags to ~/.config/obsidian/user-flags.conf
.
{{< callout >}}
On earlier Nvidia driver versions, including 535, you may have to also include
the --disable-gpu
and --disable-gpu-sandbox
flags, but, as the names suggest,
you will lose hardware acceleration for whichever app is run with these flags.
{{< /callout >}}
With NixOS, you can also try setting the NIXOS_OZONE_WL
environment variable
to 1
, which should automatically configure Electron / CEF apps to run with native
Wayland for you.
While it is best to have as many things as possible running natively in Wayland, the root cause of the flickering will likely be solved in the 555 series of Nvidia driver updates.
Fixing flickering in XWayland games specifically
The symptoms of this widespread issue include XWayland games flickering in a way which makes them unplayable. Repeated frames, random presenting of black frames, and overall weirdness. This is a result of a multitude of issues which will be solved soon via Nvidia driver updates, but for now you have a few possible fixes:
-
Install xorg-xwayland-git (AUR). This git package includes this PR which implements the "Explicit Sync" protocol. This will fix it in some, if not all cases. However if it doesn't, try the next solution. Once the 555 series of drivers are released, this should completely fix the issue.
-
Install older nvidia drivers which do not exhibit this problem. The last ones which would work will be the 535xx series of drivers. These can be installed easily on Arch via these AUR packages
More info about explicit sync is available on this blog.
Fixing other random flickering (nuclear method)
Note that this forces performance mode to be active, resulting in increased power-consumption (from 22W idle on a RTX 3070TI, to 74W).
This may not be needed for some users. Only apply these 'fixes' if you do notice flickering artifacts from being idle for ~5 seconds.
Make a new file at /etc/modprobe.d/nvidia.conf
and paste this in:
options nvidia NVreg_RegistryDwords="PowerMizerEnable=0x1; PerfLevelSrc=0x2222; PowerMizerLevel=0x3; PowerMizerDefault=0x3; PowerMizerDefaultAC=0x3"
Reboot your computer and it should be working.
If it does not, try:
- lowering your monitor's refresh rate, as this can stop the flickering altogether
- using the Nouveau driver as mentioned above
Fixing suspend/wakeup issues
Enable the services nvidia-suspend.service
, nvidia-hibernate.service
and
nvidia-resume.service
, they will be started by systemd when needed.
Add nvidia.NVreg_PreserveVideoMemoryAllocations=1
to your kernel parameters if
you haven't already.
{{< callout >}}
As previously mentioned, suspend functions are currently broken on nvidia-open-dkms
due to a bug, so
make sure you're on nvidia-dkms
.
{{< /callout >}}
For Nix users, the equivalent of the above is
# configuration.nix
boot.kernelParams = [ "nvidia.NVreg_PreserveVideoMemoryAllocations=1" ];
hardware.nvidia.powerManagement.enable = true;
# Making sure to use the proprietary drivers until the issue above is fixed upstream
hardware.nvidia.open = false;
Still having issues?
If you're still having issues after following this guide, you can join the
Hyprland Discord and ask for help in the
#hyprland-nvidia
channel. Hopefully someone will be able to help you out.