PanosandClaude Opus 5 02b0f4c7d9 Tell the user when the scene is drawn without a GPU
A day of pan/zoom that had suddenly become unusable on a 1.2M-entity
drawing turned out to be no regression at all: an unattended NVIDIA
userspace update had been applied without a reboot, the Vulkan ICD could
no longer talk to the still-loaded kernel module, and wgpu silently fell
through to Mesa's llvmpipe. Nothing in the app said so. iced picks the
adapter and names it only under RUST_LOG, so the only evidence was 32
`llvmpipe-N` threads in /proc. The same silence covers WARP on Windows,
SwiftShader in browsers, and the case where wgpu finds no adapter at all
and iced quietly draws the chrome with tiny-skia while the shader widget
is dropped, leaving a blank viewport. This commit makes all of that
visible, on every platform, without new dependencies.

Detection (src/scene/pipeline/mod.rs)
-------------------------------------
`GpuStatus` is derived from two signals:

* `record_gpu_adapter`, run from `MultiPipeline::new` (once per device,
  next to the existing uncaptured-error handler), reads
  `Device::adapter_info()`, prints one `[gpu] adapter: <name> (<backend>,
  <device type>, driver …)` line — stderr natively, `console.warn` on the
  web, which has no stderr — and keeps a copy.
* `note_scene_draw`, run from `ViewportPane::draw`, counts how often the
  viewport asked for a primitive. Every renderer makes that call; only
  wgpu goes on to `prepare` and create a device. Three draws with no
  device ever recorded therefore mean the primitive is being dropped.

