macOS Metal рендерер для bsdOS Wayland display stream.
Status: Ready for development (MVP complete)
- ✅ Zenoh subscriber for WaylandPacket stream
- ✅ Metal GPU texture creation
- ✅ NSWindow + MTKView UI
- ✅ RGBA32 pixel format support
- ✅ Frame buffering & synchronization
bsdOS VM (FreeBSD)
→ cage (Wayland compositor)
→ wayland-tunnel (proxy to WaylandPacket)
→ bsdos-core (Zenoh bridge)
→ Zenoh bsdos/global/wayland/stream (WaylandPacket)
Zenoh peer (localhost:7447 forward via SSH tunnel)
→ bsdos-metal-viewer (Rust + Objective-C)
→ Decode WaylandPacket
→ Replay on local Wayland compositor
→ macOS display
- macOS 11.0+ (Big Sur)
- Rust 1.70+
- Xcode Command Line Tools (для objc2)
- SSH tunnel до bsdOS VM:
ssh -L 7447:127.0.0.1:7447 user@bsdos-host
cd /root/bsdOS/mac-companion/metal-viewer
cargo build --releaseБинарь: target/release/bsdos-metal-viewer
# Forward Zenoh peer от VM на локальный 7447
ssh -L 7447:127.0.0.1:7447 freebsd@bsdos-hostmake vm-start-waylandЭто запустит:
seatdдля управления устройствами вводаcage(Wayland compositor)wayland-tunnel(proxy для WaylandPacket)bsdos-core(Zenoh bridge)
ZENOH_PEER=tcp/localhost:7447 ./target/release/bsdos-metal-viewerОкно откроется автоматически и будет показывать WaylandPacket поток с VM.
На хосте (Linux):
# Запустить Wayland pipeline на VM
make vm-start-wayland
# Проверить логи
make vm-ssh
tail -f /tmp/wayland-tunnel.logНа Mac (отдельная сборка):
# Из mac-companion/metal-viewer/
cargo build --release
ZENOH_PEER=tcp/localhost:7447 ./target/release/bsdos-metal-viewerZenoh topic: bsdos/global/wayland/stream
WaylandPacket (binary):
[0..4] : msgId (u32, little-endian)
[4..8] : objId (u32, little-endian)
[8..10] : opCode (u16, little-endian)
[10..12] : padding
[12..16] : payloadLen (u32, little-endian)
[16..] : Wayland wire protocol args
Пример (wl_surface.commit):
- Header size: 16 bytes
- Payload: variable (0 for commit)
- Total: 16+ bytes
-
Проверить, запущены ли wayland-tunnel и bsdos-core:
make vm-ssh ps aux | grep "wayland-tunnel\|bsdos-core"
-
Проверить, работает ли cage/Wayland:
echo $WAYLAND_DISPLAY # Should print: ghost-0
-
Проверить логи:
tail -50 /tmp/wayland-tunnel.log tail -50 /tmp/bsdos-core.log
-
Проверить, доступен ли Zenoh:
ZENOH_PEER=tcp/localhost:7447 cargo run --release -- --help # Should not error about connection
- Вероятно, недостаточно пропускной способности SSH tunnel
- Попробовать compression:
ssh -C -L ... - Или использовать более быстрый транспорт (Wireguard VPN)
- Убедитесь, что запуск на macOS с Metal support
- Проверить:
system_profiler SPDisplaysDataType | grep Metal
- ✓ Zenoh subscriber для
bsdos/global/wayland/stream - ✓ MTKView + NSWindow инициализация
- ⏳ WaylandPacket декодирование
- ⏳ Replay на локальный Wayland compositor
- ⏳ Input echo (Mac → VM через Zenoh)
- ⏳ Оптимизация (packet buffering, latency tuning)
- WaylandPacket latency statistics in title bar
- Window resizing → scale WaylandPacket viewport
- Input forwarding optimization (deduplicate pointer motion)
- Multi-monitor support (wl_output protocol)
- Wayland subsurface composition