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-4918GitHub issuePublicReceived

LIBVA_DRIVER_NAME=nvidia is set even when the NVIDIA GPU drives no output, stalling video playback on hybrid laptops

Reported by sl4ppy · filed Sep 6, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #8215 (R-1472). GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

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?
Not yet mapped to any requirement or component.
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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

LIBVA_DRIVER_NAME=nvidia is set even when the NVIDIA GPU drives no output, stalling video playback on hybrid laptopsrevision 1 · captured 2026-10-04 12:10 UTC via poll
Reopened with a confirmed single-variable reproduction. An earlier revision of this issue was withdrawn because I had asserted a cause I had not yet demonstrated; that evidence now exists and is below.

Problem

default/hypr/nvidia.lua sets LIBVA_DRIVER_NAME=nvidia whenever an NVIDIA GPU
with GSP is detected:

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

The condition tests only whether such a GPU is present, never whether it
drives any output. On a hybrid laptop whose panel hangs off the iGPU, this
forces browsers onto the NVIDIA VA-API path while compositing and scanout happen
on the other GPU.

On this Razer Blade the NVIDIA dGPU drives nothing:

card1-DP-1     [NVIDIA] status=disconnected enabled=disabled
card1-DP-2     [NVIDIA] status=disconnected enabled=disabled
card1-HDMI-A-1 [NVIDIA] status=disconnected enabled=disabled
card2-eDP-1    [AMD]    status=connected    enabled=enabled

Symptom

Severe scroll stalling and jitter in Chrome on video-heavy pages — reddit.com
main feed, espn.com. The page hitches hard enough to feel stuck. Static pages
are perfectly smooth, which makes this look like a browser or mesa regression
and sends you chasing the wrong thing.

Reproduction

Changing only LIBVA_DRIVER_NAME and restarting Chrome, with nothing else
touched:

LIBVA_DRIVER_NAME=nvidia (Omarchy default)LIBVA_DRIVER_NAME=radeonsi
nvidia_drv_video.so in GPU processloadednot loaded
/dev/nvidia0 fds held by GPU process230
scrolling reddit/espnstalls badlysmooth

Measured with:

GP=$(pgrep -f 'type=gpu-process')
grep -o '/usr/lib/dri/[a-z0-9_]*_drv_video\.so' /proc/$GP/maps | sort -u
ls -l /proc/$GP/fd | grep -oE 'renderD[0-9]+|nvidia[a-z0-9]*' | sort | uniq -c

Chrome self-selects the AMD node either way
(--render-node-override=/dev/dri/renderD129), so with the default it is
compositing on AMD while decoding on NVIDIA.

Worth noting: switching to radeonsi does not cost hardware decode — it
gains it. With radeonsi set, Chrome constructs a VaapiVideoDecoder for h264
and vp9 and decodes on the iGPU:

media/gpu/vaapi/vaapi_video_decoder.cc:136] VaapiVideoDecoder():
media/gpu/chromeos/video_decoder_pipeline.cc:1225] PickDecoderOutputFormat():
  Initializing frame pool with up to 25 VideoFrames. No ImageProcessor needed.

Measured over 10s of 720p playback: 660 ms CPU with hardware decode vs 1560 ms
with --disable-accelerated-video-decode. (AV1 is unsupported by this VCN 2.2
engine — Video configuration is not supported — and falls back to software
under either setting, so it is unaffected either way.)

So the current default is strictly worse: it engages a decode path on a GPU that
drives no display, and gives up working iGPU decode to do it.

Suggested fix

Gate the LIBVA_DRIVER_NAME assignment on the NVIDIA GPU actually driving a
connected output, rather than merely being present — e.g. check for any
connected connector under the NVIDIA card in /sys/class/drm/. That reads
cached sysfs only, so it respects the constraint already documented in the
comment above this block about lspci waking a runtime-suspended GPU.

NVD_BACKEND and __GLX_VENDOR_LIBRARY_NAME appear harmless here; only the
VA-API variable caused trouble.

Note for anyone overriding this locally

hl.env in ~/.config/hypr/hyprland.lua looks like it works but does nothing
until you log out. Hyprland pushes hl.env into the systemd user environment at
session start, and hyprctl reload does not refresh it, so a reloaded config
leaves the old value in place for uwsm-launched apps
(app-com.google.Chrome-<pid>.scope, parent systemd --user). Either re-login,
or set it in ~/.config/environment.d/.

System details

  • Omarchy 4.0.2-1
  • Kernel 7.1.9-arch1-2 (Arch), Hyprland on Wayland
  • GPU 0: NVIDIA GA104M [RTX 3080 Mobile] — nvidia-open-dkms 610.57.04, card1 / renderD128
  • GPU 1: AMD Cezanne [Radeon Vega] — amdgpu, card2 / renderD129, drives eDP-1
  • mesa 1:26.2.1-1, vulkan-radeon 1:26.2.1-1
  • Google Chrome 152.0.7977.82
