Skip to content

Render through wgpu, which is eframe's default and the fleet's - #4

Merged
anderix merged 1 commit into
mainfrom
wgpu-measurement
Sep 16, 2026
Merged

anderix merged 1 commit into
mainfrom
wgpu-measurement

Conversation

@anderix

@anderix anderix commented Sep 15, 2026

Copy link
Copy Markdown
Member

odox is the only application in the fleet that turns eframe's defaults off and asks for glow. No reason was ever recorded — the comment above that feature list explains accesskit, the one below explains gtk3, and the trail's ten odox entries include several about the renderer and none about the backend. Turning the defaults off is how wgpu got dropped, since it is a default and the replacement list did not carry it.

What it costs today

On Windows, OpenGL arrives with the graphics vendor's driver. Without one a machine gets Microsoft's GDI Generic stand-in, which is OpenGL 1.1 — below what egui accepts. xodt.exe exited after 0.7 seconds on a hosted runner saying egui_glow requires opengl 2.0+, and would do the same on a VM, a stripped VDI, a Windows Server desktop, or a machine whose driver has fallen back to GDI. The other four applications in the fleet start on all of those, because they take eframe's default and render through Direct3D.

That is also what blocks this repository's Store screenshots. shots.ps1 on the runner refuses at the first frame with the message above, so odox has no Windows frames and cannot get any until this lands; the unmeasured coordinates behind them are the second problem, not the first.

On macOS it works today and is pointed one way: Apple deprecated OpenGL in 2018, froze it at 4.1, and runs it on Apple silicon as a translation layer over Metal. odox is heading into the Mac App Store on an API its vendor has signposted for removal.

What was measured, because §2 and §9 rest on it

glow wgpu
objdump -p | grep NEEDED libc, libgcc_s, libm unchanged
cargo test green green
window opens and draws yes yes
binary size, each of three 12.5 MB 17.7 MB

The linkage property DESIGN §2 keeps is untouched: wgpu reaches Vulkan through the same dlopen that glow used for OpenGL.

The three windows, side by side

Both release builds, the same three fixtures, the same 1200x800 window, photographed off the X server and compared pixel for pixel. Debian 13 with Mesa, whose Vulkan here is the software implementation rather than a GPU driver.

window differing pixels of 960,000 RMSE
xodt, corpus/sample.odt 789 0.011%
xods, corpus/sample.ods 12,445 0.045%
xodp, corpus/sample.odp 569 0.008%

Every difference is on the edge of a glyph. The document content is identical in all three — the table, the values, the outline, the slide — and what moves is the antialiasing of egui's own chrome text, which is why the spreadsheet with its column letters and row numbers differs most. The frames and the difference images are in dist/renderer-comparison/.

The Debian dependencies, re-measured

build-deb.sh asked for this in writing — "Re-measure when eframe moves." Measured with packaging/linux/check-libraries.sh under both display backends:

  • libgl1libvulkan1
  • libwayland-egl1 dropped, since EGL was there to serve GL
  • both display backend sets stay, unchanged

libegl1 is loaded on both backends and is not in the list, so that was checked rather than reasoned about. Each library was made unreadable in turn, with bubblewrap binding an empty file over it, and the build run again:

hidden what happened
nothing Vulkan, and the window draws
libEGL.so.1 Vulkan, and the frame is identical to the one above
libvulkan.so.1 falls back to GLES over EGL, and the window draws
both refuses to start: FailedToCreateSurfaceForAnyBackend

So libvulkan1 alone is right: it is the path this is being moved onto, EGL is a fallback rather than a requirement, and a package that named both would be claiming a dependency the application does not have.

No driver package is named. libvulkan1 recommends mesa-vulkan-drivers | vulkan-icd itself, and naming one here would be transcribing another package's dependencies and wrong on a machine whose driver is NVIDIA's.

Not done here

Nothing has run on a discrete GPU. The comparison above is against Mesa's software Vulkan, which is the harder case for the argument rather than the easier one — a driver that reaches real hardware is the path wgpu is written for.

🤖 Generated with Claude Code

odox was the only application here that turned eframe's defaults off and asked
for `glow`. No reason was ever recorded: the comment above that feature list
explains `accesskit` and the one below explains `gtk3`, and the trail's ten odox
entries include several about the renderer and none about the backend. Turning
the defaults off is how `wgpu` got dropped, since it is a default.

It costs on two platforms. On Windows OpenGL arrives with the graphics vendor's
driver, and without one a machine gets Microsoft's 1.1 stand-in, below what egui
accepts — so `xodt.exe` exited after 0.7 seconds on a hosted runner saying
`egui_glow requires opengl 2.0+`, and would do the same on any VM, stripped VDI
or machine whose driver has fallen back to GDI. Apple deprecated OpenGL in 2018
and runs it as a translation layer over Metal.

Measured before and after, because §2 and §9 rest on it. `objdump -p` still
answers `libgcc_s`, `libm` and `libc` and nothing else on all three binaries:
wgpu reaches Vulkan through the same `dlopen` glow used for OpenGL, so the
pure-Rust linkage property is untouched. The suite passes. A window opens and
draws.

Two things do change. Each binary grows 12.5 MB to 17.7 MB. And the Debian
dependencies are re-measured, which `build-deb.sh` asked for in writing:
`libgl1` becomes `libvulkan1`, and `libwayland-egl1` goes with it because EGL
was there to serve GL. Both display backends stay declared.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@anderix
anderix merged commit a3829b2 into main Sep 16, 2026
6 checks passed
@anderix
anderix deleted the wgpu-measurement branch September 16, 2026 00:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant