Commit 8710f58
* Phase 1: QRhiWidget proof of life for GPU spectrum (#391)
SpectrumWidget conditionally inherits QRhiWidget when AETHER_GPU_SPECTRUM
is enabled. Renders solid dark background via beginPass/endPass. Child
widgets (VfoWidget, OverlayMenu, zoom buttons) composite correctly on
top of the QRhi surface.
- CMake: AETHER_GPU_SPECTRUM option with Qt6::GuiPrivate, Qt6::ShaderTools
- Conditional base class via SPECTRUM_BASE_CLASS macro
- paintEvent wrapped in #ifndef, QRhi stubs in #ifdef
- Validated: renders, child widgets visible, mouse events work
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Phase 2: GPU waterfall + overlay rendering via QRhi (#391)
Waterfall QImage uploaded as RGBA8 texture, rendered as textured quad
with ring buffer scrolling via fragment shader fract(uv.y + offset).
All overlays (grid, FFT, band plan, slices, TNF, spots, scales) painted
into an overlay QImage via QPainter, composited as alpha-blended texture.
Key fix: fract() must be in the fragment shader, not vertex shader.
Per-vertex fract() linearizes between two identical values when the UV
range spans exactly 1.0 (fract(0+offset) == fract(1+offset)), producing
constant UV across the quad. This was likely the same bug that killed
the previous GPU attempt.
Shaders compiled at build time via qt_add_shaders() — no binary .qsb
files in the repo, shader errors are build errors not silent runtime
failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Phase 2: Incremental waterfall row uploads — 97% → 40% CPU (#391)
Replace full 3.5MB QImage upload per frame with per-row incremental
uploads (~6KB each). Track last uploaded row, walk the ring buffer
delta, upload only changed rows with setDestinationTopLeft().
CPU reduction: 97% (QPainter) → 52% (full upload) → 40% (incremental).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Phase 2: Static overlay caching — 97% → 35% CPU (#391)
Split overlay into static (grid, band plan, scales, slices, TNF, spots)
and dynamic (FFT spectrum line) layers. Static overlay only repainted
when markOverlayDirty() is called from state-change methods. Per-frame
work: memcpy cached static, paint FFT on top, upload composite.
Replaced all update() calls with markOverlayDirty() except the two
data paths (updateSpectrum, updateWaterfallRow) which only need a
render, not a static overlay repaint.
CPU progression: 97% (QPainter) → 52% (full upload) → 40% (incremental
waterfall) → 35% (static overlay caching).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Fix non-GPU build: move markOverlayDirty() outside #ifdef
markOverlayDirty() was declared inside #ifdef AETHER_GPU_SPECTRUM but
called from non-guarded code. The method handles both paths internally
so it must be visible regardless of the GPU flag.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Enable GPU spectrum by default, add CI dependencies
AETHER_GPU_SPECTRUM now defaults to ON for shipped binaries. Added
qt6-base-private-dev, qt6-shader-baker, and qt6-shadertools-dev to
the CI Docker image.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Graceful fallback when Qt6::ShaderTools not available
GPU spectrum defaults to ON but falls back to OFF if Qt6::ShaderTools
or Qt6::GuiPrivate aren't found, instead of failing the build. Allows
CI to build successfully while the Docker image is being updated.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Revert graceful fallback — GPU rendering is required
Qt6::ShaderTools and Qt6::GuiPrivate must be present. Build fails
loudly if missing, forcing the CI image to be updated rather than
silently shipping without GPU acceleration.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add missing Qt modules to all release workflows
All release builds (AppImage, Windows, macOS DMG, macOS PKG) were
missing qtwebsockets (TCI server), qtshadertools (GPU spectrum).
ARM AppImage also missing serialport, hidapi, fftw3, portaudio,
qt6-base-private-dev.
This is why TCI wasn't in shipped binaries — the aqtinstall modules
list only had qtmultimedia and qtserialport.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Update build dependencies with full feature list
All packages listed for Arch, Ubuntu, Fedora, macOS with collapsible
table explaining what each dependency enables. Includes GPU spectrum
(qt6-shadertools), TCI (qt6-websockets), StreamDeck (hidapi), NR2
(fftw3) and all other auto-detected features.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Auto-disable GPU spectrum on Qt < 6.7
QRhiWidget requires Qt 6.7+. CI Docker image has Qt 6.4 (Ubuntu 24.04)
which doesn't have QRhiWidget. GPU spectrum now auto-disables on older
Qt instead of failing the build. Release workflows use Qt 6.7 via
aqtinstall and get GPU enabled.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 5eaa35d commit 8710f58
13 files changed
Lines changed: 675 additions & 44 deletions
File tree
- .github
- docker
- workflows
- resources/shaders
- src/gui
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
21 | 24 | | |
22 | 25 | | |
23 | 26 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
42 | 42 | | |
43 | 43 | | |
44 | 44 | | |
45 | | - | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
46 | 49 | | |
47 | 50 | | |
48 | 51 | | |
49 | 52 | | |
50 | 53 | | |
51 | 54 | | |
52 | | - | |
| 55 | + | |
53 | 56 | | |
54 | 57 | | |
55 | 58 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
161 | 161 | | |
162 | 162 | | |
163 | 163 | | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
164 | 181 | | |
165 | 182 | | |
166 | 183 | | |
| |||
557 | 574 | | |
558 | 575 | | |
559 | 576 | | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
560 | 592 | | |
561 | 593 | | |
562 | 594 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
69 | | - | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
70 | 72 | | |
71 | 73 | | |
72 | 74 | | |
73 | | - | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
74 | 78 | | |
75 | 79 | | |
76 | | - | |
77 | | - | |
78 | | - | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
79 | 85 | | |
80 | 86 | | |
81 | | - | |
82 | | - | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
83 | 91 | | |
84 | 92 | | |
85 | | - | |
| 93 | + | |
| 94 | + | |
86 | 95 | | |
87 | 96 | | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
88 | 114 | | |
89 | 115 | | |
90 | 116 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
0 commit comments