pcbview 1.24.0 — Sharing the GPU
Path tracing no longer fights the desktop (integrated GPUs)
On an integrated GPU the desktop compositor shares the silicon — and a
converging path trace was starving it. Each sample was one monolithic
50–80 ms compute dispatch, submitted back-to-back until convergence, and
the compositor got a scheduling window about twelve times a second. It
read as the mouse cursor hitching whenever the image was refining.
Measured with a second GPU client: 180 fps alone, an erratic 13 during
convergence.
Two changes, which only work together:
- Each sample is sliced into band-per-submission pieces
(PCBVIEW_PT_BANDS, default 4 on integrated GPUs, inline on
discrete). The bands are disjoint pixels of the same sample in the
same order, so the image is bitwise identical — verified by capture
comparison. Submission boundaries are where the kernel's GPU scheduler
can arbitrate between processes; bands alone changed nothing, because
the FIFO still ran every queued band before anyone else's job. - The device queue asks for LOW global priority
(VK_EXT_global_priority, integrated GPUs only, silent fallback): at
every boundary the scheduler now picks the desktop's work first.
Together: the second client holds 134–142 fps through convergence, and
accumulation pays 10–15% more wall time. The converged image is
unchanged.
The viewport says what is drawing it
Top-right corner, always on: the device name and the active mode —
raster, ray-traced lighting, path tracing, the Embree preview
modes on the CPU device, and raster (moving) while the fast-movement
downgrade is live. It is part of the overlay rather than the status bar,
so screenshots and captures carry their own provenance.
A first run has moves to play
The Record/Play panel used to start empty, which gave a new user no hint
what a step even looks like. A fresh install now seeds a default tour —
iso, a full spin, top, an explode there-and-back, bottom — as editable
examples of each step kind. A deliberately emptied list stays empty.
Fixed
- The build's warning output means something again on gcc: the Vulkan
{VK_STRUCTURE_TYPE_...}idiom tripped several hundred
-Wmissing-field-initializersfalse positives that buried real
warnings. What the noise was hiding is fixed too: two Gerber-importer
aggregate initialisers genuinely missing a member, a misleadingly
indented (but correct) command in the offscreen path, and two dead
functions removed. The build is now down to a single warning, in
third-party code.