together: wire GST_PLUGIN_PATH for the Vulkan zerocopy plugin #6

Merged
gabrielgad merged 1 commit from fix/together-vulkan-zerocopy-plugin-path into main 2026-06-17 10:26:49 -04:00
gabrielgad commented 2026-06-17 10:26:46 -04:00 (Migrated from github.com)

Problem

The vulkan-zerocopy encoder needs the custom dmabufvulkanupload element (libgstdmabufvulkan.so), which imports gamescope's NV12 dmabuf straight into the HW encoder — no per-frame copy. That copy was the bottleneck: the vulkan-nv12 path tops out ~128fps with the VCN only ~47% used, while zerocopy sustains ~190-200fps at ~91% VCN.

But the plugin lives in splitux's data dir (~/.local/share/splitux/gst-plugins), which isn't a default GStreamer scan path. spawn_seat_streamer never set GST_PLUGIN_PATH, so the seat-streamer failed with no element "dmabufvulkanupload" and the session zero-videos — i.e. zerocopy has never worked through splitux (only via the bench, which set the env by hand).

Fix

spawn_seat_streamer now sets GST_PLUGIN_PATH to PATH_PARTY/gst-plugins (appending any inherited value so a bench override still wins). Deployers drop libgstdmabufvulkan.so there.

Verified

Clean launch (no manual env): seat-streamer inherits GST_PLUGIN_PATH, the plugin loads, pipeline uses dmabufvulkanupload, encoder runs ~190-200fps, ~25 mbps under heavy motion (properly rate-controlled vs VAAPI's ~155 mbps firehose for the same content), jbuf ~15ms.

Note: RADV's Vulkan H.264 encoder ("not a conformant Vulkan implementation, testing use only") occasionally fails a frame → session drops + auto-reconnects (brief blip). Driver-maturity issue, not this change.

## Problem The `vulkan-zerocopy` encoder needs the custom `dmabufvulkanupload` element (`libgstdmabufvulkan.so`), which imports gamescope's NV12 dmabuf straight into the HW encoder — no per-frame copy. That copy was the bottleneck: the `vulkan-nv12` path tops out ~128fps with the VCN only ~47% used, while zerocopy sustains ~190-200fps at ~91% VCN. But the plugin lives in splitux's data dir (`~/.local/share/splitux/gst-plugins`), which isn't a default GStreamer scan path. `spawn_seat_streamer` never set `GST_PLUGIN_PATH`, so the seat-streamer failed with `no element "dmabufvulkanupload"` and the session zero-videos — i.e. zerocopy has never worked through splitux (only via the bench, which set the env by hand). ## Fix `spawn_seat_streamer` now sets `GST_PLUGIN_PATH` to `PATH_PARTY/gst-plugins` (appending any inherited value so a bench override still wins). Deployers drop `libgstdmabufvulkan.so` there. ## Verified Clean launch (no manual env): seat-streamer inherits `GST_PLUGIN_PATH`, the plugin loads, pipeline uses `dmabufvulkanupload`, encoder runs ~190-200fps, ~25 mbps under heavy motion (properly rate-controlled vs VAAPI's ~155 mbps firehose for the same content), jbuf ~15ms. Note: RADV's Vulkan H.264 encoder ("not a conformant Vulkan implementation, testing use only") occasionally fails a frame → session drops + auto-reconnects (brief blip). Driver-maturity issue, not this change.
Sign in to join this conversation.
No description provided.