Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA 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.
Hybrid AMD iGPU + NVIDIA dGPU with the external display on the dGPU: nvidia.lua exports NVIDIA VA-API while Aquamarine renders on the iGPU, and Omarchy never sets AQ_DRM_DEVICES (counter-case to #11173)
Reported by RajdeepVerma · filed Sep 17, 2026 · open at source
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
System details
- Omarchy: 4.0.4-1 · Hyprland: 0.56.2 (
efb50993…,aq_0.15) · Aquamarine: 0.15.0-2 · uwsm: 0.26.7-1 - Kernel: linux-omarchy 7.2.5-3 · Driver:
nvidia-open-dkms610.57.04-1 - GPUs:
0000:01:00.0NVIDIA TU117M GeForce GTX 1650 Mobile / Max-Q[10de:1f9d]→nvidia0000:06:00.0AMD Renoir Radeon Vega iGPU[1002:1636]→amdgpu- Outputs:
DP-1— Acer XV272U V3, [email protected] — on the NVIDIA cardeDP-1— Chimei Innolux internal panel, 1920x1080@144 — on the AMD iGPU
/sys/class/drm/card1 -> nvidia [0000:01:00.0] card1-DP-1: connected
/sys/class/drm/card2 -> amdgpu [0000:06:00.0] card2-eDP-1: connected
card2-HDMI-A-1: disconnectedAll three detectors return true on this machine:
$ omarchy-hw-nvidia && echo yes # yes
$ omarchy-hw-nvidia-gsp && echo yes # yes
$ omarchy-hw-hybrid-gpu && echo yes # yesWhat's wrong?
This is the mirror image of #11173 / #11168 / #8215, and it constrains the fix being proposed there.
default/hypr/nvidia.lua exports the NVIDIA VA-API/GL stack whenever omarchy-hw-nvidia and omarchy-hw-nvidia-gsp succeed:
LIBVA_DRIVER_NAME=nvidia
NVD_BACKEND=direct
__GLX_VENDOR_LIBRARY_NAME=nvidia(confirmed present in client environments on this machine).
But Omarchy never sets `AQ_DRM_DEVICES` — grep -rn 'AQ_DRM_DEVICES' /usr/share/omarchy/ returns nothing. So the render device is whatever Aquamarine picks by default, which here is the AMD iGPU, while the only external display is physically wired to the NVIDIA dGPU.
The result is a split pipeline: compositing on AMD, video decode on NVIDIA (NVDEC), scanout back on NVIDIA. Frames cross the PCIe bridge in both directions every frame. Chromium flickers on pages containing video; disabling hardware acceleration in the browser avoids it, which matches the cross-GPU dmabuf import failure in #11168.
The important difference from #11173: there, every display hangs off the iGPU, so "stop forcing NVIDIA VA-API" is the right answer. Here it is the wrong answer — NVIDIA genuinely owns the connected external output, so the correct resolution is to move the render device onto NVIDIA and keep NVIDIA VA-API. A fix that keys only on "is the iGPU rendering?" and drops LIBVA_DRIVER_NAME would regress this machine. What both cases actually need is the same invariant: the VA-API driver and the Aquamarine render device must agree, and the render device should be the GPU that owns the connected outputs.
There is no Omarchy-managed place to put AQ_DRM_DEVICES
Two constraints make this awkward for users to fix themselves:
hl.env()inhypr/*.luais too late. Aquamarine readsAQ_DRM_DEVICESwhen it opens the DRM devices at compositor startup, before the Lua config env is applied.~/.config/hypr/monitors.luais overwritten byomarchy-refresh-hyprland, so even a comment parked there does not survive.
~/.config/uwsm/env works (uwsm's environment preloader runs before Hyprland), but nothing in Omarchy documents or manages it for this purpose.
Two Aquamarine findings that I could not find reported anywhere
Once NVIDIA is made the primary renderer on this hardware, two further things bite. Neither appears in any existing issue I could find.
1. The internal panel needs `AQ_MGPU_NO_EXPLICIT=1`. eDP-1 hangs off the AMD card, so with NVIDIA primary it can only light up through a cross-GPU (mgpu) buffer copy. Explicit sync on imported buffers is NVIDIA's weak spot, and the atomic commit fails:
atomic drm request: failed to commit: Invalid argumentAQ_MGPU_NO_EXPLICIT=1 disables explicit sync on mgpu buffers only and brings the panel up. (render:explicit_sync was removed in Hyprland 0.50, so there is no config-level escape hatch — cf. #10350.)
2. `AQ_NO_MODIFIERS=1` is a trap — it makes the screen go black. It is the obvious next thing to try, and it applies to every GPU rather than just the mgpu path. NVIDIA's KMS then refuses modifier-less scanout buffers:
GBM: Allocated a new buffer ... XR24 with modifier 0xffffffffffffff : INVALID
drm: Failed to submit a buffer with drmModeAddFB2
drm: Buffer failed to import to KMSEvery mode on DP-1 fails to commit, the output drops to 0x0, and the screen stays black while Hyprland itself runs fine. Worth a warning next to any mgpu guidance.
Steps to reproduce
- Hybrid AMD iGPU + NVIDIA (GSP) dGPU laptop, with the external display wired to the dGPU and the internal panel on the iGPU.
- Log in to a stock Omarchy session.
nvidia.luaexportsLIBVA_DRIVER_NAME=nvidia; Aquamarine picks the AMD iGPU as render device. - Play a video in Chromium/Brave on the external monitor with hardware acceleration on → flicker.
Workaround in use (verified, stable)
In ~/.config/uwsm/env:
# Resolve by-path -> /dev/dri/cardN. by-path names must NEVER go into
# AQ_DRM_DEVICES directly: the variable is colon-separated and
# "pci-0000:01:00.0-card" contains colons (see #8776).
_aq_nvidia=$(readlink -f /dev/dri/by-path/pci-0000:01:00.0-card 2>/dev/null)
_aq_amd=$(readlink -f /dev/dri/by-path/pci-0000:06:00.0-card 2>/dev/null)
if [ -c "$_aq_nvidia" ] && [ -c "$_aq_amd" ]; then
export AQ_DRM_DEVICES="$_aq_nvidia:$_aq_amd"
elif [ -c "$_aq_amd" ]; then
export AQ_DRM_DEVICES="$_aq_amd" # NVIDIA missing: don't lose the session
fi
unset _aq_nvidia _aq_amd
export AQ_MGPU_NO_EXPLICIT=1Resulting session: AQ_DRM_DEVICES=/dev/dri/card1:/dev/dri/card2, both outputs up at native refresh, no Chromium flicker.
Suggestions
- Make
nvidia.lua's VA-API/GL exports and the Aquamarine render device one decision instead of two independent ones, keyed on which GPU drives the connected outputs — this covers both this issue and #11173 without regressing either. - Give
AQ_DRM_DEVICESa supported, refresh-proof home (e.g. an Omarchy-managed~/.config/uwsm/envfragment), sincehypr/*.luastructurally cannot host it. - If NVIDIA-first ordering is ever auto-applied, pair it with
AQ_MGPU_NO_EXPLICIT=1for iGPU-attached internal panels, resolve by-path names to/dev/dri/cardN(#8776), and document thatAQ_NO_MODIFIERS=1black-screens NVIDIA scanout.
Related: #11173, #11168, #8215 (VA-API vs render device), #10350 (NVIDIA-first ordering), #8776 (colon parsing).
View raw text
### System details - **Omarchy:** 4.0.4-1 · **Hyprland:** 0.56.2 (`efb50993…`, `aq_0.15`) · **Aquamarine:** 0.15.0-2 · **uwsm:** 0.26.7-1 - **Kernel:** linux-omarchy 7.2.5-3 · **Driver:** `nvidia-open-dkms` 610.57.04-1 - **GPUs:** - `0000:01:00.0` NVIDIA TU117M GeForce GTX 1650 Mobile / Max-Q `[10de:1f9d]` → `nvidia` - `0000:06:00.0` AMD Renoir Radeon Vega iGPU `[1002:1636]` → `amdgpu` - **Outputs:** - `DP-1` — Acer XV272U V3, [email protected] — on the **NVIDIA** card - `eDP-1` — Chimei Innolux internal panel, 1920x1080@144 — on the **AMD** iGPU ``` /sys/class/drm/card1 -> nvidia [0000:01:00.0] card1-DP-1: connected /sys/class/drm/card2 -> amdgpu [0000:06:00.0] card2-eDP-1: connected card2-HDMI-A-1: disconnected ``` All three detectors return true on this machine: ``` $ omarchy-hw-nvidia && echo yes # yes $ omarchy-hw-nvidia-gsp && echo yes # yes $ omarchy-hw-hybrid-gpu && echo yes # yes ``` ### What's wrong? This is the mirror image of #11173 / #11168 / #8215, and it constrains the fix being proposed there. `default/hypr/nvidia.lua` exports the NVIDIA VA-API/GL stack whenever `omarchy-hw-nvidia` and `omarchy-hw-nvidia-gsp` succeed: ``` LIBVA_DRIVER_NAME=nvidia NVD_BACKEND=direct __GLX_VENDOR_LIBRARY_NAME=nvidia ``` (confirmed present in client environments on this machine). But **Omarchy never sets `AQ_DRM_DEVICES`** — `grep -rn 'AQ_DRM_DEVICES' /usr/share/omarchy/` returns nothing. So the render device is whatever Aquamarine picks by default, which here is the AMD iGPU, while the only external display is physically wired to the NVIDIA dGPU. The result is a split pipeline: **compositing on AMD, video decode on NVIDIA (NVDEC), scanout back on NVIDIA.** Frames cross the PCIe bridge in both directions every frame. Chromium flickers on pages containing video; disabling hardware acceleration in the browser avoids it, which matches the cross-GPU dmabuf import failure in #11168. The important difference from #11173: there, every display hangs off the iGPU, so "stop forcing NVIDIA VA-API" is the right answer. **Here it is the wrong answer** — NVIDIA genuinely owns the connected external output, so the correct resolution is to move the *render device* onto NVIDIA and keep NVIDIA VA-API. A fix that keys only on "is the iGPU rendering?" and drops `LIBVA_DRIVER_NAME` would regress this machine. What both cases actually need is the same invariant: **the VA-API driver and the Aquamarine render device must agree, and the render device should be the GPU that owns the connected outputs.** ### There is no Omarchy-managed place to put `AQ_DRM_DEVICES` Two constraints make this awkward for users to fix themselves: 1. `hl.env()` in `hypr/*.lua` is too late. Aquamarine reads `AQ_DRM_DEVICES` when it opens the DRM devices at compositor startup, before the Lua config env is applied. 2. `~/.config/hypr/monitors.lua` is overwritten by `omarchy-refresh-hyprland`, so even a comment parked there does not survive. `~/.config/uwsm/env` works (uwsm's environment preloader runs before Hyprland), but nothing in Omarchy documents or manages it for this purpose. ### Two Aquamarine findings that I could not find reported anywhere Once NVIDIA is made the primary renderer on this hardware, two further things bite. Neither appears in any existing issue I could find. **1. The internal panel needs `AQ_MGPU_NO_EXPLICIT=1`.** `eDP-1` hangs off the AMD card, so with NVIDIA primary it can only light up through a cross-GPU (mgpu) buffer copy. Explicit sync on imported buffers is NVIDIA's weak spot, and the atomic commit fails: ``` atomic drm request: failed to commit: Invalid argument ``` `AQ_MGPU_NO_EXPLICIT=1` disables explicit sync on mgpu buffers only and brings the panel up. (`render:explicit_sync` was removed in Hyprland 0.50, so there is no config-level escape hatch — cf. #10350.) **2. `AQ_NO_MODIFIERS=1` is a trap — it makes the screen go black.** It is the obvious next thing to try, and it applies to *every* GPU rather than just the mgpu path. NVIDIA's KMS then refuses modifier-less scanout buffers: ``` GBM: Allocated a new buffer ... XR24 with modifier 0xffffffffffffff : INVALID drm: Failed to submit a buffer with drmModeAddFB2 drm: Buffer failed to import to KMS ``` Every mode on `DP-1` fails to commit, the output drops to `0x0`, and the screen stays black while Hyprland itself runs fine. Worth a warning next to any mgpu guidance. ### Steps to reproduce 1. Hybrid AMD iGPU + NVIDIA (GSP) dGPU laptop, with the **external** display wired to the dGPU and the internal panel on the iGPU. 2. Log in to a stock Omarchy session. `nvidia.lua` exports `LIBVA_DRIVER_NAME=nvidia`; Aquamarine picks the AMD iGPU as render device. 3. Play a video in Chromium/Brave on the external monitor with hardware acceleration on → flicker. ### Workaround in use (verified, stable) In `~/.config/uwsm/env`: ```bash # Resolve by-path -> /dev/dri/cardN. by-path names must NEVER go into # AQ_DRM_DEVICES directly: the variable is colon-separated and # "pci-0000:01:00.0-card" contains colons (see #8776). _aq_nvidia=$(readlink -f /dev/dri/by-path/pci-0000:01:00.0-card 2>/dev/null) _aq_amd=$(readlink -f /dev/dri/by-path/pci-0000:06:00.0-card 2>/dev/null) if [ -c "$_aq_nvidia" ] && [ -c "$_aq_amd" ]; then export AQ_DRM_DEVICES="$_aq_nvidia:$_aq_amd" elif [ -c "$_aq_amd" ]; then export AQ_DRM_DEVICES="$_aq_amd" # NVIDIA missing: don't lose the session fi unset _aq_nvidia _aq_amd export AQ_MGPU_NO_EXPLICIT=1 ``` Resulting session: `AQ_DRM_DEVICES=/dev/dri/card1:/dev/dri/card2`, both outputs up at native refresh, no Chromium flicker. ### Suggestions - Make `nvidia.lua`'s VA-API/GL exports and the Aquamarine render device one decision instead of two independent ones, keyed on **which GPU drives the connected outputs** — this covers both this issue and #11173 without regressing either. - Give `AQ_DRM_DEVICES` a supported, refresh-proof home (e.g. an Omarchy-managed `~/.config/uwsm/env` fragment), since `hypr/*.lua` structurally cannot host it. - If NVIDIA-first ordering is ever auto-applied, pair it with `AQ_MGPU_NO_EXPLICIT=1` for iGPU-attached internal panels, resolve by-path names to `/dev/dri/cardN` (#8776), and document that `AQ_NO_MODIFIERS=1` black-screens NVIDIA scanout. Related: #11173, #11168, #8215 (VA-API vs render device), #10350 (NVIDIA-first ordering), #8776 (colon parsing).
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
- Related PRpr/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 14:53 UTC