A metal-down VST3/CLAP audio plugin built with Rust and Vulkan.
- PAL (Platform Abstraction Layer) - Native windowing without
winit - GUI - Shared interface components (event handling, UI state)
- Render - Vulkan graphics with SVG rasterization
- Core - Lock-free audio processing and state management
- Rust toolchain (stable)
- Vulkan SDK (for shader compilation with
glslc)- macOS:
brew install vulkan-toolsor download from LunarG - Windows: Install from LunarG Vulkan SDK
- The build system will auto-detect glslc in standard locations including
~/.local/VulkanSDK
- macOS:
# Build all workspace crates
cargo build --workspace
# Run tests (5 tests passing)
cargo test --workspace
# Build and bundle the plugin (with shader compilation)
cargo run --package xtask -- bundle
# Run standalone (with GUI, when implemented)
cargo run --bin standalone
# Run standalone in headless mode
cargo run --bin standalone -- --headlessAfter running cargo run --package xtask -- bundle, the plugin will be located at:
- macOS:
target/bundled/splug.vst3/ - Windows:
target/bundled/splug.vst3
Compiled shaders: target/shaders/*.spv
Phase 1: Build System & Skeleton - Complete
- Workspace structure with 6 crates
- cargo-xtask build automation
- Shader compilation pipeline (auto-detects Vulkan SDK)
- Platform-specific bundle generation
- macOS codesigning
- PAL and GUI crate skeletons
Phase 2: Platform Abstraction Layer - Skeleton created
Phase 3: Graphics Core - Not started
Phase 4: Core Logic & Persistence - Not started
Phase 5: Test Harness (RPC) - Not started
rust-vst/
├── plugin/ # Core plugin library (cdylib)
│ └── src/
│ ├── lib.rs # VST3 entry points with panic safety
│ ├── pal/ # Platform Abstraction Layer (legacy, moved to pal crate)
│ ├── render/ # Vulkan rendering (Phase 3)
│ ├── core/ # Audio processing (Phase 4)
│ └── shaders/ # GLSL shaders
├── pal/ # Platform Abstraction Layer library
│ └── src/
│ ├── lib.rs # NativeWindow trait
│ ├── macos.rs # macOS implementation (Phase 2)
│ └── win32.rs # Windows implementation (Phase 2)
├── gui/ # Shared GUI framework
│ └── src/lib.rs # UIEvent types, GuiContext (Phase 2-3)
├── standalone/ # Standalone host for testing
│ └── src/main.rs
├── xtask/ # Build automation
│ └── src/main.rs # Shader compilation, bundling, codesigning
└── definitions/ # Protobuf schemas
└── src/lib.rs # State and RPC definitions (Phase 4-5)
This project follows strict real-time audio programming rules:
- No allocations on the audio thread (
Box,Vec,String) - No mutex locking on the audio thread
- Use
rtrbor atomics for parameter communication - All FFI entry points wrapped in
catch_unwindfor panic safety
MIT OR Apache-2.0