Conversation
|
@nocell && @themartiano: Tested revision These results are from a local integration with build adjustments and a repaired guest dependency set, rather than a clean build of the unmodified PR. Build fixes1. Require the DRM VA-API backend in the private FFmpeg buildOur initial FFmpeg build completed, but hardware decoding failed with Adding the following build-time linker option to the generated compiler wrapper allowed that check to succeed: -Wl,-rpath-link=$root/usr/libWe also added a post-configure assertion so a missing backend fails the build instead of producing an unusable package: grep -q '^#define HAVE_VAAPI_DRM 1$' config.h ||
fail "FFmpeg DRM VA-API backend is required"After rebuilding and installing the package, the decoder tests passed through the normal installed library paths. The 2. Build the
|
| Area | Observed result |
|---|---|
| Hardware video decoding | HEVC 8-bit, HEVC 10-bit, VP9 8-bit, and AV1 10-bit each produced the expected 120 frames: 480 frames total. |
| Guest CPU consumption | Hardware decoding used approximately 83–88% less guest CPU time than software decoding in the short test clips. Software decoding had higher maximum throughput; this does not establish total host CPU or power savings. |
| Installed mpv playback | Confirmed VA-API hardware decoding and playback to completion for 10-bit HEVC, but recorded 7 dropped frames during the four-second clip. |
| Multisampling | Both the default guest Mesa and the private HDR Mesa exposed four samples and passed actual multisample allocation, rendering/clear, resolve, and readback checks. |
| Native Wayland presentation | Approximately 119–120 fps from presentation feedback, including a modest rendering workload. This measures the virtual presentation path, not physical panel scanout. |
| HDR | Guest 10-bit output and BT.2020/PQ metadata handoff were observed; direct host presenter tests passed. End-to-end color accuracy remains unverified. |
| Chromium | WebGL 1 and WebGL 2 passed with explicit ANGLE/GLES selection, using VirGL rather than software rendering. |
Remaining validation
- Audio continuity.
- Firefox.
- A controlled 60 Hz run. One attempted run was restored to 120 Hz by display synchronization, so it has not been counted as 60 Hz coverage.
- Longer playback and soak tests, including dropped-frame measurements.
- Visual HDR correctness.
Separate build reproducibility finding
Initial guest assembly encountered an Aquamarine/hyprtoolkit ABI mismatch in the available package set. We used a compatible local pair to continue testing. I would track that separately unless it can be tied directly to this change.
|
Follow-up to my earlier M3 Max testing: we now have a useful SDR-white calibration result and a repeatable HDR-highlight discrepancy to investigate separately. These observations are from the local integration of this PR, subsequently updated to guest kernel SDR-white calibrationWith Mac display brightness held at 50%, setting Hyprland's
The host/guest difference remained approximately 0.1 fc when rechecked after HDR video playback. These are relative phone light-meter measurements, not calibrated panel luminance or colorimetry. 105 is a useful calibration for this tested display/setup at 50% brightness, not a proposed universal default or a claim of 105 physical panel nits. Other brightness levels, display presets, and displays still need separate checks. HDR highlights remain a separate issueKeeping SDR white at 105 preserves visibly brighter HDR output, but the same HDR-white test video in host and guest Vivaldi produced:
That is approximately 29.3% lower guest output, or 0.50 stops, while ordinary white remains matched. An earlier run was similarly around 64 versus 89 fc. We corrected an initial resolution mismatch before the final readings. The final statistics showed 3840×2160 at approximately 59 fps and PQ/BT.2020 on both sides. A remaining confounder is that the host received AV1, YouTube variant 701, while the guest received VP9, variant 337. This is therefore not an identical-bitstream comparison, and we have not isolated decoding, guest tone mapping/compositing, or Mac presentation as the cause. Raising SDR white to compensate would discard the successful desktop calibration without resolving that question. Digital signal checksA temporary diagnostic sampled the GL framebuffer immediately before the existing PQ-to-Metal conversion. In controlled, focused white-page captures, requested SDR-white levels produced approximately:
This confirms that changing the setting changes the guest's emitted white signal. Those values are digital signal luminance, not measured panel nits. Later neutral bright samples reached roughly 490–512 during the video investigation, but were not tied to a specific frame and should only be treated as a lead. The readback instrumentation can stall rendering, so these diagnostic runs are not performance evidence. Persistence and next stepsThe calibrated 105 setting is now saved in the local guest's monitor configuration and display-sync override. Live configuration reload and the display-change reapply path retained 10-bit HDR ( The useful next investigation is an equivalent, controlled HDR source with known signal values, traced through guest scanout and Mac presentation while retaining the SDR-white control. Current results establish a practical desktop-white match and HDR output above ordinary white, but do not yet establish host/guest HDR-highlight equivalence or end-to-end color accuracy. |
ARM64 guest applications spend substantial CPU time decoding video, while the existing eight-bit display path loses HDR output. This adds host VideoToolbox decoding, a paired ten-bit HDR presentation path, consistent SDR interface brightness, and a fix for reproduced HDA audio dropouts.
Closes #167. CPU/RAM settings remain separate in #156.
Demonstration
The two owner-supplied recordings show the same Tron 4K60 HDR source. The accelerated setup uses a 120 Hz guest display; this is not a claim of 120 FPS source playback. The recordings are resized to 1920×1242 for upload, retain their original timing and audio, and preserve ten-bit BT.2020/PQ capture metadata.
Before — hardware video decoding and guest HDR disabled (42.64 seconds):
try-omarchy-without-acceleration-and-hdr.mp4
After — hardware video decoding and native HDR enabled (60.52 seconds):
try-omarchy-4k60-hdr-demo.mp4
These are visual demonstrations, not an isolated decoder benchmark: both acceleration and HDR differ, and the window layouts differ. Both files use the Mac's HDR screen-recording format, including the recording of the SDR guest. Playback appearance depends on the viewer's browser and display. Neither recording measures physical panel luminance or proves frame delivery at 120 FPS.
Implementation
Validation
Development machine: M5 Pro, 18 vCPUs and 12 GiB guest RAM. Measurements are specific to the tested streams and machine.
make testpassed with Python 3.12: 219 Swift tests in 48 suites, 87 guest unit tests, guest contracts, build/cache tests and macOS shell/storage suites. Native SDR-white and client-white policy tests passed separately.Hardware decoding reduces guest CPU work but is not always faster for every codec. The AV1 software result is below real-time 60 FPS; this benchmark uses a different fixture from the Tron recordings.
Remaining validation and tradeoffs
This remains a draft for architecture/implementation review. A full from-source Docker guest build is still blocked because pinned Rust
1:1.98.0-1disappeared from the current Arch ARM repository; the clean-image validation reused the verified existing ttfx package without changing that pin. It does not establish a complete from-source rebuild.HDR uses a private paired virtio extension and an exact
7.2.2-2-aarch64-ARCHkernel module. Optional private CoreDisplay APIs supply only a display capability hint and fall back safely when unavailable. The HDR surface pool adds about 190 MiB at 4K, excluding Metal drawables. Dolby Vision dynamic metadata is not transported. Other Mac generations, external displays, Bluetooth and physical acoustic output need separate validation. The 1 ms audio timer increases requested wakeups while audio is active.See native video and native HDR for contracts, reproduction commands and detailed results.