nozzle
Cross-platform GPU texture sharing between local processes. Zero-copy on macOS, Windows, and Linux.
macOS 12+ (Metal/IOSurface) · Windows 10+ (D3D11) · Linux (DMA-BUF)
Cross-Platform
Metal/IOSurface on macOS, D3D11 on Windows, DMA-BUF on Linux. Same API, every platform.
Zero Dependencies
C++17 STL + OS frameworks only. Static library links into any project without runtime deps.
Modern C++ API
Result<T> error handling, no exceptions, no RTTI. Clean snake_case throughout.
C ABI
Full C API for plugin/host integration. Bindings for Python, Rust, Swift, Zig, Go, Dart, Java, Kotlin, and more.
High-Precision Formats
R16F, RGBA16F, R32F, RGBA32F, and more. Not limited to 8-bit color.
Thread-Safe
Same sender/receiver callable from multiple threads. Object-level thread safety.
Quick Example
Share a texture between two processes in a few lines:
Sender
#include <nozzle/nozzle.hpp>
nozzle::sender_desc desc;
desc.name = "my_output";
desc.application_name = "MyApp";
desc.ring_buffer_size = 3;
auto sender = nozzle::sender::create(std::move(desc)).value();
nozzle::texture_desc td;
td.width = 1920;
td.height = 1080;
td.format = nozzle::texture_format::rgba8_unorm;
auto frame = sender.acquire_writable_frame(td).value();
// ... write GPU data into frame ...
sender.commit_frame(frame);Receiver
#include <nozzle/nozzle.hpp>
nozzle::receiver_desc desc;
desc.name = "my_output";
desc.application_name = "MyViewer";
auto receiver = nozzle::receiver::create(std::move(desc)).value();
nozzle::acquire_desc ad;
ad.timeout_ms = 1000;
auto frame = receiver.acquire_frame(ad).value();
auto info = frame.info();
// info.width == 1920
// info.height == 1080
// info.frame_index, info.timestamp_ns ...Integrations
Integration Status
Last updated: 2026/05/31 22:20 (JST)
✅ = 実機検証済 🟦 = CI build only — = 非対応 N/A = 対象外
| Integration | Module | macOS | Windows | Linux |
|---|---|---|---|---|
| py.nozzle | * | 🟦 | 🟦 | 🟦 |
| nozzle.rs | * | 🟦 | 🟦 | 🟦 |
| Nozzle.NET | * | 🟦 | 🟦 | 🟦 |
| nozzle.swift | * | 🟦 | N/A | N/A |
| nozzle.zig | * | 🟦 | 🟦 | 🟦 |
| nozzle.go | * | 🟦 | 🟦 | 🟦 |
| nozzle.dart | * | 🟦 | 🟦 | 🟦 |
| nozzle.java | * | 🟦 | 🟦 | 🟦 |
| nozzle.kotlin | * | 🟦 | 🟦 | 🟦 |
| ofxNozzle | ofxNozzleSender | ✅ | 🟦 | 🟦 |
| ofxNozzle | ofxNozzleReceiver | ✅ | 🟦 | 🟦 |
| tcxNozzle | tcxNozzleSender | 🟦 | 🟦 | 🟦 |
| tcxNozzle | tcxNozzleReceiver | 🟦 | 🟦 | 🟦 |
| jit.nozzle | jit.nozzle.* | ✅ | 🟦 | N/A |
| jit.nozzle | jit.gl.nozzle.* | ✅ | 🟦 | N/A |
| nozzle-TOP | * | ✅ | 🟦 | N/A |
| obs-nozzle | * | 🟦 | 🟦 | 🟦 |
| blender-nozzle | * | 🟦 | 🟦 | 🟦 |
| nozzle-sokol | * | 🟦 | 🟦 | 🟦 |
| nozzle-pd | pix_nozzle_* | 🟦 | 🟦 | 🟦 |
| nozzle-pd | pix_nozzle_gl_* | 🟦 | 🟦 | 🟦 |
| nozzle.unity | * | Experimental direct C ABI; no native bridge | ||
| nozzle-viewer | * | 🟦 | 🟦 | 🟦 |
| nozzle-tester | CLI / GUI | 🟦 | 🟦 | 🟦 |
| nozzle-ffgl | NozzleReceive | 🟦 | 🟦 | N/A |
| nozzle-ffgl | NozzleSend | 🟦 | 🟦 | N/A |
| nozzle-spout-syphon | Bridge scaffold | 🟦 | 🟦 | N/A |
| nozzle-unreal | Plugin scaffold | N/A | 🟦 | N/A |
nozzle draws significant inspiration from Syphon and Spout. The named sender/receiver model, the concept of shared GPU textures between local processes, and the focus on creative-coding and real-time graphics integration all follow the path they established. nozzle is an independent implementation with its own API design and is not protocol-compatible with either project.