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

Quickshell render-thread SIGSEGV when stepping monitor scale down from 4 on a 6K display (QSGRhiLayer requests 18432×7680, over GPU max 16384)

Reported by axelfontaine · filed Sep 8, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 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

Quickshell render-thread SIGSEGV when stepping monitor scale down from 4 on a 6K display (QSGRhiLayer requests 18432×7680, over GPU max 16384)revision 1 · captured 2026-09-28 21:23 UTC via poll

Summary

Stepping the monitor scale down from 4 (e.g. omarchy hyprland monitor scaling 4 → 1.25) on a 6K monitor makes the Quickshell shell request a scene-graph layer texture of 18432 × 7680, which exceeds the GPU's GL_MAX_TEXTURE_SIZE of 16384. Qt logs QSGRhiLayer: Unsupported size requested and refuses the texture, but the render thread proceeds into endFrame/swapBuffers anyway and segfaults inside Mesa (dri2_query_image). omarchy-shell catches the crash and restarts, so the desktop recovers in ~1 s, but the bar/background flash out.

18432 × 7680 is exactly 3× the monitor's native 6144 × 2560, and 4 ÷ 1.33333 = 3.0 — the shell's full-screen background layer is being sized with the pre-change scale factor against the post-change logical size during the live output reconfigure.

Environment

  • Omarchy: omarchy 4.0.2-1 (/usr/share/omarchy/version: 4.0.0.alpha)
  • quickshell 0.3.1-1, qt6-base 6.11.2-2, qt6-declarative 6.11.2-1, qt6-wayland 6.11.2-1
  • mesa 1:26.2.1-1, kernel 7.1.9-arch1-2, Hyprland 0.56.2
  • GPU: Intel UHD Graphics 770 (Raptor Lake-S, 8086:a780), i915, Mesa OpenGL 4.6 — GL_MAX_TEXTURE_SIZE = 16384
  • Monitor: single Dell U5226KW, native 6144 × 2560 ("6K"), Hyprland scale 1.33333

Steps to reproduce

  1. Single 6K monitor (6144 × 2560) at a normal scale (e.g. 1.33).
  2. omarchy-hyprland-monitor-scaling 4 (or the display panel / keybinding) — set scale to 4.
  3. A few seconds later, step the scale back down: omarchy-hyprland-monitor-scaling 1.25 (cleans to 1.33333 on this mode).
  4. The Quickshell render thread segfaults during the reconfigure; omarchy-shell logs the crash and restarts the shell.

Observed on this machine from ~/.local/state/omarchy/monitor-scaling.log:

at=2026-09-08T22:34:51+02:00  requested=4     current=1.3333334  new=4        monitor=DP-2
at=2026-09-08T22:35:07+02:00  requested=1.25  current=4          new=1.33333  monitor=DP-2   <- crash at 22:35:07

Evidence

Shell log, immediately before the crash:

22:35:07  WARN: QSGRhiLayer: Unsupported size requested: [18432, 7680]. Maximum texture size: 16384
22:35:07  ERROR: Quickshell has crashed under pid 125305
22:35:08  omarchy-shell: hyprland ipc event "configreloaded"

This QSGRhiLayer warning appears exactly once in the entire journal history — at the crash second. ~/.config/hypr/monitors.lua was rewritten at 22:35:07.084 (matches the sed -i in omarchy-hyprland-monitor-scaling).

Symbolized backtrace of the crashing thread (coredumpctl + Arch debuginfod; Mesa frames unsymbolized — no debug package):

#0  __pthread_kill_implementation
#3  <quickshell crash handler>
#4  <signal handler called>
#5  dri2_query_image                                          libgallium-26.2.1-arch1.1.so   <-- SIGSEGV
#6  ??                                                        libEGL_mesa.so.0
#7  ??                                                        libEGL_mesa.so.0
#8  ??                                                        libEGL_mesa.so.0
#9  QtWaylandClient::QWaylandGLContext::swapBuffers           qwaylandglcontext.cpp:497
#10 ??                                                        libQt6Gui.so.6
#11 QRhi::endFrame(QRhiSwapChain*, QFlags<QRhi::EndFrameFlag>)
#12 QSGRenderThread::syncAndRender                            qsgthreadedrenderloop.cpp:773
#13 QSGRenderThread::run                                      qsgthreadedrenderloop.cpp:977