View raw text
> Reopened with a confirmed single-variable reproduction. An earlier revision of
> this issue was withdrawn because I had asserted a cause I had not yet
> demonstrated; that evidence now exists and is below.

## Problem

`default/hypr/nvidia.lua` sets `LIBVA_DRIVER_NAME=nvidia` whenever an NVIDIA GPU
with GSP is detected:

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

The condition tests only whether such a GPU is *present*, never whether it
drives any output. On a hybrid laptop whose panel hangs off the iGPU, this
forces browsers onto the NVIDIA VA-API path while compositing and scanout happen
on the other GPU.

On this Razer Blade the NVIDIA dGPU drives **nothing**:

```
card1-DP-1     [NVIDIA] status=disconnected enabled=disabled
card1-DP-2     [NVIDIA] status=disconnected enabled=disabled
card1-HDMI-A-1 [NVIDIA] status=disconnected enabled=disabled
card2-eDP-1    [AMD]    status=connected    enabled=enabled
```

## Symptom

Severe scroll stalling and jitter in Chrome on video-heavy pages — reddit.com
main feed, espn.com. The page hitches hard enough to feel stuck. Static pages
are perfectly smooth, which makes this look like a browser or mesa regression
and sends you chasing the wrong thing.

## Reproduction

Changing only `LIBVA_DRIVER_NAME` and restarting Chrome, with nothing else
touched:

| | `LIBVA_DRIVER_NAME=nvidia` (Omarchy default) | `LIBVA_DRIVER_NAME=radeonsi` |
|---|---|---|
| `nvidia_drv_video.so` in GPU process | loaded | not loaded |
| `/dev/nvidia0` fds held by GPU process | 23 | 0 |
| scrolling reddit/espn | stalls badly | smooth |

Measured with:

```bash
GP=$(pgrep -f 'type=gpu-process')
grep -o '/usr/lib/dri/[a-z0-9_]*_drv_video\.so' /proc/$GP/maps | sort -u
ls -l /proc/$GP/fd | grep -oE 'renderD[0-9]+|nvidia[a-z0-9]*' | sort | uniq -c
```

Chrome self-selects the AMD node either way
(`--render-node-override=/dev/dri/renderD129`), so with the default it is
compositing on AMD while decoding on NVIDIA.

Worth noting: switching to `radeonsi` does **not** cost hardware decode — it
gains it. With `radeonsi` set, Chrome constructs a `VaapiVideoDecoder` for h264
and vp9 and decodes on the iGPU:

```
media/gpu/vaapi/vaapi_video_decoder.cc:136] VaapiVideoDecoder():
media/gpu/chromeos/video_decoder_pipeline.cc:1225] PickDecoderOutputFormat():
  Initializing frame pool with up to 25 VideoFrames. No ImageProcessor needed.
```

Measured over 10s of 720p playback: 660 ms CPU with hardware decode vs 1560 ms
with `--disable-accelerated-video-decode`. (AV1 is unsupported by this VCN 2.2
engine — `Video configuration is not supported` — and falls back to software
under either setting, so it is unaffected either way.)

So the current default is strictly worse: it engages a decode path on a GPU that
drives no display, and gives up working iGPU decode to do it.

## Suggested fix

Gate the `LIBVA_DRIVER_NAME` assignment on the NVIDIA GPU actually driving a
connected output, rather than merely being present — e.g. check for any
`connected` connector under the NVIDIA card in `/sys/class/drm/`. That reads
cached sysfs only, so it respects the constraint already documented in the
comment above this block about `lspci` waking a runtime-suspended GPU.

`NVD_BACKEND` and `__GLX_VENDOR_LIBRARY_NAME` appear harmless here; only the
VA-API variable caused trouble.

## Note for anyone overriding this locally

`hl.env` in `~/.config/hypr/hyprland.lua` looks like it works but does nothing
until you log out. Hyprland pushes `hl.env` into the systemd user environment at
session start, and `hyprctl reload` does not refresh it, so a reloaded config
leaves the old value in place for uwsm-launched apps
(`app-com.google.Chrome-<pid>.scope`, parent `systemd --user`). Either re-login,
or set it in `~/.config/environment.d/`.

## System details

- Omarchy 4.0.2-1
- Kernel 7.1.9-arch1-2 (Arch), Hyprland on Wayland
- GPU 0: NVIDIA GA104M [RTX 3080 Mobile] — `nvidia-open-dkms` 610.57.04, `card1` / `renderD128`
- GPU 1: AMD Cezanne [Radeon Vega] — `amdgpu`, `card2` / `renderD129`, drives `eDP-1`
- mesa 1:26.2.1-1, vulkan-radeon 1:26.2.1-1
- Google Chrome 152.0.7977.82

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

Not linked to any known issue, other report or change yet.

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.

No decision has been recorded yet.