Wayland and Hybrid Graphics Issues in Linux#
Hybrid graphics cards are a strategy used by modern computers to incorporate two graphics cards: one integrated and one dedicated, with different capabilities and energy consumption. The idea is not to use the dedicated card unless necessary for 3D rendering. However, this is not a resolved issue in Linux and affects native applications running on Wayland, which is the new and modern protocol for server-side graphics communication used by window compositors in Linux (replacing X11), that utilize Vulkan.
One of these affected applications is the code editor Zed. At the time of writing this entry, the NVIDIA controller version is 550.135 in the stable branch of Manjaro.
Symptoms of the Problem#
Case of Zed#
Considering the example of the zed editor, we will see for a brief
moment that an attempt is made to launch a window on Wayland, but it closes
after a few seconds. We can delve deeper into this issue and test it in the
terminal by running zed --foreground
, which reveals the error message
"payload": "called `Result::unwrap()`on an`Err` value: ERROR_INITIALIZATION_FAILED"
.
If you are also experiencing this problem, you can contribute to the Zed project
by providing useful information. Reporting the output of vulkaninfo
and
RUST_LOG=blade_graphics=debug zed --foreground
, with additional details such
as what we see to understand if the issue is closer to Vulkan/Wayland or Zed
itself.
Please refer to the GitHub report zed/8168.
Case of VkCube (demo)#
It turns out that Vulkan has demo applications for X11 and Wayland, vkcube
and
vkcube-wayland
, which are available in the vulkan-tools
package. The
expected outcome is that if these demos work on X11, they should at least work
on platforms supported by Zed (and other Vulkan-based applications).
In my case, vkcube
works without issues, but Zed on X11 at least opens once
during the session. However, vkcube-wayland
reports a
segmentation fault (core dumped)
, which suggests that native Wayland
applications with Vulkan are not working properly.
This is likely to be true for hybrid cases because in my observation of Zed and Vulkan reports, the issue does not occur on systems with only integrated graphics card or only NVIDIA graphics. In contrast, the reported cases with only integrated GPUs were solvable by installing the correct Vulkan driver, which suggests that there’s a dependency on NVIDIA for hybrid cases.
On Kubuntu 24.10 (which I tried recently), Zed works perfectly in Wayland, but it requires an NVIDIA controller from the 560 series (although I understand this might change).
Check if you have Hybrid Graphics#
To determine if your case is related to hybrid graphics, you can review the output of the following instructions:
❯ lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation TU106M [GeForce RTX 2060 Mobile] (rev a1)
05:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Renoir [Radeon Vega Series / Radeon Vega Mobile Series] (rev f0)
❯ mhwd -li
> Installed PCI configs:
--------------------------------------------------------------------------------
NAME VERSION FREEDRIVER TYPE
--------------------------------------------------------------------------------
video-linux 2024.05.06 true PCI
video-hybrid-amd-nvidia-prime 2023.03.23 false PC
In both cases, you should be able to see the availability of an NVIDIA graphics card and/or an AMD (or possibly Intel) graphics card. This could be a contributing factor to your issue.
Checking the NVIDIA Driver Version#
If you’re not aware of the NVIDIA driver version, you can use your package manager to check it:
Use
pamac info nvidia-utils
(for Manjaro-based systems) orapt show nvidia-utils
(for Ubuntu-based systems) to verify the version of thenvidia-utils
package (see package manager commands).Alternatively, run
{program}
nvidia-smi
, and you’ll see the driver version in the first row, labeled as “Driver version”.
This information can help you determine if there are any compatibility issues with your system’s NVIDIA driver.
Workaround#
We want to be able to use our favorite applications, such as Zed, which is a must for me. Regarding some Wayland issues on Manjaro related to the NVIDIA graphics card, I’ve seen that the recommended solution is to wait for the 560 series, but this is still in the unstable branch.
In the meantime, we can
explicitly tell the Vulkan driver
to use the integrated card’s configuration by setting it to use the default
drivers. The configuration files are available in the /usr/share/vulkan/icd.d/
directory. If you have an AMD card, these will be the ones with radeon
, and
for Intel, they’ll be marked as intel
.
This is done by assigning the list of files to the
VK_DRIVER_FILES
environment variable.
In my case, it would be:
export VK_DRIVER_FILES=/usr/share/vulkan/icd.d/radeon_icd.i686.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json
Once you’ve made this change, you can try running vkcube-wayland or
zed again to see if it works. If it does, you can make this change
permanent by adding the following line to your system’s /etc/environment
file:
sudo echo 'VK_DRIVER_FILES=/usr/share/vulkan/icd.d/radeon_icd.i686.json:/usr/share/vulkan/icd.d/radeon_icd.x86_64.json' >> /etc/environment
This change also fixes the issue where subsequent windows appear to leave an invisible window in X11.
Definitive fix#
When the 560 series becomes available, I’ll report back on whether this resolves the problem in Manjaro. For now, it’s necessary to remove the previous line from the environment variables.
To execute something directly with the NVIDIA card, we need to use prime-run, which doesn’t currently make a difference.
If you want to test without making any changes, you can simply unset the
VK_DRIVER_FILES
variable using the command unset VK_DRIVER_FILES
.