Unofficial community reference. Not affiliated with 37signals or the Omacom Foundation. Download Omarchy only from omarchy.org.
omarchylinux.org Unofficial field manual

Chromium flickers, plays black video, or loses hardware acceleration

Chromium flicker, black video, or lost hardware acceleration on Omarchy 4.x hybrid laptops: point LIBVA_DRIVER_NAME at the GPU that drives your screen.

Workaround available Applies to Omarchy 3.x Last verified 2026-09-16 on 4.0.4
Short answer

On a hybrid laptop whose screen runs off the integrated GPU, Omarchy points the whole session at the NVIDIA VA-API driver, so video decodes on the dGPU and fails to import on the iGPU. Add hl.env("LIBVA_DRIVER_NAME", "iHD") (or "radeonsi" on AMD) to ~/.config/hypr/hyprland.lua, run systemctl --user set-environment with the same value, then restart the browser. Still open on 4.0.4.

On this page
  1. The fix
  2. Verify it worked
  3. Why it happens
  4. If that did not work
  5. Related

If your browser flickers, shows a black rectangle where the video should be, or drops to software rendering, and you have a laptop with both an integrated GPU and an NVIDIA card, this is almost certainly one bug. Omarchy points the whole session at the NVIDIA VA-API driver whenever an NVIDIA GPU is present, even when your screen is driven by the integrated GPU. Video then decodes on the discrete card and cannot be imported for display on the integrated one.

The fix

1. Confirm you are affected. In a terminal:

systemctl --user show-environment | grep -E 'LIBVA_DRIVER_NAME|NVD_BACKEND'

If that prints LIBVA_DRIVER_NAME=nvidia and your laptop panel is wired to the integrated GPU, you have it. Check which card owns the panel with:

for c in /sys/class/drm/card*-*/status; do echo "$c $(cat "$c")"; done

2. Pick the right driver name. Intel graphics that Omarchy’s installer pairs with intel-media-driver (HD Graphics, Iris, Xe, Arc) use iHD. Older Intel generations that get libva-intel-driver use i965. An AMD integrated GPU uses radeonsi.

3. On 4.0.0 through 4.0.4, add one line at the bottom of ~/.config/hypr/hyprland.lua, below the require lines. Your file loads after Omarchy’s defaults, and the later env wins:

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

4. Apply it without logging out, then restart the browser:

systemctl --user set-environment LIBVA_DRIVER_NAME=iHD
omarchy restart shell

Super + Shift + Return runs omarchy-launch-browser, which starts the browser as a user systemd unit through uwsm-app, so it picks up whatever set-environment put in the user manager. The shell’s app menu hands its own environment to anything it launches, which is why Rookie0ne recommends restarting it too. Do not rely on hyprctl reload alone: Hyprland applies env at launch, and SisyphusOfCorinth confirmed on issue 8215 that reloading the config leaves the session variable as it was. An already running browser keeps its old environment until you close every window. Log out and back in if you want the clean version.

On 3.x the same variables were written once at install time into ~/.config/hypr/envs.conf by the NVIDIA install step, as plain env = LIBVA_DRIVER_NAME,nvidia lines. Edit or delete the line there. Note that the hyprland.conf template shipped in later 3.x releases sources Omarchy’s own envs.conf, not yours, so if your edit has no effect, put env = LIBVA_DRIVER_NAME,iHD at the bottom of ~/.config/hypr/hyprland.conf instead.

5. If video now plays but the window still flickers or goes black, or if hardware decode disappeared entirely after step 3, you have the second, separate half: Chromium rendering on the NVIDIA GPU while Hyprland composites on the integrated one. Rookie0ne measured the second symptom on Google Chrome: with VA-API moved to Intel while rendering stayed on NVIDIA EGL, no VA driver loaded at all and VP9 fell back to software. josefdc’s fix in issue 4901 is a wrapper that forces Mesa EGL for the browser only:

