Визуализация топологии микросхем в браузере: перенос десктопного рендер-стека на WebGPU
По данным Хабра, команда, которая годами гоняла десктопный инструмент для топологии интегральных схем на Rust, собрала тот же рендер-стек в wasm и вывела его в <canvas> через WebGPU.

Браузер сожрал GDS-файл на сотни мегабайт и не захлебнулся. По данным Хабра, команда, которая годами гоняла десктопный инструмент для топологии интегральных схем на Rust, собрала тот же рендер-стек в wasm и вывела его в <canvas> через WebGPU. Для нас, бэкендеров и фронтов с привычкой к тормозящему Canvas2D, это наглядный урок: миллионы прямоугольников на кристалле теперь крутятся без отдельного JS-парсера и без второго движка.
Почему не взлетели альтернативы
Серверный рендер в тайлы — классический костыль. Каждый зум = запрос, интерактивность мертвая, плюс серверу приходится разбирать чужие данные клиента. Canvas2D и SVG на чистом JS — второй движок поверх первого, на миллионах фигур они просто сдаются. JS/TS-парсер GDSII рядом с десктопным Rust-парсером через полгода разъедется в интерпретациях: иерархия, зеркала, массивы ссылок — минное поле.
Поэтому оставили Rust, переключили цель на wasm32-unknown-unknown, а GPU-обёртки над wgpu заменили бэкенд с Vulkan/Metal на WebGPU. Шейдеры на WGSL те же. instanced-рендер тот же. Один рендер-стек, два мира — без дублирования логики и без тихого расхождения формата.
Где проходит граница порта
Из примерно 500 тысяч строк верификации наружу не ушло ни одной. Крейт с DRC, LVS, PEX тащит rusqlite с бандленным C, winit, rfd, reqwest — под wasm это не собирается, и делать вид, что соберётся, авторы не стали. Паразитные ёмкости и сверку со схемой браузеру делать нечего. Файл GDS после скачивания остаётся в памяти вкладки, на сервер за разбором его не гоняют — это не оптимизация, это архитектурный принцип.
Панели, тулбар, свойства — это Angular, теми же компонентами, что остальной сайт. Тащить egui как второй UI-тулкит внутрь чужого интерфейса — значит получить две визуальные системы на одной странице. eframe в wasm-крейте всё же есть, но используют его только как оболочку: канвас, события мыши и жестов, поверхность wgpu. Шрифты egui выключили через default_fonts — из бинаря ушло почти 1.4 МБ. Мелочь, а на медленном канале у юзера это секунды.
Что проверить у себя
- WebGPU доступен в Chrome, Edge и Safari 26 и новее. На старых версиях — заглушка, без вариантов. WebGL2 не подходит категорически: instanced-шейдеры требуют
var<storage>, storage-буферов в WebGL2 нет. - Если ваш фронт тянет Canvas2D больше 100k объектов в кадре — это уже повод смотреть на WebGPU и instanced-рендер, а не писать очередной виртуализированный список с ручным клиппингом.
- При сборке wasm-крейте с GUI-оболочкой отключайте
default_fontsи встроенные иконки, если их рисует хост-приложение. 1.4 МБ — не косметика, это размер полезного payload.
# быстрая проверка поддержки в консоли
navigator.gpu?.requestAdapter || console.warn('нет WebGPU')
# если вернётся null — пользователь увидит заглушкуБэкапы GDS делайте до того, как полезете править шейдер. Мир жесток, коммит на стейдже не откатишь.