fix(renderer): auto-revert sentinel now covers the auto-detected wgpu tier

The startup sentinel only guarded explicit Settings overrides: an
auto-detected wgpu start that crashed pre-paint re-detected wgpu on the
next launch — an unrecoverable crash loop (#542 hit exactly this). Arm
the sentinel when auto-detect picks wgpu; if it survives to the next
start, persist the GL (compatibility) renderer instead of re-detecting,
and explain with a toast. Linux-only by design (macOS has no GL tier).
Also add the .po entries for the existing revert toast, which was
missing from all catalogs, plus the new degrade toast (7 locales).

cc
This commit is contained in:
vicrodh committed 2026-07-05 08:11:04 -06:00
1 parent 3b5192acd6
commit a273088205
8 files changed
+84 -1

No files matched your search

@@ -4358,3 +4358,9 @@ msgstr "Natives DSD (Kernel-Unterstützung erforderlich)"
msgid "Date added"
msgstr "Hinzugefügt am"
msgid "Renderer setting reverted to Auto — the previous start didn't finish"
msgstr "Renderer-Einstellung auf Automatisch zurückgesetzt — der letzte Start wurde nicht abgeschlossen"
msgid "Renderer switched to GPU (compatibility) — the GPU renderer failed to start"
msgstr "Renderer auf GPU (Kompatibilität) umgestellt — der GPU-Renderer konnte nicht starten"
@@ -97,3 +97,9 @@ msgstr "Sign-in failed"
msgid "Date added"
msgstr "Date added"
msgid "Renderer setting reverted to Auto — the previous start didn't finish"
msgstr "Renderer setting reverted to Auto — the previous start didn't finish"
msgid "Renderer switched to GPU (compatibility) — the GPU renderer failed to start"
msgstr "Renderer switched to GPU (compatibility) — the GPU renderer failed to start"
@@ -4388,3 +4388,9 @@ msgstr "DSD nativo (requiere soporte del kernel)"
msgid "Date added"
msgstr "Fecha de agregado"
msgid "Renderer setting reverted to Auto — the previous start didn't finish"
msgstr "El ajuste de renderizador volvió a Automático — el arranque anterior no terminó"
msgid "Renderer switched to GPU (compatibility) — the GPU renderer failed to start"
msgstr "El renderizador cambió a GPU (compatibilidad) — el renderizador GPU no pudo iniciar"
@@ -4358,3 +4358,9 @@ msgstr "DSD natif (prise en charge du noyau requise)"
msgid "Date added"
msgstr "Date d'ajout"
msgid "Renderer setting reverted to Auto — the previous start didn't finish"
msgstr "Réglage du moteur de rendu revenu sur Automatique — le démarrage précédent ne s'est pas terminé"
msgid "Renderer switched to GPU (compatibility) — the GPU renderer failed to start"
msgstr "Moteur de rendu basculé sur GPU (compatibilité) — le rendu GPU n'a pas pu démarrer"
@@ -4347,3 +4347,9 @@ msgstr "ネイティブDSD(カーネルサポートが必要)"
msgid "Date added"
msgstr "追加日"
msgid "Renderer setting reverted to Auto — the previous start didn't finish"
msgstr "レンダラー設定を自動に戻しました — 前回の起動が完了しませんでした"
msgid "Renderer switched to GPU (compatibility) — the GPU renderer failed to start"
msgstr "レンダラーをGPU(互換)に切り替えました — GPUレンダラーを起動できませんでした"
@@ -4358,3 +4358,9 @@ msgstr "DSD nativo (requer suporte do kernel)"
msgid "Date added"
msgstr "Data de adição"
msgid "Renderer setting reverted to Auto — the previous start didn't finish"
msgstr "Configuração do renderizador revertida para Automático — a inicialização anterior não foi concluída"
msgid "Renderer switched to GPU (compatibility) — the GPU renderer failed to start"
msgstr "Renderizador alterado para GPU (compatibilidade) — o renderizador GPU não conseguiu iniciar"
@@ -4371,3 +4371,9 @@ msgstr "Нативный DSD (требуется поддержка ядра)"
msgid "Date added"
msgstr "Дата добавления"
msgid "Renderer setting reverted to Auto — the previous start didn't finish"
msgstr "Настройка рендерера возвращена на «Авто» — предыдущий запуск не завершился"
msgid "Renderer switched to GPU (compatibility) — the GPU renderer failed to start"
msgstr "Рендерер переключён на GPU (совместимость) — GPU-рендерер не смог запуститься"
+42 -1
View File
@@ -5439,6 +5439,10 @@ static RENDERER_ADAPTERS: std::sync::OnceLock<String> = std::sync::OnceLock::new
/// previous start died before its first paint; read once the UI is up to show
/// the explanatory toast.
static RENDERER_REVERTED: std::sync::atomic::AtomicBool = std::sync::atomic::AtomicBool::new(false);
/// Set when the AUTO-DETECTED wgpu tier crashed pre-paint on the previous
/// start and the setting was degraded to "gl" (#542); read once the UI is up
/// to show the explanatory toast.
static RENDERER_DEGRADED: std::sync::atomic::AtomicBool = std::sync::atomic::AtomicBool::new(false);
/// One-line diagnostics summary of the active renderer + adapters.
pub fn renderer_decision_summary() -> (String, String) {
@@ -5733,7 +5737,34 @@ fn renderer_tier_from_prefs() -> (RendererTier, String) {
let mut prefs = crate::ui_prefs::load();
let key = prefs.renderer.clone();
if key == "auto" {
return (detect_hardware_gpu(), "auto-detect".to_string());
// The sentinel also guards the AUTO-DETECTED wgpu tier (#542): if the
// previous auto start picked wgpu and died before first paint,
// re-detecting would pick wgpu again — an unrecoverable crash loop.
// Degrade the persisted setting to "gl" (the user can switch back in
// Settings) and explain with a toast. macOS has no GL tier (it
// degrades back to wgpu), so the guard is Linux-shaped by design.
if renderer_sentinel_armed() {
let attempted = renderer_sentinel_value();
clear_renderer_sentinel();
if attempted.as_deref() == Some("auto-wgpu") && !cfg!(target_os = "macos") {
log::warn!(
"[renderer] previous start with the auto-detected wgpu renderer never \
reached first paint -> persisting the GL (compatibility) renderer"
);
prefs.renderer = "gl".to_string();
crate::ui_prefs::save(&prefs);
RENDERER_DEGRADED.store(true, std::sync::atomic::Ordering::Relaxed);
return (
RendererTier::FemtovgGl,
"Settings (gl — auto-detected wgpu failed to start)".to_string(),
);
}
}
let tier = detect_hardware_gpu();
if tier == RendererTier::Wgpu && !cfg!(target_os = "macos") {
arm_renderer_sentinel("auto-wgpu");
}
return (tier, "auto-detect".to_string());
}
if renderer_sentinel_armed() {
log::warn!(
@@ -6072,6 +6103,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
qbz_i18n::t("Renderer setting reverted to Auto — the previous start didn't finish"),
);
}
// Same idea for the auto-detect path (#542): wgpu crashed pre-paint last
// time, this start persisted the GL fallback instead.
if RENDERER_DEGRADED.load(std::sync::atomic::Ordering::Relaxed) {
crate::toast::warning(
&window,
qbz_i18n::t(
"Renderer switched to GPU (compatibility) — the GPU renderer failed to start",
),
);
}
install_browser_mouse_nav(&window);
wire_window_controls(&window);
// Immersive-exit fullscreen guard: the fullscreen toggle only exists in