Native video, decoded on the GPU.
OA now has a correctness-gated Vulkan Video path from compressed packets through native decode and 8-bit or 10-bit YCbCr resources to an application-ready frame—without CPU pixel readback.
Every measured process cleared source cadence
All six admitted streams decoded, converted, and made 288 frames application-ready. The slowest observed process still delivered 1.86× the 60 fps source cadence at 2160p and 3.73× at 1080p. Hardware counters confirmed the selected YCbCr path in every sample, while the forced-compute samples recorded zero hardware conversions and every row recorded zero CPU pixel readback.
Compressed stream
Native decode
YCbCr to RGBA
Application-ready frame
These are unpaced saturation measurements: they establish decode-to-RGBA capacity, not compositor presentation deadlines, end-to-end playback pacing, or single-frame latency.
Decode and conversion capacity
Each cell is the complete observed range across both seven-process execution-order campaigns. The final column uses the slowest value from either conversion path.
| Stream | Hardware YCbCr range | Manual compute range | Slowest / 60 fps |
|---|---|---|---|
| 1080p60 · H.264 High · 8-bit 4:2:0 | 265.845–360.132 fps | 280.137–320.371 fps | 4.43× |
| 1080p60 · H.265 Main · 8-bit 4:2:0 | 327.547–380.627 fps | 254.532–361.939 fps | 4.24× |
| 1080p60 · AV1 Main · 8-bit 4:2:0 | 239.137–305.841 fps | 223.942–321.144 fps | 3.73× |
| 1080p60 · VP9 Profile 0 · 8-bit 4:2:0 | 299.512–422.693 fps | 279.446–394.513 fps | 4.66× |
| 2160p60 · H.265 Main · 8-bit 4:2:0 | 113.387–145.484 fps | 115.426–151.296 fps | 1.89× |
| 2160p60 · AV1 Main · 8-bit 4:2:0 | 113.570–152.079 fps | 111.512–145.570 fps | 1.86× |
Hardware YCbCr and manual compute are both viable
Each fresh process primed one path with 120 untimed frames, rewound the same decoder, then measured 288 frames on each path. A second seven-process campaign reversed the order. Ratios divide hardware-path throughput by manual-compute throughput, so values above 1.0 favor hardware.
| Stream | Hardware first · median · range · MAD | Compute first · median · range · MAD | Result |
|---|---|---|---|
| 1080p60 · H.264 | 1.087× · 0.879–1.222 · 0.028 | 1.090× · 0.901–1.189 · 0.090 | Characterization |
| 1080p60 · H.265 | 1.113× · 0.999–1.269 · 0.062 | 1.152× · 1.036–1.363 · 0.083 | Characterization |
| 1080p60 · AV1 | 1.006× · 0.864–1.318 · 0.130 | 0.937× · 0.788–0.980 · 0.019 | Characterization |
| 1080p60 · VP9 | 1.082× · 0.855–1.202 · 0.110 | 1.032× · 0.882–1.258 · 0.116 | Characterization |
| 2160p60 · H.265 | 0.935× · 0.852–1.062 · 0.079 | 0.972× · 0.918–1.073 · 0.042 | Characterization |
| 2160p60 · AV1 | 1.014× · 0.865–1.123 · 0.076 | 1.017× · 0.780–1.030 · 0.013 | Characterization |
No row is promoted as a stable speedup or regression. All twelve order-specific campaigns exceed the predeclared 15% full-spread gate. The paired medians place hardware YCbCr between 0.935× and 1.152× of manual compute, but those values remain characterization rather than a device-selection policy.
| Path | Current lowering | CPU pixel readback |
|---|---|---|
| Hardware YCbCr | A compute dispatch samples through a Vulkan YCbCr conversion sampler and writes the presentation RGBA image | None |
| Manual compute | A compute dispatch samples Y and UV planes and performs matrix/range reconstruction in shader code | None |
| AV1 hardware YCbCr | A device-local DPB-to-staging copy releases the DPB before sampler conversion; following decode can overlap | None |
| H.264 / H.265 / VP9 hardware YCbCr | Direct coincident-DPB sampling on the measured device | None |
Codec and profile coverage
Codec names do not bypass capability admission. OA queries the live device and accepts only the profiles, chroma formats, bit depths, levels, and picture features the complete path can support honestly.
| Codec | 8-bit coverage | 10-bit coverage | Measured status |
|---|---|---|---|
| H.264 / AVC | Constrained Baseline, Main, and High · 4:2:0 | Not admitted on this device | 1080p60 High sustained |
| H.265 / HEVC | Main · 4:2:0; Range Extensions profile-IDC-4 single-picture subset | Main 10 P010; Range Extensions profile-IDC-4 P010 single-picture subset | 1080p60 and 2160p60 Main 8 sustained; P010 differential verified |
| AV1 | Main · 4:2:0 | Main 10 P010 subset; loop restoration rejected before submission | 1080p60 and 2160p60 Main 8 sustained; P010 differential verified |
| VP9 | Profile 0 · 4:2:0 | Profile 2 P010 single-picture | 1080p60 Profile 0 sustained; P010 differential verified |
The sustained matrix is intentionally 8-bit. Native 10-bit paths are verified through P010 code-value differentials against FFmpeg and CPU color oracles; this checkpoint does not claim sustained HDR or 10-bit playback performance.
Measured-device limits remain explicit
| Boundary | Status on the measured Iris Xe |
|---|---|
| Chroma and depth | 4:2:2, 4:4:4, and 12-bit remain hardware-gated |
| Profiles | H.264 High 4:4:4, H.265 SCC, AV1 High/Professional, and VP9 Profiles 1/3 are not admitted |
| H.265 Main Still Picture | Fixture-gated: installed x265 maps the selection to profile IDC 4 and the QSV/xe stack cannot initialize an honest profile-IDC-3 encode |
| UHD60 H.264 | Rejected: fixture level 5.2 exceeds the driver-reported level-5.1 ceiling |
| UHD VP9 | The checked fixture is rejected by this driver |
Correctness and safety gates
| Gate | Recorded result |
|---|---|
| Release | 41 / 41 TestVideoDecoder cases passed |
| ASAN + leak detection | 41 / 41 cases passed with strict string checks |
| UBSAN | 41 / 41 cases passed with halt-on-error |
| Vulkan validation | Focused UHD AV1 staged hardware/manual conversion passed core, synchronization, and GPU-assisted validation with zero reported errors |
| Path proof | Hardware-dispatch counters in every hardware sample; zero hardware dispatches in every forced-compute sample |
| Benchmark admission | Exact fixture hash, extent, cadence, codec/profile, 288 completed frames, passing test, and zero CPU pixel readback |
Measurement provenance
| Field | Recorded value |
|---|---|
| Source | b6a0dfd3a4086c5f85915c8a040bab95c8f47f53 |
| Executable | bin/release/test/vision/codec/benchVideoRealtimeSHA-256 3a96d6b8321b2b9be6ffbec9f21d35901a6a03a86cd17d02056031808332e748 |
| Build | Release · Clang 22.1.8 · static OA · embedded shaders · Vulkan validation off for timing |
| GPU | Intel Iris Xe Graphics TGL GT2 · PCI 0x9a49 · integrated |
| Driver and API | Mesa 26.1.7-arch1.1 · Vulkan 1.4.354 · conformance 1.4.0.0 |
| Host | Linux 7.1.8-arch1-3 · x86_64 |
| Power | AC · intel_pstate powersave governor · balanced platform profile |
| Protocol | One excluded fresh-process warmup; seven measured fresh processes; 5 s cooldown; 65 C package start gate; median, MAD, and full range; measured starts 51–64 C |
Earlier timing from the session was rejected after concurrent VLC UHD 10-bit playback was disclosed. The published replacement used an uncontended clean detached worktree, primed both paths, retained both execution orders, and reports the remaining spread.
Evidence boundary
This checkpoint qualifies native decode and decode-to-RGBA conversion on one Intel Iris Xe configuration. It is not evidence for remote desktop, compositor scanout, encode, cross-vendor support, universal codec availability, single-frame latency, or universal performance. Runtime capability queries remain authoritative on every device.
Reproduce
Smoke the complete codec matrix before timing. Repeat both pair orders for1080p60-h264, 1080p60-h265, 1080p60-av1,1080p60-vp9, 2160p60-h265, and 2160p60-av1. Require a passing test, a positive hardware-conversion count only on the hardware path, and pixel_readback_bytes=0. A failed 15% spread gate stays characterization.
Video benchmark terminal
cmake --build build/release --target BenchVideoRealtime TestVideoDecoder -j./bin/release/test/vision/codec/testVideoDecoderOA_VIDEO_BENCH_VARIANT=2160p60-av1 \OA_VIDEO_BENCH_PAIR_ORDER=hardware-first \OA_VIDEO_BENCH_PRIME_FRAMES=120 \./bin/release/test/vision/codec/benchVideoRealtime \--gtest_filter=BenchVideoRealtime.DecodePresentYcbcrPair# Publication: wrap the command with tools/diagnostics/oaBench.py.# Use one excluded warmup, seven measured fresh processes, 5 s cooldown,# a 65 C package start gate, and the hardware_over_compute metric.# Repeat both pair orders for every admitted variant.