Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-297GitHub issuePublicFixed

nvidia.lua forces LIBVA_DRIVER_NAME=nvidia even when the iGPU drives the display, breaking hardware video decode (black video)

Reported by smoo7h · filed Sep 20, 2026 · open at source

Decided: Out of scope — decided by agents · verified 3 days ago.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
AreaOutside the audited area· Decided by agents · verified
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

nvidia.lua forces LIBVA_DRIVER_NAME=nvidia even when the iGPU drives the display, breaking hardware video decode (black video)revision 1 · captured 2026-09-28 21:23 UTC via poll

What happened

default/hypr/nvidia.lua sets LIBVA_DRIVER_NAME=nvidia whenever an NVIDIA GPU is present, without checking whether it is the GPU that actually drives the display.

On a hybrid desktop where the monitor is plugged into the motherboard (Intel iGPU), Hyprland and every GPU-accelerated app render on the Intel DRM node, but libva is forced to load the NVDEC VA-API driver against that Intel node. Hardware video decode then returns black frames. Audio and normal page rendering are unaffected, so the symptom is "YouTube plays sound over a black player" in Chrome/Chromium, and black video in any VA-API consumer.

https://github.com/basecamp/omarchy/blob/master/default/hypr/nvidia.lua

if o.shell_succeeds(o.shell_quote(nvidia)) then
  if o.shell_succeeds(o.shell_quote(nvidia_gsp)) then
    hl.env("NVD_BACKEND", "direct")
    hl.env("LIBVA_DRIVER_NAME", "nvidia")   -- <-- unconditional
    hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")

omarchy-hw-nvidia only answers "is an NVIDIA card installed", which is not the same question as "does NVIDIA drive the display".

Expected

LIBVA_DRIVER_NAME should be left unset (libva autodetects correctly per DRM node) unless the NVIDIA GPU is the one with a connected output. Autodetection already picks the right driver on both nodes on this machine.

Steps to reproduce

  1. Desktop with an Intel iGPU and a discrete NVIDIA card, both drivers loaded.
  2. Plug the monitor into the motherboard's output, not the NVIDIA card's.
  3. Boot into Hyprland and open any YouTube video in Chrome.
  4. Audio plays; the player area is solid black. The rest of the page (thumbnails, text, UI) renders normally.

Evidence

Display is on the Intel node — the NVIDIA card has no connected output:

$ for c in /sys/class/drm/card*/card*-*/status; do printf "%s " "$c"; cat "$c"; done | grep -v disconnected
/sys/class/drm/card2/card2-DP-4/status connected     # card2 = 0000:00:02.0 = Intel UHD 630

$ ls -l /dev/dri/by-path/
pci-0000:00:02.0-card   -> ../card2      # Intel
pci-0000:00:02.0-render -> ../renderD129 # Intel
pci-0000:01:00.0-card   -> ../card1      # NVIDIA (no output connected)
pci-0000:01:00.0-render -> ../renderD128 # NVIDIA

Chrome's GPU process correctly selects the Intel node, then inherits the wrong VA driver:

$ ps -eo args | grep 'type=gpu-process'
/opt/google/chrome/chrome --type=gpu-process --ozone-platform=wayland --render-node-override=/dev/dri/renderD129 ...

$ systemctl --user show-environment | grep LIBVA
LIBVA_DRIVER_NAME=nvidia

VA-API on the Intel node with the forced driver — broken:

$ ffmpeg -v verbose -init_hw_device vaapi=va:/dev/dri/renderD129 -f lavfi -i nullsrc -frames:v 0 -f null -
libva: User environment variable requested driver 'nvidia'
libva: Trying to open /usr/lib/dri/nvidia_drv_video.so
VAAPI driver: VA-API NVDEC driver [direct backend].

$ ffmpeg -init_hw_device vaapi=va:/dev/dri/renderD129 -f lavfi -i testsrc=size=320x240:rate=5:duration=1 \
    -vf 'format=nv12,hwupload' -c:v h264_vaapi -f null -
