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 = 対象外

IntegrationModulemacOSWindowsLinux
py.nozzle*🟦🟦🟦
nozzle.rs*🟦🟦🟦
Nozzle.NET*🟦🟦🟦
nozzle.swift*🟦N/AN/A
nozzle.zig*🟦🟦🟦
nozzle.go*🟦🟦🟦
nozzle.dart*🟦🟦🟦
nozzle.java*🟦🟦🟦
nozzle.kotlin*🟦🟦🟦
ofxNozzleofxNozzleSender🟦🟦
ofxNozzleofxNozzleReceiver🟦🟦
tcxNozzletcxNozzleSender🟦🟦🟦
tcxNozzletcxNozzleReceiver🟦🟦🟦
jit.nozzlejit.nozzle.*🟦N/A
jit.nozzlejit.gl.nozzle.*🟦N/A
nozzle-TOP*🟦N/A
obs-nozzle*🟦🟦🟦
blender-nozzle*🟦🟦🟦
nozzle-sokol*🟦🟦🟦
nozzle-pdpix_nozzle_*🟦🟦🟦
nozzle-pdpix_nozzle_gl_*🟦🟦🟦
nozzle.unity*Experimental direct C ABI; no native bridge
nozzle-viewer*🟦🟦🟦
nozzle-testerCLI / GUI🟦🟦🟦
nozzle-ffglNozzleReceive🟦🟦N/A
nozzle-ffglNozzleSend🟦🟦N/A
nozzle-spout-syphonBridge scaffold🟦🟦N/A
nozzle-unrealPlugin scaffoldN/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.