The verdict is one of `Unknown`, `Hardware`, `Software(adapter)` or
`NoRenderer`. `Software` is `DeviceType::Cpu` — what Vulkan reports for
llvmpipe, DX12 for WARP and GL for a renderer string that gives it away —
plus a name match on the fallbacks browsers expose (SwiftShader, llvmpipe,
lavapipe, "Microsoft Basic Render"), because the WebGPU backend reports
every adapter as `Other` (gfx-rs/wgpu#8819). Metal has no software device,
so on macOS only `NoRenderer` can occur (a VM without a GPU); it is caught
by the draw count like everywhere else.

`gpu_status_if_changed` costs one atomic load per app message: a
generation counter moves only when a device is recorded or the draw count
crosses its threshold, so the app re-derives the verdict a handful of
times per session.

Notification (src/app/startup.rs, view/modal.rs, ui/statusbar)
-------------------------------------------------------------
`refresh_gpu_status` runs after every message. On a degraded verdict it
speaks through three channels, because many users never read the command
line:

* A popup, `ModalKind::GpuWarning`, queued once per verdict through the
  startup-modal queue so it waits its turn behind the file open. It names
  the adapter, states the consequence (slow navigation, unstable or
  missing rendering) and gives the remedy that usually applies on the
  running platform: a driver update not yet followed by a reboot on
  Linux, a missing driver or a Remote Desktop / VM session on Windows, a
  VM without a Metal device on macOS, hardware acceleration switched off
  in the browser. "Don't show again for this device" stores
  `GpuStatus::identity()` in `settings.gpu_warning_silenced`; keying it by
  verdict means silencing "software rendering on llvmpipe" does not
  silence a later, different failure.
* A status-bar pill in the theme's warning colours, `⚠ Software rendering`
  or `⚠ No GPU renderer`. It is not a `StatusPill`, so it cannot be hidden,
  and it stays for the session; clicking it reopens the popup, silenced or
  not.
* A command-line entry through the new `CommandLine::push_warning`, which
  is styled like an error but deliberately does not touch `last_error` /
  `error_revision`: automation reads those to decide whether the command it
  just ran failed, and a graphics warning is not a failed command.

`subscription()` requests frames only while the verdict is `Unknown` on a
document tab (the Start page draws no viewport), so the probe costs one
frame on a working GPU, three on none, then stops.

Verification
------------
* Live on the machine that had the incident, with the Vulkan loader
  restricted to Mesa (`VK_DRIVER_FILES=…/lvp_icd.json WGPU_BACKEND=vulkan`):
  popup → OK → pill → click reopens; "Don't show again" → restart → pill
  only, no popup.
* `gpu_tests::the_adapter_is_reported_once_per_device` (ignored, needs an
  adapter) asserts the classification on a real device; it was run on both
  llvmpipe (`Cpu`) and an NVIDIA GT 1030 (`DiscreteGpu`).
* Unit tests cover the name heuristic, the verdict function, the identity
  rule, the warning text with an adapter name that itself contains
  parentheses and commas, the settings round trip and the command-line
  semantics. New strings are in all 21 locales as the `gpu` Fluent group.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 16:19:41 +03:00
2026-09-12 14:13:49 +03:00
…
2026-08-22 09:33:38 +03:00

English · Български · Português (Brasil) · Čeština · Nederlands · Français · Suomi · Deutsch · Ελληνικά · Magyar · Italiano · 日本語 · 한국어 · Polski · Русский · 简体中文 · Español · 繁體中文 · Türkçe · हिन्दी · العربية

Open CAD Studio logo

Open CAD Studio

Open-source 2D drafting and 3D modeling for desktop and web, built with Rust.

Latest release Release downloads GitHub stars GPL-3.0 license

Launch the web app · Download the desktop app · Join the discussion

Open CAD Studio workspace

Overview

Open CAD Studio is a cross-platform application for technical drawing, layout work, and solid modeling. It reads and writes DWG and DXF drawings natively, with a shared editing core across the desktop and browser versions.

The project is under active development. Keep backups of important production drawings and report reproducible problems through GitHub Issues.

Highlights

  • Native drawing workflow — open, edit, recover, and save DWG and DXF files without a conversion service.
  • Precise 2D drafting — lines, polylines, curves, splines, hatches, object snaps, tracking, layers, blocks, and external references.
  • Documentation tools — text, dimensions, leaders, tolerances, tables, model space, paper space, viewports, and plot styles.
  • Kernel-backed 3D modeling — solid primitives, extrusion, revolution, sweep, loft, Boolean operations, and ACIS entity tessellation.
  • GPU rendering — accelerated 2D and 3D viewports through wgpu, with orthographic and perspective cameras.
  • Extensible workflows — native plugins, command scripts, headless conversion, and a line-based JSON automation API.

3D model in Open CAD Studio

File workflows

Format or workflow Support
DWG Read and write; versioned save targets from R14 through 2018
DXF Read and write; versioned save targets from R14 through 2018
BAK / SV$ Open drawing backups and autosave files
OBJ Import polygon meshes
LandXML Import CgPoint survey points
STL Export 3D mesh data
STEP AP203 Export 3D mesh data
PDF Plot layouts and selected geometry on desktop
CSV Extract entity property data
CTB / STB Load and edit plot style tables

Desktop or web

Use the web app for immediate access with no installation. Drawings are selected through the browser and saved as local downloads.

Use the desktop application for native file associations, file-manager thumbnails, system printing, PDF output, external plugins, command scripts, and headless automation. Release builds are available for Windows, Linux, and Apple Silicon macOS.

Install

Download all current packages from the latest release.

Windows

Choose one of these signed x86-64 packages:

  • OpenCADStudio-*-windows-x86_64-installer.msi — recommended installer with Start Menu shortcuts, DWG/DXF file associations, and drawing thumbnails.
  • OpenCADStudio-*-windows-x86_64-portable.exe — standalone application; no installation required.

Linux

Download the x86-64 AppImage, make it executable, and run it:

chmod +x OpenCADStudio-*-linux-x86_64.AppImage
./OpenCADStudio-*-linux-x86_64.AppImage

macOS

The published macOS package supports Apple Silicon:

  1. Download OpenCADStudio-*-macos-arm64.dmg.
  2. Open the image and drag OpenCADStudio.app into Applications.
  3. If Gatekeeper blocks the first launch, approve the app from System Settings → Privacy & Security.

The application is ad-hoc signed but is not currently notarized by Apple.

Languages

Open CAD Studio can follow the system language or use any of these 21 interface languages:

Arabic · Brazilian Portuguese · Bulgarian · Czech · Dutch · English · Finnish · French · German · Greek · Hindi · Hungarian · Italian · Japanese · Korean · Polish · Russian · Simplified Chinese · Spanish · Traditional Chinese · Turkish

Change the language from the application settings. The browser version also uses the browser's preferred locale when System is selected.

Build from source

Desktop

Requirements:

  • Git
  • Current stable Rust toolchain
  • Platform graphics and font development libraries

On Ubuntu or Debian, install the native dependencies with:

sudo apt update
sudo apt install libgl1-mesa-dev libx11-dev libxcursor-dev libxi-dev \
  libxrandr-dev libxkbcommon-dev libwayland-dev libfontconfig1-dev \
  libfreetype6-dev

Then build and run:

git clone https://github.com/HakanSeven12/OpenCADStudio.git
cd OpenCADStudio
cargo build --release --bin OpenCADStudio

The resulting binary is written to target/release/OpenCADStudio (OpenCADStudio.exe on Windows).

Web

Install the WebAssembly target and build tools once:

rustup target add wasm32-unknown-unknown
cargo install trunk wasm-bindgen-cli

Start the development server:

trunk serve

Automation

The desktop binary supports one-shot conversion, a persistent headless server, and a client-neutral MCP endpoint for AI applications:

OpenCADStudio --export input.dwg output.dxf
OpenCADStudio --serve
OpenCADStudio --serve --port 4242
OpenCADStudio --mcp

The automation server exchanges one JSON object per line over standard input/output or a local TCP socket. The self-contained MCP endpoint exposes the live desktop editor through the same tools to every compatible client. To connect a client, configure it to launch OpenCADStudio --mcp. See the MCP control guide.

Plugins

Desktop plugins run in separate processes and communicate with the host through the versioned plugin API. The browser build does not load native plugins.

Project documentation

Contributing

Bug reports, focused pull requests, translations, documentation improvements, and plugin contributions are welcome.

  • Search existing issues before opening a new report.
  • Use Discussions for questions and ideas.
  • Report vulnerabilities privately by following the security policy.

Application translations live in locales/*/opencadstudio.ftl; source labels map through src/locale_catalog.rs. After editing translations, run python3 scripts/export-locales.py to refresh web and desktop packaging labels. Validate with python3 scripts/test_site.py and cargo test --lib i18n::tests.

Project growth

Stars

Open CAD Studio star history

Release downloads

Open CAD Studio release download history

Support the project

If Open CAD Studio helps your work, support continued development through GitHub Sponsors or Patreon.

License

Open CAD Studio is distributed under the GNU General Public License v3.0.

S
Description
OneBSpace rebrand of OpenCADStudio -> OneCAD Draft (2D drafting / 3D modeling studio) + native Odoo Documents integration (open/save/write-back). Member of the OneCAD family. Upstream: opencadstudio-upstream. Addon: one_cad_draft.
Readme GPL-3.0
249 MiB
0 Stars 1 Watchers 0 Forks
Languages
Rust 70.8%
Fluent 27.8%
WGSL 0.5%
Python 0.3%
TypeScript 0.2%
Other 0.2%