Vendored by scripts/vendor-pyrowave.sh — do not edit by hand.

pyrowave:        509e4f887b585a3f97471fcc804e9de649f2c16f
Granite:         44362775d36e0c4139352f83efd96bab4e239f66
volk:            47cddf7ed97b94118a08aacb548a411188e016cc
vulkan-headers:  015e25c3c91b70eb1a754d36fb14c4ba6ad9b0b9

Tree is pruned to what the pyrowave-sys standalone build needs
(see the rm -rf list in the script). All parts are MIT-licensed
(pyrowave, Granite) or Apache-2.0/MIT (volk, Vulkan-Headers).

Local patches (crates/pyrowave-sys/patches/, re-applied on re-vendor).
These are OUR fixes — kept local by decision (we vendor anyway), not filed
upstream:
  0001-payload-data-444-sizing.patch — encoder payload_data worst-case buffer
    was sized for 4:2:0's 1.5 samples/px; busy 4:4:4 (3 samples/px) overran it
    on the GPU → nondeterministic corrupt bitstreams/crashes at any bitrate.
    Found + validated 2026-07-18 (RTX 5070 Ti, 1080p/4K, 8/16-bit).
  0002-rdo-saving-clamp.patch — analyze_rate_control.comp accumulates the full
    32-bit per-block rate saving into the RDO bucket totals but packs only 16
    bits into each RDOperation; once a block's saving exceeds 65535 cost units
    the resolve pass over-credits applied ops and the bitstream can overshoot
    the hard rate target (the same overrun class as 0001). Clamped to the
    packed width (conservative direction). Includes the regenerated
    shaders/slangmosh.hpp (built with the pinned Granite slangmosh, -O --strip
    per upstream's slangmosh.sh); behavior-neutral at our operating points
    (byte-identical outputs, validated on the RTX 5070 Ti).
    NOTE the related UNPATCHED limit: the packed 16-bit block_index wraps when
    block_count_32x32 > 65535 (~8K 4:4:4) — guarded host-side instead
    (pf-encode rejects such modes for PyroWave).
  0003-devel-encode-16bit-read.patch — devel tool encode.cpp read y4m planes
    with texel-count math (bytes for 8-bit): 16-bit inputs got half-plane
    reads and a desynced stream after frame 1. Tool-only (our build never
    compiles the devel tools; kept so the vendored source is honest).

  0004-encoder-buffer-pool.patch — pyrowave_c.cpp allocated four Vulkan buffers
    (meta + bitstream, Device + CachedHost) on EVERY encode. At 240 fps with
    MB-scale bitstreams that per-frame churn stalled the encode itself: on an
    RTX 4090 the 5120x1440 submit+fence-wait was ~15 ms (~64 fps ceiling) and
    dropped to ~1 ms (~1025 fps) once the buffers are pooled on the encoder and
    reused. Safe under the synchronous encode model; re-validated by
    pyrowave_win_smoke. Perf fix, not a correctness fix.

  0005-global-priority-queue.patch — Context::create_device requests a global-priority Vulkan
    compute queue (VK_KHR_global_priority, PYROWAVE_QUEUE_PRIORITY=off|high|realtime, default
    realtime) so the wavelet encode can preempt a GPU-bound game on the shared shader cores. A
    create loop downgrades on NOT_PERMITTED so a refused class never regresses the encoder. Did
    not overcome the graphics-vs-compute preemption wall on an RTX 4090 (kept: correct + harmless,
    may help other HW/drivers) — that measurement is Windows/WDDM and does not transfer to Linux.
    GATED ON !inherit_info, so it is LIVE ONLY ON THE WINDOWS PATH (pyrowave_create_device_by_compat,
    where Granite builds its own device). Linux passes its own create-infos and takes the inherit
    branch, so this patch is inert there; the Linux request lives natively in
    crates/pf-encode/src/enc/linux/pyrowave.rs (queue_priority_candidates), with the same grammar
    and the same downgrade ladder. Change one, change both.