Not OOM (77 GiB RAM free at the time). First and only quickshell crash recorded on this machine.

Analysis

plugins/background/Background.qml keeps full-screen scene-graph layers on the background window:

  • revealMask — an Item anchored to the full screen with layer.enabled: true unconditionally.
  • incomingLayer — full-screen Item with layer.enabled + layer.smooth: true + layer.effect: MultiEffect during wallpaper cross-fades.

A layer FBO is therefore (re)allocated at the background window's pixel size on every output reconfigure. During a live scale change from 4 to ~1.33 the layer is momentarily sized as native_px × (old_scale ÷ new_scale) = 6144×2560 × 3 = 18432×7680, over the 16384 limit. QSGRhiLayer rejects it (logs the warning) but the frame still goes through endFrame → swapBuffers, and Mesa dereferences a buffer for the texture that was never created.

Suggested fixes

  • In the shell: clamp any screen-sized layer / render-target to GL_MAX_TEXTURE_SIZE, and/or skip the frame (don't call swapBuffers) when QSGRhiLayer reports the size is unsupported.
  • In omarchy-hyprland-monitor-scaling: on a large panel, don't offer scale presets (3, 4) that drive a screen-sized shell layer past the GPU texture limit during a step-down, or apply scale changes in a way that doesn't leave the shell layer transiently over-sized.
  • The hard segfault itself is an upstream robustness bug (Qt continues rendering with a rejected layer target; Mesa faults instead of erroring) — worth an upstream report too, but the trigger here is entirely within Omarchy's scaling flow + shipped shell.

Filed by Claude Sonnet 5 via Claude Code, at the machine owner's request.

View raw text
## Summary

Stepping the monitor scale **down from 4** (e.g. `omarchy hyprland monitor scaling` 4 → 1.25) on a 6K monitor makes the Quickshell shell request a scene-graph layer texture of **18432 × 7680**, which exceeds the GPU's `GL_MAX_TEXTURE_SIZE` of 16384. Qt logs `QSGRhiLayer: Unsupported size requested` and refuses the texture, but the render thread proceeds into `endFrame`/`swapBuffers` anyway and segfaults inside Mesa (`dri2_query_image`). `omarchy-shell` catches the crash and restarts, so the desktop recovers in ~1 s, but the bar/background flash out.

18432 × 7680 is exactly **3×** the monitor's native 6144 × 2560, and **4 ÷ 1.33333 = 3.0** — the shell's full-screen background layer is being sized with the pre-change scale factor against the post-change logical size during the live output reconfigure.

## Environment

- Omarchy: `omarchy 4.0.2-1` (`/usr/share/omarchy/version`: `4.0.0.alpha`)
- quickshell `0.3.1-1`, qt6-base `6.11.2-2`, qt6-declarative `6.11.2-1`, qt6-wayland `6.11.2-1`
- mesa `1:26.2.1-1`, kernel `7.1.9-arch1-2`, Hyprland `0.56.2`
- GPU: Intel UHD Graphics 770 (Raptor Lake-S, `8086:a780`), i915, Mesa OpenGL 4.6 — `GL_MAX_TEXTURE_SIZE` = 16384
- Monitor: single **Dell U5226KW**, native **6144 × 2560** ("6K"), Hyprland scale 1.33333

## Steps to reproduce

1. Single 6K monitor (6144 × 2560) at a normal scale (e.g. 1.33).
2. `omarchy-hyprland-monitor-scaling 4` (or the display panel / keybinding) — set scale to 4.
3. A few seconds later, step the scale back down: `omarchy-hyprland-monitor-scaling 1.25` (cleans to 1.33333 on this mode).
4. The Quickshell render thread segfaults during the reconfigure; `omarchy-shell` logs the crash and restarts the shell.

Observed on this machine from `~/.local/state/omarchy/monitor-scaling.log`:

```
at=2026-09-08T22:34:51+02:00  requested=4     current=1.3333334  new=4        monitor=DP-2
at=2026-09-08T22:35:07+02:00  requested=1.25  current=4          new=1.33333  monitor=DP-2   <- crash at 22:35:07
```

## Evidence

Shell log, immediately before the crash:

```
22:35:07  WARN: QSGRhiLayer: Unsupported size requested: [18432, 7680]. Maximum texture size: 16384
22:35:07  ERROR: Quickshell has crashed under pid 125305
22:35:08  omarchy-shell: hyprland ipc event "configreloaded"
```

This `QSGRhiLayer` warning appears exactly **once** in the entire journal history — at the crash second. `~/.config/hypr/monitors.lua` was rewritten at `22:35:07.084` (matches the `sed -i` in `omarchy-hyprland-monitor-scaling`).

Symbolized backtrace of the crashing thread (`coredumpctl` + Arch debuginfod; Mesa frames unsymbolized — no debug package):

```
#0  __pthread_kill_implementation
#3  <quickshell crash handler>
#4  <signal handler called>
#5  dri2_query_image                                          libgallium-26.2.1-arch1.1.so   <-- SIGSEGV
#6  ??                                                        libEGL_mesa.so.0
#7  ??                                                        libEGL_mesa.so.0
#8  ??                                                        libEGL_mesa.so.0
#9  QtWaylandClient::QWaylandGLContext::swapBuffers           qwaylandglcontext.cpp:497
#10 ??                                                        libQt6Gui.so.6
#11 QRhi::endFrame(QRhiSwapChain*, QFlags<QRhi::EndFrameFlag>)
#12 QSGRenderThread::syncAndRender                            qsgthreadedrenderloop.cpp:773
#13 QSGRenderThread::run                                      qsgthreadedrenderloop.cpp:977
```

Not OOM (77 GiB RAM free at the time). First and only quickshell crash recorded on this machine.

## Analysis

`plugins/background/Background.qml` keeps full-screen scene-graph layers on the background window:

- `revealMask` — an `Item` anchored to the full screen with `layer.enabled: true` **unconditionally**.
- `incomingLayer` — full-screen `Item` with `layer.enabled` + `layer.smooth: true` + `layer.effect: MultiEffect` during wallpaper cross-fades.

A layer FBO is therefore (re)allocated at the background window's pixel size on every output reconfigure. During a live scale change from 4 to ~1.33 the layer is momentarily sized as `native_px × (old_scale ÷ new_scale)` = `6144×2560 × 3` = `18432×7680`, over the 16384 limit. `QSGRhiLayer` rejects it (logs the warning) but the frame still goes through `endFrame` → `swapBuffers`, and Mesa dereferences a buffer for the texture that was never created.

## Suggested fixes

- In the shell: clamp any screen-sized `layer` / render-target to `GL_MAX_TEXTURE_SIZE`, and/or skip the frame (don't call `swapBuffers`) when `QSGRhiLayer` reports the size is unsupported.
- In `omarchy-hyprland-monitor-scaling`: on a large panel, don't offer scale presets (3, 4) that drive a screen-sized shell layer past the GPU texture limit during a step-down, or apply scale changes in a way that doesn't leave the shell layer transiently over-sized.
- The hard segfault itself is an upstream robustness bug (Qt continues rendering with a rejected layer target; Mesa faults instead of erroring) — worth an upstream report too, but the trigger here is entirely within Omarchy's scaling flow + shipped shell.

---

Filed by Claude Sonnet 5 via Claude Code, at the machine owner's request.

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 11:12 UTC