panvk-bifrost campaigns (r1..r4 Vulkan compositor + r5.video1 Vulkan
video decode) shipped before this repo existed; the deliverable
patches live in marfrit-packages, but the reasoning chain, phase docs,
and source-state evidence lived only in local working trees on the
development host.
This retrofit imports:
- mesa-panvk-bifrost/ — r1..r4 era phase docs (iter1..iter18)
(libmali stub blobs at iter18/blob/ excluded
— 109MB of RE artifacts replaced with a README
pointer)
- mesa-panvk-bifrost-video/ — sibling campaign phase docs + probe
- evidence/ — frozen .tgz source snapshots at each milestone
(basis for the 0005 patch diff generation)
Future iterations should branch off here from day one, so each iter is
a commit rather than a snapshot. See [[feedback-session-local-process-pins]]
for the process drift this retrofit closes.
Total: 1.9 MB across 124 files.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
3.8 KiB
Iteration 4 close — GREEN
Closed 2026-05-19, same session as iter1+2+3.
Locked question
(From phase0_findings_iter4.md)
Sample a 4×4 R8G8B8A8_UNORM source texture (uploaded via staging buffer + vkCmdCopyBufferToImage) in a fragment shader via texelFetch into a 64×64 attachment. Verify every output pixel at (col, row) equals source texel at (col%4, row%4).
Result: GREEN
7/7 runs PASS (1 baseline + 1 validation + 5 stability), all 4096 pixels match the tile-repeated 4×4 pattern. No GPU faults, no validation warnings.
Evidence: phase0_evidence/iter4_texture_run.txt.
What the close tells us
All six hypotheses in phase0_findings_iter4.md were tested. None materialized. The headline hypothesis — that the Bifrost descriptor model would fail first — did not. PanVk-Bifrost's descriptor handling on Mali-G52 r1 v7 works for COMBINED_IMAGE_SAMPLER fragment-stage bindings.
| Hypothesis | Status |
|---|---|
H1: Source texture upload (vkCmdCopyBufferToImage) |
✗ works |
| H2: Layout transition TRANSFER_DST → SHADER_READ_ONLY_OPTIMAL | ✗ works |
H3: VkSampler creation |
✗ works |
| H4: COMBINED_IMAGE_SAMPLER descriptor binding (Bifrost desc table model) | ✗ works |
| H5: NIR lowering for texelFetch on Bifrost | ✗ works |
| H6: Bifrost sampled-image read ISA emission | ✗ works |
Cumulative state (iter1+2+3+4)
PanVk-Bifrost on Mali-G52 r1 v7 (Mesa 26.0.6) is functional for:
- Pure Vulkan 1.0 instance + KHR extension chains
- Compute pipeline + dispatch
- Graphics pipeline + dynamic rendering + tile binning
- Image creation, layout transitions, color attachment
- Storage buffer + uniform sampler descriptor types
- Texture upload (linear buffer → optimal-tiled image)
- Sampled-image read via
texelFetch - All barrier flavors (memory, buffer, image)
- All transfer ops (CopyBufferToImage, CopyImageToBuffer, ClearColorImage)
Combined zero failures across ~28 total runs. The driver gate "not well-tested on v7" remains defensive, not load-bearing.
iter4 in-tree artifacts
iter4/probe_texture.c— texture probeiter4/probe_texture.vert— fullscreen tri (reused)iter4/probe_texture.frag— texelFetch fragiter4/Makefile
Next iter — iter5 lock proposal
The campaign is moving faster than predicted. Two natural next moves:
A. Vertex buffer + UBO (still small step): add VK_BUFFER_USAGE_VERTEX_BUFFER_BIT + bind via vkCmdBindVertexBuffers, add UBO with a transform matrix, render a non-fullscreen triangle that uses both. Stress: vertex input bindings + attribute descriptions (Bifrost differs from Valhall here), UBO descriptor type, push-constant-ish data flow.
B. Skip ahead to a real workload: ship vkcube or vkmark with PAN_I_WANT_A_BROKEN_VULKAN_DRIVER=1 + headless surface, see where they fail under sustained use. This jumps past many minor probes and finds whatever's actually broken in real-world patterns.
Going with A, since the operator's stated goal is TuxRacer-smoothness via Zink-on-PanVk and a sustained-app probe is closer to an iter6+ stress test than a focused iter5 lock. iter5 question:
Render a non-fullscreen colored triangle: vertex shader reads vec2 position + vec3 color from a vertex buffer (3 vertices, 20 bytes each — pos+pad+color), applies a transform matrix from a UBO, outputs interpolated color. UBO holds an identity-with-scale matrix. Render into 64×64 R8G8B8A8_UNORM attachment. Verify: (a) center pixel of the triangle has interpolated color matching the average of the 3 vertex colors, (b) at least one pixel outside the triangle remains in the clear color.
Lock when operator opens iter5.