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.
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
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
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-base6.11.2-2, qt6-declarative6.11.2-1, qt6-wayland6.11.2-1 - mesa
1:26.2.1-1, kernel7.1.9-arch1-2, Hyprland0.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
- Single 6K monitor (6144 × 2560) at a normal scale (e.g. 1.33).
omarchy-hyprland-monitor-scaling 4(or the display panel / keybinding) — set scale to 4.- A few seconds later, step the scale back down:
omarchy-hyprland-monitor-scaling 1.25(cleans to 1.33333 on this mode). - The Quickshell render thread segfaults during the reconfigure;
omarchy-shelllogs 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:07Evidence
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:977Not 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— anItemanchored to the full screen withlayer.enabled: trueunconditionally.incomingLayer— full-screenItemwithlayer.enabled+layer.smooth: true+layer.effect: MultiEffectduring 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 toGL_MAX_TEXTURE_SIZE, and/or skip the frame (don't callswapBuffers) whenQSGRhiLayerreports 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