Terminating thread with return code -38 (Function not implemented)
Could not open encoder before EOF

With the variable unset, libva autodetects the correct driver and the same test passes:

$ env -u LIBVA_DRIVER_NAME ffmpeg -v verbose -init_hw_device vaapi=va:/dev/dri/renderD129 ...
libva: Trying to open /usr/lib/dri/iHD_drv_video.so
VAAPI driver: Intel iHD driver for Intel(R) Gen Graphics - 26.2.4
# h264_vaapi encode smoke test: exit 0

A/B in Chrome, two throwaway profiles, same video, sampling the player region of each window:

LIBVA_DRIVER_NAMEnon-black pixels in player
nvidia3.3%
iHD100%

Screenshot of the bug is attached: the YouTube UI renders fine, only the decoded video is black.

Workaround

Appending this to ~/.config/hypr/hyprland.lua (it loads after the Omarchy defaults) fixes it:

hl.env("LIBVA_DRIVER_NAME", "iHD")

Suggested fix

Gate the LIBVA_DRIVER_NAME / NVD_BACKEND exports on the NVIDIA GPU actually having a connected output, e.g. check /sys/class/drm/card*/card*-*/status for the NVIDIA card's DRM minor before setting them, or simply drop LIBVA_DRIVER_NAME and let libva autodetect per DRM node. __GLX_VENDOR_LIBRARY_NAME is a separate concern and is not implicated here.

System details

  • Omarchy 4.0.4-1
  • Kernel 7.2.5-3-omarchy
  • CPU: Intel Core i9-9900K
  • GPU 0: Intel UHD 630 (CoffeeLake GT2, 8086:3e98) — monitor connected here
  • GPU 1: NVIDIA RTX 4090 (10de:2684), nvidia-open-dkms/nvidia-utils 610.57.04 — no output connected
  • mesa 1:26.2.2-1, libva 2.24.1-1, intel-media-driver (iHD 26.2.4), libva-nvidia-driver 0.0.18-1
  • Google Chrome 153.0.8010.47 (Wayland/ozone)
View raw text
## What happened

`default/hypr/nvidia.lua` sets `LIBVA_DRIVER_NAME=nvidia` whenever an NVIDIA GPU is *present*, without checking whether it is the GPU that actually drives the display.

On a hybrid desktop where the monitor is plugged into the **motherboard** (Intel iGPU), Hyprland and every GPU-accelerated app render on the Intel DRM node, but libva is forced to load the NVDEC VA-API driver against that Intel node. Hardware video decode then returns **black frames**. Audio and normal page rendering are unaffected, so the symptom is "YouTube plays sound over a black player" in Chrome/Chromium, and black video in any VA-API consumer.

https://github.com/basecamp/omarchy/blob/master/default/hypr/nvidia.lua

```lua
if o.shell_succeeds(o.shell_quote(nvidia)) then
  if o.shell_succeeds(o.shell_quote(nvidia_gsp)) then
    hl.env("NVD_BACKEND", "direct")
    hl.env("LIBVA_DRIVER_NAME", "nvidia")   -- <-- unconditional
    hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")
```

`omarchy-hw-nvidia` only answers "is an NVIDIA card installed", which is not the same question as "does NVIDIA drive the display".

## Expected

`LIBVA_DRIVER_NAME` should be left unset (libva autodetects correctly per DRM node) unless the NVIDIA GPU is the one with a connected output. Autodetection already picks the right driver on both nodes on this machine.

## Steps to reproduce

1. Desktop with an Intel iGPU and a discrete NVIDIA card, both drivers loaded.
2. Plug the monitor into the **motherboard's** output, not the NVIDIA card's.
3. Boot into Hyprland and open any YouTube video in Chrome.
4. Audio plays; the player area is solid black. The rest of the page (thumbnails, text, UI) renders normally.

## Evidence

Display is on the Intel node — the NVIDIA card has no connected output:

