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-228GitHub issuePublicDecided· Out of scope

Desktop AMD iGPU + NVIDIA dGPU: Aquamarine opens the idle iGPU, so Hyprland uses software cursors on NVIDIA

Reported by lancefaul · filed Sep 21, 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

Desktop AMD iGPU + NVIDIA dGPU: Aquamarine opens the idle iGPU, so Hyprland uses software cursors on NVIDIArevision 1 · captured 2026-09-28 21:23 UTC via poll

Summary

On a desktop where an NVIDIA card drives every monitor but the CPU's Radeon iGPU is still present, Aquamarine starts a DRM backend for both GPUs. Hyprland then treats the system as multi-GPU.

With Omarchy's default cursor:no_hardware_cursors = 2 ("auto"), that means a software cursor on NVIDIA (`shouldUseSoftwareCursors`, `Monitor.cpp` L2303: isNvidia() && (isMgpu() || VRR)). A software cursor also pauses direct scanout whenever the cursor is visible ("directScanoutBlockedBy": ["SW"]). So game menus, and games that always show a cursor, get composited.

Environment

  • Omarchy 4.0.0.alpha, Hyprland 0.56.2 (Arch hyprland 0.56.2-2), aquamarine 0.15.0, nvidia-open-dkms 610.57.04, kernel 7.2.5-3-omarchy
  • Ryzen 9 9950X3D: Radeon iGPU at 0000:7a:00.0, with nothing connected
  • RTX 5090 at 0000:01:00.0, driving all monitors
  • Gigabyte X870E AORUS Elite WiFi7. Its BIOS option "Integrated Graphics: Disabled" does not remove the iGPU from the PCI bus.

What happens

The Hyprland log shows:

drm: Found 2 GPUs
drm: Starting backend for /dev/dri/card1, with driver nvidia-drm
drm: gpu /dev/dri/card1 becomes primary drm
drm: Starting backend for /dev/dri/card0, with driver amdgpu with primary /dev/dri/card1

hyprctl monitors -j reports "hardwareCursorsInUse": false. With render:direct_scanout = 1, a fullscreen game shows "directScanoutBlockedBy": ["SW"] whenever the cursor is on screen. In Helldivers 2, direct scanout was worth about 3% FPS and 16 W on this machine.

Workaround (verified)

In ~/.config/hypr/hyprland.lua. Adjust the PCI address to your NVIDIA card (ls -l /dev/dri/by-path/):

do
  local pipe = io.popen("readlink -f /dev/dri/by-path/pci-0000:01:00.0-card 2>/dev/null")
  local card = pipe and pipe:read("*l") or ""
  if pipe then pipe:close() end
  if card:match("^/dev/dri/card%d+$") then
    hl.env("AQ_DRM_DEVICES", card)
  end
end

After logging out and back in:

  • the log shows drm: Found 1 GPUs
  • hardwareCursorsInUse is true
  • direct scanout stays on for a whole game session, including menus with the cursor visible.

Two details that matter:

  • The path is resolved at every login because cardN numbering isn't guaranteed to stay the same across boots.
  • The by-path name can't go into AQ_DRM_DEVICES directly, because its colons are the list separator (see #8776).

hl.env runs early enough: the config is loaded before Aquamarine enumerates the GPUs.

Suggestion

Omarchy could do this automatically, next to the existing NVIDIA detection in default/hypr/nvidia.lua. When an NVIDIA GPU is present and no connector on any other GPU is connected at login, it would set AQ_DRM_DEVICES to the NVIDIA card.

  • The connector check leaves laptops alone, since their panel is on the iGPU (#12289, #11173).
  • Trade-off: a monitor plugged into the iGPU's own ports later would not come up until the next login.

Related: #12289, #8776, #11173.

View raw text
## Summary

On a desktop where an NVIDIA card drives every monitor but the CPU's Radeon iGPU is still present, Aquamarine starts a DRM backend for both GPUs. Hyprland then treats the system as multi-GPU.

With Omarchy's default `cursor:no_hardware_cursors = 2` ("auto"), that means a **software cursor on NVIDIA** ([`shouldUseSoftwareCursors`, `Monitor.cpp` L2303](https://github.com/hyprwm/Hyprland/blob/v0.56.2/src/output/Monitor.cpp#L2290-L2306): `isNvidia() && (isMgpu() || VRR)`). A software cursor also pauses direct scanout whenever the cursor is visible (`"directScanoutBlockedBy": ["SW"]`). So game menus, and games that always show a cursor, get composited.

## Environment

- Omarchy 4.0.0.alpha, Hyprland 0.56.2 (Arch `hyprland 0.56.2-2`), aquamarine 0.15.0, nvidia-open-dkms 610.57.04, kernel 7.2.5-3-omarchy
- Ryzen 9 9950X3D: Radeon iGPU at `0000:7a:00.0`, with nothing connected
- RTX 5090 at `0000:01:00.0`, driving all monitors
- Gigabyte X870E AORUS Elite WiFi7. Its BIOS option "Integrated Graphics: Disabled" does not remove the iGPU from the PCI bus.

## What happens

The Hyprland log shows:

```
drm: Found 2 GPUs
drm: Starting backend for /dev/dri/card1, with driver nvidia-drm
drm: gpu /dev/dri/card1 becomes primary drm
drm: Starting backend for /dev/dri/card0, with driver amdgpu with primary /dev/dri/card1
```

`hyprctl monitors -j` reports `"hardwareCursorsInUse": false`. With `render:direct_scanout = 1`, a fullscreen game shows `"directScanoutBlockedBy": ["SW"]` whenever the cursor is on screen. In Helldivers 2, direct scanout was worth about 3% FPS and 16 W on this machine.

## Workaround (verified)

In `~/.config/hypr/hyprland.lua`. Adjust the PCI address to your NVIDIA card (`ls -l /dev/dri/by-path/`):

```lua
do
  local pipe = io.popen("readlink -f /dev/dri/by-path/pci-0000:01:00.0-card 2>/dev/null")
  local card = pipe and pipe:read("*l") or ""
  if pipe then pipe:close() end
  if card:match("^/dev/dri/card%d+$") then
    hl.env("AQ_DRM_DEVICES", card)
  end
end
```

After logging out and back in:

- the log shows `drm: Found 1 GPUs`
- `hardwareCursorsInUse` is `true`
- direct scanout stays on for a whole game session, including menus with the cursor visible.

Two details that matter:

- The path is resolved at every login because `cardN` numbering isn't guaranteed to stay the same across boots.
- The by-path name can't go into `AQ_DRM_DEVICES` directly, because its colons are the list separator (see #8776).

`hl.env` runs early enough: the config is loaded before Aquamarine enumerates the GPUs.

## Suggestion

Omarchy could do this automatically, next to the existing NVIDIA detection in `default/hypr/nvidia.lua`. When an NVIDIA GPU is present and no connector on any other GPU is connected at login, it would set `AQ_DRM_DEVICES` to the NVIDIA card.

- The connector check leaves laptops alone, since their panel is on the iGPU (#12289, #11173).
- Trade-off: a monitor plugged into the iGPU's own ports later would not come up until the next login.

Related: #12289, #8776, #11173.

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.

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