feat(client): PyroWave decode backend on the presenter's device (Phase 2b, part 1)
ci / web (push) Successful in 55s
ci / docs-site (push) Successful in 1m2s
ci / rust (push) Failing after 4m1s
decky / build-publish (push) Successful in 18s
arch / build-publish (push) Failing after 4m45s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 9s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 9s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 8s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 8s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 7s
deb / build-publish (push) Failing after 4m46s
ci / bench (push) Successful in 5m12s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Failing after 3m47s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Failing after 4m39s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 3m41s
flatpak / build-publish (push) Successful in 6m20s
android / android (push) Successful in 13m47s
docker / deploy-docs (push) Successful in 28s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 3m59s
windows / build (aarch64-pc-windows-msvc) (push) Successful in 4m55s
windows / build (x86_64-pc-windows-msvc) (push) Successful in 6m50s
apple / swift (push) Successful in 4m45s
apple / screenshots (push) Successful in 20m33s
ci / web (push) Successful in 55s
ci / docs-site (push) Successful in 1m2s
ci / rust (push) Failing after 4m1s
decky / build-publish (push) Successful in 18s
arch / build-publish (push) Failing after 4m45s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 9s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 9s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 8s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 8s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 7s
deb / build-publish (push) Failing after 4m46s
ci / bench (push) Successful in 5m12s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Failing after 3m47s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Failing after 4m39s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 3m41s
flatpak / build-publish (push) Successful in 6m20s
android / android (push) Successful in 13m47s
docker / deploy-docs (push) Successful in 28s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 3m59s
windows / build (aarch64-pc-windows-msvc) (push) Successful in 4m55s
windows / build (x86_64-pc-windows-msvc) (push) Successful in 6m50s
apple / swift (push) Successful in 4m45s
apple / screenshots (push) Successful in 20m33s
The presenter's device creation now probes + enables the PyroWave compute feature set alongside the Vulkan Video probe (shaderInt16, storageBuffer8BitAccess, subgroup size control — gated on support, harmless when unused) and exports the facts through VulkanDecodeDevice (pyrowave_decode capability + feature bools + apiVersion + the queue- family shape). pf-client-core (feature `pyrowave`, Linux): video_pyrowave.rs — the decoder runs pyrowave compute on the PRESENTER's own VkDevice, zero interop (plan §4.5): pinned content-equivalent create-info reconstruction satisfies pyrowave 0.4.0's lifetime rule without refactoring the presenter's creation; queue access rides the existing device-wide QueueLock (the FFmpeg/Skia contract); decode records into our command buffer, fence-synchronous (sub-ms), into a 4-deep ring of 3xR8 plane sets (decode REQUIRES storage usage + identity swizzles, so the encoder's RG8 trick doesn't apply). Backend::PyroWave + DecodedImage::PyroWave + Decoder::new_pyrowave + decodable_codecs_for (advertisement gated on the device probe) wired through the decode dispatch; no demote ladder (nothing else decodes it — fallback is session renegotiation, plan §4.6). Still to come for a live session: the presenter's planar-CSC render path for the new variant, pump/shell opt-in (preferred_codec) wiring, and the on-glass .21 run. Validated on .21: pf-client-core + pf-presenter compile with and without the feature, clippy clean, 26 client-core tests green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -497,9 +497,23 @@ impl Presenter {
|
||||
.push_next(&mut have_f12)
|
||||
.push_next(&mut have_f13);
|
||||
unsafe { instance.get_physical_device_features2(pdev, &mut have_f2) };
|
||||
// Copy the one base-features fact out NOW: `have_f2` mutably borrows the 11/12/13
|
||||
// structs through its pNext chain, so any later use of it would pin those borrows.
|
||||
let have_shader_int16 = have_f2.features.shader_int16;
|
||||
let features_ok = have_f11.sampler_ycbcr_conversion == vk::TRUE
|
||||
&& have_f12.timeline_semaphore == vk::TRUE
|
||||
&& have_f13.synchronization2 == vk::TRUE;
|
||||
// PyroWave decode (the wired-LAN wavelet codec, design/pyrowave-codec-plan.md §4.5):
|
||||
// plain Vulkan-1.3 compute on THIS device — no video extensions. Probed alongside so a
|
||||
// capable device gets the features enabled below and advertises the codec; anything
|
||||
// less simply never sets the CODEC_PYROWAVE bit.
|
||||
let pyrowave_ok = dev_is_13
|
||||
&& have_shader_int16 == vk::TRUE
|
||||
&& have_f12.storage_buffer8_bit_access == vk::TRUE
|
||||
&& have_f12.timeline_semaphore == vk::TRUE
|
||||
&& have_f13.subgroup_size_control == vk::TRUE
|
||||
&& have_f13.compute_full_subgroups == vk::TRUE
|
||||
&& have_f13.synchronization2 == vk::TRUE;
|
||||
|
||||
// The decode queue family + which codec operations it can run.
|
||||
let decode_family: Option<(u32, vk::VideoCodecOperationFlagsKHR)> = {
|
||||
@@ -575,13 +589,18 @@ impl Presenter {
|
||||
let mut en_f11 = vk::PhysicalDeviceVulkan11Features::default()
|
||||
.sampler_ycbcr_conversion(have_f11.sampler_ycbcr_conversion == vk::TRUE);
|
||||
let mut en_f12 = vk::PhysicalDeviceVulkan12Features::default()
|
||||
.timeline_semaphore(have_f12.timeline_semaphore == vk::TRUE);
|
||||
.timeline_semaphore(have_f12.timeline_semaphore == vk::TRUE)
|
||||
.storage_buffer8_bit_access(pyrowave_ok)
|
||||
.shader_float16(pyrowave_ok && have_f12.shader_float16 == vk::TRUE);
|
||||
let mut en_f13 = vk::PhysicalDeviceVulkan13Features::default()
|
||||
.synchronization2(have_f13.synchronization2 == vk::TRUE);
|
||||
.synchronization2(have_f13.synchronization2 == vk::TRUE)
|
||||
.subgroup_size_control(pyrowave_ok)
|
||||
.compute_full_subgroups(pyrowave_ok);
|
||||
let mut en_f2 = vk::PhysicalDeviceFeatures2::default()
|
||||
.push_next(&mut en_f11)
|
||||
.push_next(&mut en_f12)
|
||||
.push_next(&mut en_f13);
|
||||
en_f2.features.shader_int16 = if pyrowave_ok { vk::TRUE } else { vk::FALSE };
|
||||
|
||||
let priorities = [1.0f32];
|
||||
let mut queue_info = vec![vk::DeviceQueueCreateInfo::default()
|
||||
@@ -632,9 +651,9 @@ impl Presenter {
|
||||
// all funnel their queue calls through it — see the `queue_lock` field docs).
|
||||
let queue_lock = std::sync::Arc::new(pf_client_core::video::QueueLock::new());
|
||||
#[cfg(windows)]
|
||||
let export_worthy = video_ok || win_capable;
|
||||
let export_worthy = video_ok || win_capable || pyrowave_ok;
|
||||
#[cfg(not(windows))]
|
||||
let export_worthy = video_ok;
|
||||
let export_worthy = video_ok || pyrowave_ok;
|
||||
let video_export = if export_worthy {
|
||||
let qf_props = unsafe { instance.get_physical_device_queue_family_properties(pdev) };
|
||||
let mut device_extensions: Vec<CString> =
|
||||
@@ -678,6 +697,14 @@ impl Presenter {
|
||||
f_sampler_ycbcr: have_f11.sampler_ycbcr_conversion == vk::TRUE,
|
||||
f_timeline_semaphore: have_f12.timeline_semaphore == vk::TRUE,
|
||||
f_synchronization2: have_f13.synchronization2 == vk::TRUE,
|
||||
f_shader_int16: pyrowave_ok,
|
||||
f_storage_buffer8: pyrowave_ok,
|
||||
f_subgroup_size_control: pyrowave_ok,
|
||||
f_compute_full_subgroups: pyrowave_ok,
|
||||
f_shader_float16: pyrowave_ok && have_f12.shader_float16 == vk::TRUE,
|
||||
api_version: dev_props.api_version,
|
||||
queue_families: queue_info.iter().map(|q| q.queue_family_index).collect(),
|
||||
pyrowave_decode: pyrowave_ok,
|
||||
video_decode: video_ok,
|
||||
#[cfg(windows)]
|
||||
d3d11_import: win_capable,
|
||||
|
||||
Reference in New Issue
Block a user