mkdir -p ~/.local/bin
cat > ~/.local/bin/chromium <<'EOF'
#!/bin/bash
export __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
export LIBVA_DRIVER_NAME=iHD
exec /usr/bin/chromium "$@"
EOF
chmod +x ~/.local/bin/chromium

Do not export __EGL_VENDOR_LIBRARY_FILENAMES session wide. josefdc reports Hyprland then fails to initialise EGL at startup and you recover from a TTY.

To make launchers use the wrapper, copy /usr/share/applications/chromium.desktop to ~/.local/share/applications/ and point Exec at the absolute path of the wrapper. Keep the first word of Exec a real program: omarchy-launch-browser reads that first token out of the desktop file, so an Exec=env VAR=x /usr/bin/chromium line makes Super + Shift + Return do nothing. rvalue reported exactly that on issue 4901.

6. The blunt fallback. Adding --disable-gpu-compositing to ~/.config/chromium-flags.conf stopped the corruption for the reporters who tried it, at the cost of software compositing and the fan noise that comes with it. The equivalent files are ~/.config/brave-flags.conf, ~/.config/chrome-flags.conf and ~/.config/microsoft-edge-stable-flags.conf. Brave Origin reads ~/.config/brave-origin-flags.conf, not brave-flags.conf, which is why the workaround looks like it failed if you only edited Brave’s file.

Verify it worked

vainfo | grep 'Driver version'

You want Intel iHD driver or the Mesa Gallium line for radeonsi, not VA-API NVDEC driver. Bear in mind that vainfo inherits the same variable you just set, so it proves the override took, not that the browser is using it.

Then open chrome://gpu. Video Decode and Compositing should both read “Hardware accelerated”, but Rookie0ne found the top table can say that while no encoder exists, so trust the “Video Acceleration Information” table further down. For a live test, scroll a feed with autoplaying video, which is where most reporters first saw it. If you want the decoder’s own account, launch with chromium --vmodule=*vaapi*=2 and watch for a repeating vaEndPicture failed construct and teardown loop. That loop disappearing is the signal.

Why it happens

default/hypr/nvidia.lua sets NVD_BACKEND=direct, LIBVA_DRIVER_NAME=nvidia and __GLX_VENDOR_LIBRARY_NAME=nvidia whenever omarchy-hw-nvidia-gsp finds an NVIDIA display device with a Turing or newer device ID. The detector asks whether such a card exists, not whether it drives a screen. autostart.lua then exports the session environment with systemctl --user import-environment, so every app inherits it. On a hybrid laptop each frame is decoded on the NVIDIA card and imported into an integrated GPU GL context as a DMA-BUF, which fails with EGL_BAD_MATCH. karluiz traced that chain in issue 8989, and ArghyaRanjanDas showed the same failure with an AMD integrated GPU, where radeonsi cannot import NVIDIA vendor modifiers.

The reason this arrived as a 4.0.1 regression, with nothing GPU related in the release notes, is subtler. nvidia.lua is byte-identical from 4.0.0 to 4.0.4, which I checked against the tagged sources. What changed in 4.0.1 was o.shell_succeeds in default/hypr/helpers.lua, rewritten from os.execute to io.popen with an OK marker, because inside the compositor os.execute never got a usable exit status back. That repair made the NVIDIA detector actually fire for the first time. SisyphusOfCorinth documented the attribution, and AharonG298 confirmed it independently through the edge channel.

Rookie0ne added a useful correction: libva is not the problem. With the variable unset it picks the right driver per render node on its own.

The second half is GLVND. NVIDIA’s EGL vendor file has priority 10 against Mesa’s 50, so Chromium loads NVIDIA EGL by default, which is why the rendering side needs its own override.