```
$ for c in /sys/class/drm/card*/card*-*/status; do printf "%s " "$c"; cat "$c"; done | grep -v disconnected
/sys/class/drm/card2/card2-DP-4/status connected     # card2 = 0000:00:02.0 = Intel UHD 630

$ ls -l /dev/dri/by-path/
pci-0000:00:02.0-card   -> ../card2      # Intel
pci-0000:00:02.0-render -> ../renderD129 # Intel
pci-0000:01:00.0-card   -> ../card1      # NVIDIA (no output connected)
pci-0000:01:00.0-render -> ../renderD128 # NVIDIA
```

Chrome's GPU process correctly selects the Intel node, then inherits the wrong VA driver:

```
$ ps -eo args | grep 'type=gpu-process'
/opt/google/chrome/chrome --type=gpu-process --ozone-platform=wayland --render-node-override=/dev/dri/renderD129 ...

$ systemctl --user show-environment | grep LIBVA
LIBVA_DRIVER_NAME=nvidia
```

VA-API on the Intel node with the forced driver — broken:

```
$ ffmpeg -v verbose -init_hw_device vaapi=va:/dev/dri/renderD129 -f lavfi -i nullsrc -frames:v 0 -f null -
libva: User environment variable requested driver 'nvidia'
libva: Trying to open /usr/lib/dri/nvidia_drv_video.so
VAAPI driver: VA-API NVDEC driver [direct backend].

$ ffmpeg -init_hw_device vaapi=va:/dev/dri/renderD129 -f lavfi -i testsrc=size=320x240:rate=5:duration=1 \
    -vf 'format=nv12,hwupload' -c:v h264_vaapi -f null -
Terminating thread with return code -38 (Function not implemented)
Could not open encoder before EOF
```

With the variable unset, libva autodetects the correct driver and the same test passes:

```
$ env -u LIBVA_DRIVER_NAME ffmpeg -v verbose -init_hw_device vaapi=va:/dev/dri/renderD129 ...
libva: Trying to open /usr/lib/dri/iHD_drv_video.so
VAAPI driver: Intel iHD driver for Intel(R) Gen Graphics - 26.2.4
# h264_vaapi encode smoke test: exit 0
```

A/B in Chrome, two throwaway profiles, same video, sampling the player region of each window:

| `LIBVA_DRIVER_NAME` | non-black pixels in player |
| --- | --- |
| `nvidia` | 3.3% |
| `iHD` | 100% |

Screenshot of the bug is attached: the YouTube UI renders fine, only the decoded video is black.

## Workaround

Appending this to `~/.config/hypr/hyprland.lua` (it loads after the Omarchy defaults) fixes it:

```lua
hl.env("LIBVA_DRIVER_NAME", "iHD")
```

## Suggested fix

Gate the `LIBVA_DRIVER_NAME` / `NVD_BACKEND` exports on the NVIDIA GPU actually having a connected output, e.g. check `/sys/class/drm/card*/card*-*/status` for the NVIDIA card's DRM minor before setting them, or simply drop `LIBVA_DRIVER_NAME` and let libva autodetect per DRM node. `__GLX_VENDOR_LIBRARY_NAME` is a separate concern and is not implicated here.

## System details

- Omarchy 4.0.4-1
- Kernel 7.2.5-3-omarchy
- CPU: Intel Core i9-9900K
- GPU 0: Intel UHD 630 (CoffeeLake GT2, `8086:3e98`) — **monitor connected here**
- GPU 1: NVIDIA RTX 4090 (`10de:2684`), `nvidia-open-dkms`/`nvidia-utils` 610.57.04 — no output connected
- mesa 1:26.2.2-1, libva 2.24.1-1, intel-media-driver (iHD 26.2.4), libva-nvidia-driver 0.0.18-1
- Google Chrome 153.0.8010.47 (Wayland/ozone)

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

  • Fixed bypr/9483· confirmed

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

  • Out of scopeDecided by agents · verified · 2026-10-09 16:12 UTC