Rubylight Download 2.2.10
On this page
  1. Why this exists
  2. Measured
  3. What is different from Vibepollo 2.0.0-beta.3
  4. PyroWave (experimental)
  5. Install
  6. Next
  7. Credits and license

Butterpollo 1.x: the C++ fork (history) #

Current documentation · Archived C++ references · Current architecture

These are the notes from Butterpollo's C++ releases (2.0.0-beta.3-butter.1 to butter.4), a fork of Vibepollo 2.0.0-beta.3. Butterpollo 2.0 replaced that host with the Rust host in rust/; see the main README for the current release. The C++ sources were removed from main after 2.0.0-rc.23; that tag keeps them. Some things below no longer apply: Butterpollo 2.0 brings back the Steam, Playnite and Lossless Scaling integrations, and installs with butterpollo-setup-<version>.exe instead of VibepolloSetup.exe.

Butterpollo is a Windows game-streaming host built on Vibepollo, which builds on Apollo and Sunshine. It has one job: get each frame from your PC to your Moonlight client as fast and as evenly as possible. Anything that doesn't serve that job has been taken out. A change goes in only if it makes streaming faster or smoother, and I measure it before it ships.

The name comes from the first tester's verdict on the WGC fix: "smooth as butter". Also, pollo is Spanish for chicken.

Why this exists #

I wrote the native AMD AMF encoder work for Vibepollo (#461). That PR has been open since August. In the meantime the 2.0 betas brought regressions that made streams less smooth than 1.19: a DXGI display re-scan every second on the frame-pacing thread, and control-event polls that could spin. On top of that, the WGC capture path copied every frame three times before the encoder could start. I got tired of chasing new bugs in a moving target, so Butterpollo pins one base and only accepts latency and smoothness work.

Measured #

RX 7900 XT, AMD driver 32.0.31041.1004. Phone client, AV1 10-bit HDR, 1968x2184, 120 fps, WGC capture, native AMF. Numbers are host processing latency: capture to network send, the figure Moonlight shows. Each range covers several 10-second windows of the same stream.

Build Median p99 Max Frames ≥1 ms above median, per 10 s
Before the WGC fix 3.55-3.66 ms 4.46-4.72 ms 4.6-5.4 ms 2-29
Butterpollo 3.21-3.28 ms 3.37-3.74 ms 3.7-4.6 ms 0-2

Hardware encoding alone takes about 2.4 ms at this resolution, so most of what is left is the encoder itself.

What is different from Vibepollo 2.0.0-beta.3 #

Encoder (native AMF, encoder = amdvce):

Capture (Windows Graphics Capture):

System:

Diagnostics:

Removed, because none of it is needed to stream:

PyroWave (experimental) #

PyroWave is an intra-only wavelet codec that runs as Vulkan compute. Every frame stands alone, and encoding is very fast: in a self-test on an RX 7900 XT, colour conversion, encode and packetizing took 0.5-0.7 ms per frame at 1080p and about 0.7 ms at 4K. The cost is bandwidth. It needs a few hundred Mbit/s, so it is only for fast wired networks.

Butterpollo's PyroWave stream is wire-compatible with the PyroWave Moonlight clients from pyrowave-streaming: the Artemis fork for Android and the Moonlight-Qt build for Windows, Linux and the Steam Deck. Other Moonlight clients don't know the codec and keep using H.264, HEVC or AV1.

To use it, turn on pyrowave (Advanced settings, or pyrowave = enabled in sunshine.conf) and restart the host. At startup the host checks that the GPU can encode PyroWave and only then offers it. It does 4:2:0 and 4:4:4 in SDR, and 4:2:0 in HDR10. The client picks the bitrate, and the host keeps each frame small enough for the stream's error correction to cover it.

Phones decode PyroWave more slowly than hardware codecs. The Artemis fork measured about 5.7 ms per frame at 1972x1248 on a Snapdragon 8 Elite Gen 5, so use a lower stream resolution there.

Install #

Download VibepolloSetup.exe from Releases.

The first releases install as a drop-in replacement for Vibepollo: same install folder, same service, same config and paired devices. Back up C:\Program Files\Apollo\config first and keep your current installer in case you want to go back. The installers are unsigned test builds.

To keep an existing Vibepollo virtual controller driver, install with:

VibepolloSetup.exe /qn INSTALL_VIRTUAL_GAMEPAD_DRIVER=0

Settings I stream with on AMD:

encoder = amdvce
amd_usage = ultralowlatency
amd_quality = speed
amd_preanalysis = disabled
amd_av1_latency_mode = lowest

Next #

Bug reports are welcome if they include GPU and driver, client, resolution/fps/codec, and a few Host latency stages log lines.

Credits and license #

Butterpollo is GPL-3.0, like everything it builds on. Thanks to Nonary for Vibepollo, ClassicOldSong for Apollo, and LizardByte and the Sunshine contributors. Everything outside the list above is their work. PyroWave and Granite are by Themaister (MIT), and the PyroWave Moonlight protocol and clients are joemossjr16's work.

View this page on GitHub