Files
panvk-bifrost/mesa-panvk-bifrost/phase8_iteration4_close.md
T
marfrit a4e7d8ab90 initial seed: retrofit campaign lineage from local working trees
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>
2026-05-23 05:25:37 +02:00

66 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Iteration 4 close — GREEN
Closed **2026-05-19**, same session as iter1+2+3.
## Locked question
(From [phase0_findings_iter4.md](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`](phase0_evidence/iter4_texture_run.txt).
## What the close tells us
All six hypotheses in [phase0_findings_iter4.md](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`](iter4/probe_texture.c) — texture probe
- [`iter4/probe_texture.vert`](iter4/probe_texture.vert) — fullscreen tri (reused)
- [`iter4/probe_texture.frag`](iter4/probe_texture.frag) — texelFetch frag
- [`iter4/Makefile`](iter4/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.