feat(kiosk): graphics tiers + Settings knob; network map kiosk mode
Demo images / Build & push demo images (push) Successful in 3m51s

The animated federation map froze the framework-pt 4K TV: the launcher
held every machine to the HD 5500-era choppy-audio flags (single raster
thread, GpuRasterization banned) while the map wrote SVG attrs at 60fps.

- Launcher: two flag tiers. legacy = the proven conservative set; modern
  (Intel gen8+, 'NNth Gen' models, AMD Ryzen) = default raster threads +
  GPU rasterization. Classified from /proc/cpuinfo (11 model strings
  covered by tests in-session); KIOSK_GRAPHICS=performance|quality in
  kiosk-display.conf overrides; headless unchanged. Reaches deployed
  kiosks via the include_str! self-heal, same as the vsync fix.
- system.kiosk-display.get/set: carries a 'graphics' field alongside
  'preset'; setting one no longer clobbers the other.
- Settings → Display: Graphics picker (Auto / Compatibility / Quality).
- NetworkMap3D: kiosks default to the 2D projection (remembered toggle
  still works) and tick at half rate with carried-over deltas — same
  spin speed, half the paint cost.
- Changelog: curated Unreleased notes for all of the above + the gate
  frame-embedding fix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-08-13 09:23:07 -04:00
co-authored by Claude Fable 5
parent 6672d978f7
commit 9243babcdb
5 changed files with 203 additions and 30 deletions
@@ -172,23 +172,70 @@ xset s noblank 2>/dev/null || true
pkill -u archipelago -f 'chromium.*localhost' 2>/dev/null || true
sleep 1
# GPU vs headless (#36, choppy-audio incident 2026-06-28). --enable-gpu-rasterization
# spins a dedicated GPU process at 55-92% CPU even on real GPU hardware (Intel HD 5500)
# because under X11 it falls back to software compositing anyway — that CPU
# starvation is what caused choppy HDMI audio. --in-process-gpu avoids the
# separate process; GpuRasterization is also disabled via --disable-features below.
# On a GPU-less / headless server (no /dev/dri), disable GPU entirely instead.
# ── Graphics tier ────────────────────────────────────────────────────────
# One flag set does not fit all kiosk hardware. The June-2026 choppy-audio
# incident (#36) proved HD 5500-era boxes melt with GPU rasterization on
# (under X11 they fall back to software compositing while a GPU process
# burns 55-92% CPU) — but holding MODERN iGPUs to those same defensive
# flags (single raster thread, raster ban) froze framework-pt outright on
# the animated network map at 4K (2026-08-13). So: two tiers.
#
# legacy — the proven HD 5500 tuning: --in-process-gpu, ONE raster
# thread, GpuRasterization banned via --disable-features.
# modern — --in-process-gpu, Chromium's default raster threads,
# GpuRasterization allowed.
#
# KIOSK_GRAPHICS in /etc/archipelago/kiosk-display.conf overrides:
# auto (default) | performance (force legacy) | quality (force modern)
# Set from Settings → Display; sourced with the rest of the conf above.
#
# Auto classifies by CPU model string — transparent and greppable, and the
# iGPU generation tracks the CPU generation on this hardware. Rules:
# * "NNth Gen Intel" → only stamped on gen 10+ model names → modern
# * AMD Ryzen → modern
# * Intel iN-NNNNN (5 dig)→ gen 10+ desktop → modern
# * Intel iN-8xxx/9xxx → gen 8/9 → modern
# * anything else → legacy (fail conservative: slow-but-stable)
detect_graphics_tier() {
case "${KIOSK_GRAPHICS:-auto}" in
performance) echo legacy; return ;;
quality) echo modern; return ;;
esac
_cpu=$(grep -m1 '^model name' /proc/cpuinfo 2>/dev/null || true)
case "$_cpu" in
*"Gen Intel"*) echo modern; return ;;
*AMD*Ryzen*) echo modern; return ;;
esac
_num=$(printf '%s' "$_cpu" | grep -oE 'i[3579]-[0-9]{4,5}' | head -1 | cut -d- -f2)
case "$_num" in
[0-9][0-9][0-9][0-9][0-9]) echo modern; return ;; # 5 digits = gen 10+
[89][0-9][0-9][0-9]) echo modern; return ;; # gen 8/9
esac
echo legacy
}
if [ -e /dev/dri/card0 ] || [ -e /dev/dri/renderD128 ]; then
GPU_FLAGS="--in-process-gpu --num-raster-threads=1"
# Hardware VIDEO DECODE (VA-API) on GPU hardware. Orthogonal to the
# GpuRasterization ban above: decode offload REDUCES the CPU pressure
# that caused the choppy-audio incident, it doesn't re-create it.
# Falls back silently to software decode when the platform lacks a
# va driver — never a black player. IgnoreDriverChecks: older Intel
# gens (HD 5500-era kiosks) are wrongly blocklisted upstream.
GRAPHICS_TIER=$(detect_graphics_tier)
if [ "$GRAPHICS_TIER" = "modern" ]; then
GPU_FLAGS="--in-process-gpu"
EXTRA_DISABLED_FEATURES=""
else
GPU_FLAGS="--in-process-gpu --num-raster-threads=1"
EXTRA_DISABLED_FEATURES=",GpuRasterization"
fi
# Hardware VIDEO DECODE (VA-API) on GPU hardware — both tiers. Decode
# offload REDUCES the CPU pressure that caused the choppy-audio
# incident, it doesn't re-create it. Falls back silently to software
# decode when the platform lacks a va driver — never a black player.
# IgnoreDriverChecks: older Intel gens (HD 5500-era kiosks) are wrongly
# blocklisted upstream.
ENABLE_FEATURES="OverlayScrollbar,VaapiVideoDecodeLinuxGL,VaapiIgnoreDriverChecks"
echo "archipelago-kiosk: graphics tier=$GRAPHICS_TIER (KIOSK_GRAPHICS=${KIOSK_GRAPHICS:-auto})"
else
# GPU-less / headless server (no /dev/dri): no GPU at all.
GRAPHICS_TIER=headless
GPU_FLAGS="--disable-gpu --num-raster-threads=1"
EXTRA_DISABLED_FEATURES=",GpuRasterization"
ENABLE_FEATURES="OverlayScrollbar"
fi
@@ -224,7 +271,7 @@ while true; do
--disable-translate \
--no-first-run \
--check-for-update-interval=31536000 \
--disable-features=TranslateUI,MetricsReporting,AutofillServerCommunication,PasswordManagerEnabled,GpuRasterization \
--disable-features=TranslateUI,MetricsReporting,AutofillServerCommunication,PasswordManagerEnabled${EXTRA_DISABLED_FEATURES} \
--enable-features=$ENABLE_FEATURES \
--disable-session-crashed-bubble \
--disable-save-password-bubble \