If that did not work

  • Single-GPU NVIDIA desktop. This is a different problem. Issue 5372 tracks lockups on media-heavy pages with NVRM: dmaAllocMapping_GM107: can't alloc VA space for mapping in the journal, and it is still open with no accepted fix.
  • Still on 3.x with SharedImageManager and eglCreateImage spam. That is issue 3899, and its reporter said the problem cleared on 3.4.0, which also carried Chromium Wayland colour manager flag changes. Update before you chase flags, and see upgrading 3 to 4.
  • Your flags vanished after an update. omarchy refresh chromium overwrites ~/.config/chromium-flags.conf with the Omarchy default and leaves your old file as ~/.config/chromium-flags.conf.bak.<timestamp>.
  • Browser version matters. daedalus-codes needed --disable-gpu-compositing on Brave 1.94 (Chromium 152) on hardware where Brave 1.93.138 was fine without it. If a browser update broke a previously working setup, that is a plausible cause.
  • Every app is black, not just the browser. Then this is not your bug. Start at hybrid GPU black screen.

Evidence for the workaround is strong: Intel and AMD integrated GPUs paired with several NVIDIA generations across these threads, with before and after measurements. Evidence that any 4.0.x release fixed it is absent.

Upstream threads about this error

407 issues on the Omarchy tracker match this error cluster. Newest fixes often appear as comments on the most-discussed threads.

IssueStateCommentsOpened
#3891 Videos not playing after recent update (Omarchy v3.2.3)closed922025-12-16
#3899 Chromium GPU/Ozone errors after update to 3.2.3 · fixed by #27 closed832025-12-16
#2184 Chrome crashes when moving tile between monitors on Hyprland · fixed by #2394 closed332025-10-03
#5478 Hard Crash with AMD GPU on 3.6 since upgrade. Triggered by Chromium use -closed602026-04-28
#4589 The chromium.desktop file became corrupted after the latest stable updateclosed182026-02-12
#8215 4.0.1: `shell_succeeds` fix enables NVDEC VAAPI routing on hybrid laptops with Intel-driven displays, corrupting browser videoopen342026-08-25
#4 Nvidia Supportclosed342025-06-27
#1684 Slow launches on laptopclosed392025-09-15
#1776 Laptop / Hybrid GPU Power Management Issue (NVIDIA, iGPU + dGPU)closed152025-09-18
#2308 Chromium asks for keyring password on every startupclosed222025-10-08

Accepted answers upstream

Questions people ask

Do I need to reinstall or replace Chromium?
No. Omarchy 4.x ships plain Arch Chromium, not a fork, and the same breakage shows up in Brave, Chrome, Helium and every Electron app on the affected machines. The fault is a session environment variable, not the package.
Will disabling hardware acceleration in Chromium settings fix it?
It stops the flicker, but you lose VA-API decode and GPU rasterization, and your fans will tell you. Overriding LIBVA_DRIVER_NAME keeps acceleration on the GPU that actually drives your screen.
Is this fixed in 4.0.4?
No. Issues 7851, 8215, 8726, 8989, 9483 and 8328 were all still open when this page was checked, and no 4.0.x release note mentions a change to nvidia.lua. The file is byte-identical from 4.0.0 through 4.0.4.

Sources and credit

Fixes on this page were worked out by SisyphusOfCorinth (Traced the 4.0.1 regression to the shell_succeeds rewrite that finally let nvidia.lua fire), josefdc (Found the GLVND EGL vendor priority half of the problem and the per-browser Mesa EGL wrapper), Suzu1Dev (Proposed gating LIBVA_DRIVER_NAME on a sysfs hybrid-GPU detector), VykosMolt (Proposed setting the NVIDIA session variables only when NVIDIA drives a connected display), Rookie0ne (Showed that libva picks the right driver on its own when the variable is unset, and that moving VA-API alone while rendering stays on NVIDIA kills decode entirely), AharonG298 (A/B measurements of nvidia versus iHD decode, and the systemctl --user set-environment tip). Text here is our own paraphrase; follow the links for the original threads.

Unofficial. Verify against the official manual for your version. Improve this page Markdown version Sources