From c8840e27061e607d66c8728bf21db409c5b8da51 Mon Sep 17 00:00:00 2001 From: Hakan Seven Date: Wed, 19 Aug 2026 19:04:58 +0300 Subject: [PATCH] fix(web): force WebGL2 backend Affected Chromium adapters fail after selecting WebGPU even when packed renderer paths are forced. Use WebGL2 for the web app and let device limits select renderer tiers.\n\nRefs #788 --- src/app/mod.rs | 1 + src/scene/pipeline/device_capabilities.rs | 2 -- src/scene/pipeline/mod.rs | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 604d8e656..f9d749440 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -3723,6 +3723,7 @@ pub fn run_web() -> iced::Result { .subscription(OpenCADStudio::subscription) .title(|_state: &OpenCADStudio| "Open CAD Studio".to_string()) .theme(|state: &OpenCADStudio| state.active_theme.clone()) + .backend(iced::Backend::Hardware(iced::backend::Api::OpenGL)) .font(iced_aw::ICED_AW_FONT_BYTES) .run() } diff --git a/src/scene/pipeline/device_capabilities.rs b/src/scene/pipeline/device_capabilities.rs index 3f41b0964..bef328986 100644 --- a/src/scene/pipeline/device_capabilities.rs +++ b/src/scene/pipeline/device_capabilities.rs @@ -1,8 +1,6 @@ use iced::wgpu; /// Renderer-relevant limits of the selected GPU device. -/// -/// Native devices select by limits; browser builds use compatibility paths. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct DeviceCapabilities { pub max_storage_buffers_per_shader_stage: u32, diff --git a/src/scene/pipeline/mod.rs b/src/scene/pipeline/mod.rs index c1c3dba10..a59fc1a60 100644 --- a/src/scene/pipeline/mod.rs +++ b/src/scene/pipeline/mod.rs @@ -560,12 +560,12 @@ impl Pipeline { ); // ── Wire pipeline ────────────────────────────────────────────────── - // Browser shader support can lag behind advertised WebGPU limits. + // Select the renderer tier from device limits. let device_caps = DeviceCapabilities::detect(device); #[cfg(not(target_arch = "wasm32"))] let force_compat_renderer = crate::cli::gui_config().compat_renderer; #[cfg(target_arch = "wasm32")] - let force_compat_renderer = true; + let force_compat_renderer = false; let wire_mode = wire_gpu::WirePipelineMode::select(device_caps, force_compat_renderer); let wire_const_bgl = wire_mode