ARM64 Windows host (Snapdragon X) — aarch64-pc-windows-msvc
#298
Open
opened 2026-08-18 13:21:19 +00:00 by enricobuehler
·
0 comments
No Branch/Tag Specified
main
fix/flatpak-setup-win-prune
feat/osd-scale-auto
fix/multi-pad-launcher
feat/windows-multiseat-addon
fix-reassert-concede
live-kill-recovery-gate
live-wedged-worker-gate
fix-reassert-breaker-window
live-fence-ring-gate
fix-live-create-drop-linger
worktree-fix-apple-tvos-decoded-hardening
worktree-wp11-connector-leases
fix-manager-test-imports
feat/store-launch-kinds
worktree-wp7-host-fence-v3
worktree-fix-stale-pairing-toasts
worktree-wp10-topology-txn
worktree-wp7-driver-fence-v2
worktree-wp13-recovery-fsm
worktree-wp7-fence-ring
fix-steam-proto-doc-lint
worktree-wp14-stream-continuity
worktree-wp13-recovery-wiring-v2
feat/installer-win-done-polish
worktree-wp9-snapshot-readers-v2
worktree-wp8-display-snapshot
worktree-fix-tvos-focus
fix/installer-win-smoke-findings
smoke/installer-win-stack
feat/installer-win-client
feat/installer-win-inno-migration
worktree-wp4-header-v3
feat/installer-win-ci-engine
fix/android-decoder-bare-rung
feat/installer-win-pack
spike/installer-win-s2
spike/installer-win-s1
feat/installer-v2-client
feat/installer-v2-tui
feat/installer-v2-engine
worktree-omarchy-client-theme
release/v0.34.0
docs/stale-support-claims
fix/openapi-spec-drift
worktree-sc2-usb-macos
pr-425-gapfix
worktree-host-actions
worktree-omarchy-installer-gaps
worktree-docs-universal-installer
worktree-keep-host-audio-parity
worktree-standby-sink-investigation
worktree-security-review-fixes
worktree-abr-dscp-default
worktree-abr-control-loop
worktree-abr-transmission-plane
worktree-pyrowave-forces-auto
worktree-web-console-native-identity
worktree-abr-encode-downdriver
worktree-gamescope-exclusive-panel-off
worktree-bitrate-picker
worktree-fix-mic-tap-format-abort
worktree-release-0313-recut
ci-skia-download-retry
worktree-audio-devnode-orphans
worktree-gamescope-rebuild-keeps-hdr
worktree-gamescope-idled-handback
worktree-hevc-idr-storm-coalesce
worktree-gamestream-pad-heartbeat
worktree-steam-prelaunch-latch
worktree-release-0312-prep
worktree-firewall-program-scoped-rules
worktree-blackscreen-data-plane-source-ip
worktree-fix-frozen-local-ip
worktree-android-pad-mapping-regression
worktree-android-console-extra-keys
worktree-data-plane-firewall-and-delivery-truth
worktree-android-gamepad-ui-and-corner
worktree-android-pad-hid-remap
worktree-gamestream-xbox-hid-parity
worktree-release-next-prep
worktree-win-client-installer
worktree-kwin-vout-enable-repair
worktree-wp4-install-script
docs-wp2-to-main
worktree-docs-wp0-wp1-anti-drift
worktree-kwin-vout-failed-permanent
worktree-android-asc-hdr-dataspace
worktree-console-controllers-page
worktree-gamepad-probe-stack
worktree-agents-md-setup
worktree-android-skia-console
worktree-android-asc-presenter
worktree-win-teardown-abort
worktree-audio-hires-default-on
worktree-console-ui-aa
worktree-pr270-review-fixes
worktree-console-ui-overhaul
worktree-hires-audio-pcm
worktree-audio-stutter-fixes
worktree-ds-pad-sink-pro-audio
worktree-console-diagnostics
worktree-ds-inhibit-storm
worktree-security-review-2026-08-15-fixes
worktree-pairing-friendly-device-name
worktree-shield-select-back-quit
worktree-android-canary-open-testing
fix-host-cer-alias-null-key
worktree-azure-trusted-signing
worktree-audio-soft-limit-gain
worktree-gamescope-exclusive-dpms
fix/playnite-launcher-resolve
worktree-macos-mic-rebuild-loop
worktree-hyprland-cursor-mode-negotiation
worktree-hd2-idle-recording-default
worktree-steam-art-root-windows
worktree-android-aaudio-shield-silence
worktree-unpair-all-button
worktree-appletv-present-depth
worktree-av1-level-sentinel
worktree-nix-plugin-runner-resolve
worktree-release-0280
worktree-console-plugin-update-all
worktree-flatpak-skia-099-pin
worktree-debian-ubuntu-support
worktree-wowlan-support
worktree-decky-shortcut-dup
worktree-vk-level-gate-clamp
worktree-edition-2024
worktree-win-sleep-blockers
worktree-rt-gpu-priority-defaults
worktree-black-stream-fixes
worktree-edid-lock-toggle
worktree-gate-double-arm-fix
chore/rust-safety-programme
worktree-console-pinned-profile-library
worktree-blackscreen-fixes
build/web-silence-rollup-directive-warnings
worktree-android-console-visual-refresh
worktree-nixos-capped-compositor-exe-denied
worktree-release-0270
worktree-dm-helper-diagnosis
worktree-gamescope-pin-bump-nobara
worktree-notes-capsysnice-correction
worktree-bazzite-docs-warning
worktree-kwin-capability-identification
worktree-gamescope-rpm-deb-builddeps
worktree-pyrowave-wire-dead-code
worktree-release-0260
worktree-cursor-composite-hardening
worktree-library-settings-origin-split
worktree-native-decode-m0
worktree-july-rpm-and-cursor
worktree-presenter-cadence-wp1
worktree-decky-brand-name
worktree-win-amd-decoder-order
worktree-stall-ride-through
fix/pad-audio-wasapi-module-path
feat/android-pad-audio
worktree-adl-emul-probe
worktree-haptics-m12-dry
worktree-haptics-m9-richfb
worktree-haptics-m11-settings
worktree-apple-store-screenshots
worktree-decky-slim-rework
worktree-appstore-copy
worktree-haptics-m10-wire
worktree-haptics-m8-proto
worktree-haptics-m7-windows
worktree-haptics-m6-presenter
worktree-wire-mtu-resilience
worktree-haptics-m5-android
worktree-haptics-m4-apple
worktree-haptics-m3-rumble-engine
worktree-android-presenter-023-triage
worktree-vdisplay-resume-recovery
worktree-kwin-vout-demirror
fix/web-console-sweep
fix/windows-web-console-lifecycle
chore/windows-rerender-semantics
fix/pf-encode-phase8
fix/pf-encode-phase7
feat/cursor-channel
feat/desktop-mouse-mode
feat/plugin-kit
fix/network-split-standing-latency
fix/windows-msix-arm64-and-manifest
fix/encode-medium-tier
fix/encode-rfi-taint-and-oob
fix/encode-init-leak-and-twin-drift
fix/encode-teardown-uaf
feat/pyrowave-windows
fix/ubuntu-2404-host-deb
fix/ios-archive-provisioning
merge/first-frame-latency
feat/shared-clipboard-v2
feat/apple-live-activities-widgets
debug/touch-finger-logging
feat/shared-clipboard
midstream-resize
plugin-kit-v0.4.5
v0.34.0
v0.33.0
v0.32.0
v0.31.4
sdk-v0.1.6
v0.31.3
v0.31.2
v0.31.1
plugin-kit-v0.4.4
v0.31.0
sdk-v0.1.5
plugin-kit-v0.4.3
v0.30.0
plugin-kit-v0.4.2
v0.29.0
v0.28.1
v0.28.0
plugin-kit-v0.4.1
v0.27.0
v0.26.0
plugin-kit-v0.4.0
sdk-v0.1.4
plugin-kit-v0.3.3
sdk-v0.1.3
plugin-kit-v0.3.2
v0.25.0
plugin-kit-v0.3.1
plugin-kit-v0.3.0
v0.24.0
v0.23.0
v0.22.3
v0.22.2
v0.22.1
v0.22.0
v0.21.0
v0.20.1
v0.20.0
plugin-kit-v0.2.0
v0.19.2
v0.19.1
v0.19.0
v0.18.0
v0.17.2
v0.17.1
v0.17.0
v0.16.0
v0.15.0
v0.14.0
v0.13.0
v0.12.0
v0.11.0
v0.10.1
v0.10.0
v0.9.2
v0.9.1
v0.9.0
v0.8.4
v0.8.3
v0.8.2
v0.8.1
v0.8.0
v0.7.4
v0.7.3
v0.7.2
v0.7.1
v0.7.0
v0.6.0
v0.5.1
v0.5.0
v0.4.2
v0.4.1
v0.4.0
v0.3.1
v0.3.0
v0.2.1
v0.2.0
v0.1.1
v0.1.0
Labels
No items
No labels
Milestone
No items
No Milestone
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: unom/punktfunk#298
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ship the Windows host natively on
aarch64-pc-windows-msvcfor Snapdragon X (X Elite / X Plus).Design:
design/media-foundation-encoder.md§5–§7 — punktfunk-planning PR #16 (branchdocs/media-foundation-encoder), written againstorigin/main9c133350; every file:line below re-verified there. Encoder half: #297.Verdict: viable, and the encoder is the smaller half. The genuine critical path is the startup code-patch, the vdisplay driver, bun, and the update feed.
aarch64-pc-windows-msvcis Tier 1; the host source is arch-clean (exactly onecfg(target_arch)site in the whole Windows host stack, and it is already ARM64-aware —wasapi_mic.rs:324-328). Sunshine ships an ARM64 host; Apollo and Parsec do not.The recorded stance — "x64-only by design … no IddCx path on ARM64" (
windows-build-and-packaging.md:15-17,packaging/windows/README.md:21-27) — rests on two premises that are stale: IddCx does exist on ARM64 (the MS sample ships an ARM64 config; third-party IDDs ship ARM64), and "the driver builds x64-only" describes our own.cargo/config.toml, not the platform. The premise that survives — no vendor encoder backend for Adreno — is exactly what #297 removes. Both docs must be updated when this lands.P2 — the build leg (~1 week, no device needed)
pf-capture/src/windows/dxgi.rs:104-190install_gpu_pref_hookwrites x86-64 opcodes (48 B8 … FF E0,mov rax,imm64; jmp rax) intowin32u.dll!NtGdiDdDDIGetCachedHybridQueryValue. It is notcfg-gated and runs frompunktfunk-host/src/main.rs:376for every non-CLI subcommand — so it compiles clean on ARM64 and then corrupts a live code page. Fix:#[cfg(target_arch = "x86_64")](its purpose, hybrid dGPU/iGPU reparenting, is moot on a single-GPU SoC). Do this first.pf-capture/src/lib.rs:567-568; DDA and the WGC relay are gone) ⇒ without an ARM64pf_vdisplaythat installs, no frame is ever captured. Pinned in four places:[build] target = "x86_64-pc-windows-msvc"inpackaging/windows/drivers/.cargo/config.toml(the+crt-statictrick there is load-bearing — add an[target.aarch64…]block, don't delete),const ARCH = "x64"inpf-vdisplay/build.rs:16andwdk-probe/build.rs:17,stampinf -a amd64/inf2cat /os:10_X64inbuild-pf-vdisplay.ps1:152-153+build-gamepad-drivers.ps1, and the output paths. Mechanical: the INX files are alreadyNT$ARCH$and the vendoredwdk-buildmakefile already carries theaarch64 → arm64 / Server10_arm64mapping. Signing is R4 below.windows-host.yml:293pullsbun-windows-x64.zip). Decision, not code: accept x64 bun under Prism (background Nitro server, likely fine) or move the console runtime.windows_host:{url,…}(publish-update-manifest.sh:107-110,pf-update-check/src/manifest.rs:63), unsuffixedlatest/punktfunk-host-setup.exe(windows-host.yml:459), wingetArchitecture: x64single entry. Without this an ARM64 box is handed the x64 installer. Schema bump + arch selection inupdate/windows.rs+_x64/_arm64alias suffixes (the client already does this).windows-host.yml:106,168,173has no matrix and no--target; there is no ARM64 runner. Cross-build off the x64 runner — the client's ARM64 leg proves the toolchain is provisioned — build + clippy only;pf-capture/pf-vdisplaytests stay x64 until a Snapdragon runner exists.nvenc(nvidia-video-codec-sdklink-imports the driver import lib — won't link), noqsv(libvpl-sys/build.rsguardstarget_osonly and would CMake the Intel dispatcher for aarch64 — add atarget_archguard), noamf-qsv.punktfunk-hostdefault is["pyrowave","gamestream"]⇒--no-default-features --features gamestream[,pyrowave]pending R2.ArchitecturesAllowed=x64(punktfunk-host.iss:99-100), winget arch, the nefcon\x64\regex,pf-vkhdr-layerbuilt without--target(pack-host-installer.ps1:308-320).Already paid for:
aws-lc-sys, libopus (CMake) andopenh264-sys2already cross-compile toaarch64-pc-windows-msvcvia the client's ARM64 leg — that removes most of the C-build risk in one stroke. The tray (pure Win32), service install, WASAPI/IPolicyConfig audio minting andpf-inject(SendInput+ our own UMDF HID drivers — no ViGEmBus anywhere in the tree) are arch-neutral.windows = "0.62"single-versioned, every requested feature has aarch64 metadata.P3 — on-glass (needs a device)
The project owns no Windows-on-ARM box. The Snapdragon Dev Kit was cancelled (2024-10); a used Surface Laptop 7 / Dell XPS 13 9345 / Lenovo Yoga Slim 7x (X1E-78/80) is the realistic rig — an X Plus answers the floor, an X Elite the ceiling. Azure WoA VMs have no Adreno (software MFT only) — good for build/CI, useless for the encoder questions.
The encoder-side unknowns (ForceKeyFrame, LTR, mid-stream bitrate re-set, latency, HEVC/AV1 usability, SPS/PPS repeat, real max res/fps) are Q1–Q7 in the design doc §6 and belong to #297. Host-side:
Steam\drivers\Windows10\arm64\SteamStreaming{Speakers,Microphone}.inf? Post-VB-CABLE those are the only audio substrate — the resolver and installer already look inarm64\. If not: no audio on WoA, and that is a separate design.pyrowave.rs:388-390)? If not, droppyrowavefrom the ARM64 build and MF is the only rung..cerimported as a machine root (packaging/windows/README.md:160-176); field reports say self/test-signed drivers accepted on x64 SKUs are rejected on ARM64 SKUs. Attestation signing does support ARM64 — the README already calls attestation "the real fix"; this becomes the forcing function.GetNextPacketSize() == 0; fallback is process-loopback viaActivateAudioInterfaceAsync.ffmpeg -c:v h264_mf -hw_encoding truefind the QCOM MFT under Prism?Then: a
VENDOR_QUALCOMMcaps table per SoC,request_keyframefallback if Q1 fails, RFI only if Q2 passes.P4 — release
Canary channel for
_arm64, docs, announce. Q1's answer decides whether the ARM64 host is announced with "loss recovery: IDR" or with a finite-GOP caveat.Rejected alternatives (see design §8)
PyroWave-only (wired-LAN, opt-in, 100–400 Mbps, no GameStream client can decode it) · openh264-only (NEON
.Sfiles are skipped onaarch64-pc-windows-msvc—openh264-sys2/build.rs:279-303— a NEON-less C++ encoder on laptop cores) · FFmpegh264_mfviaamf-qsv(needs awinarm64FFmpeg tree we'd have to start shipping again) · D3D12 Video Encode (not exposed by Qualcomm's driver) · x64 host under Prism (carries B2 into a hybrid system DLL).