iter4 textured-quad probe — captured 2026-05-19 on ohm
(PineTab2 v2.0, RK3566, Mali-G52 r1 MC1, Mesa 26.0.6, kernel 7.0.0-danctnix1-6)

Source: panvk-bifrost/iter4/{probe_texture.c, .vert, .frag, Makefile}
Deployed to: /tmp/panvk-iter4/
Build: clean

===== RUN #1 (no validation) =====
[step] vkCreateInstance
[step] vkEnumeratePhysicalDevices
WARNING: panvk is not a conformant Vulkan implementation, testing use only.
[info] gpu='Mali-G52 r1 MC1'
[step] vkCreateDevice (+dynamic_rendering chain)
[step] vkCreateImage source texture (4x4 RGBA8 SAMPLED|TRANSFER_DST)
[info] source texture memReq size=4096 align=4096
[step] vkCreateSampler (NEAREST, CLAMP_TO_EDGE)
[step] vkCreateImage color attachment (64x64 RGBA8 COLOR_ATTACHMENT|TRANSFER_SRC)
[step] vkCreateDescriptorSetLayout (1 COMBINED_IMAGE_SAMPLER)
[step] vkCreatePipelineLayout + shaders
[step] vkCreateGraphicsPipelines
[step] record cmd buffer (tex upload + draw + readback)
[step] submit + wait (10s)
[step] invalidate + verify
[info] mismatches=0/4096 sentinel=0 black=0
[PASS] PanVk-Bifrost textured quad: all 4096 pixels match.
RC=0

===== RUN #2 (VK_LAYER_KHRONOS_validation) =====
[no validation warnings/errors]
[PASS]

===== STABILITY: 5 reruns =====
mismatches=0/4096 sentinel=0 black=0   [PASS]
mismatches=0/4096 sentinel=0 black=0   [PASS]
mismatches=0/4096 sentinel=0 black=0   [PASS]
mismatches=0/4096 sentinel=0 black=0   [PASS]
mismatches=0/4096 sentinel=0 black=0   [PASS]

7/7 runs PASS, all 4096 pixels per run match expected modulo-4 tile-repeated pattern.

===== KEY OBSERVATIONS =====

1. Source texture (4x4 RGBA8 SAMPLED|TRANSFER_DST):
     memReq size = 4096 (one page)
     alignment   = 4096
   Just a single Mali page — but 16 logical bytes of pixel data live inside.

2. The Bifrost descriptor model (PANVK_BIFROST_DESC_TABLE_COUNT etc.) handles
   COMBINED_IMAGE_SAMPLER bindings cleanly for the fragment shader stage:
     - VkDescriptorSetLayout creation
     - VkDescriptorPool + AllocateDescriptorSets
     - vkUpdateDescriptorSets with image + sampler
     - vkCmdBindDescriptorSets at graphics bind point
     - shader-side texelFetch resolves to correct GPU memory access

3. Texture upload path (vkCmdCopyBufferToImage):
   - Layout transition UNDEFINED -> TRANSFER_DST_OPTIMAL
   - Linear staging buffer -> optimal-tiled image (Bifrost tile encode)
   - Layout transition TRANSFER_DST_OPTIMAL -> SHADER_READ_ONLY_OPTIMAL
   All round-trip exactly: texels written via staging buffer are read back
   exactly via texelFetch + render + image-to-buffer-copy.

4. No GPU faults, no MMU faults, no validation-layer warnings.

The headline iter4 hypothesis (Bifrost descriptor model fails on first
sampled-image use) did NOT materialize. PanVk-Bifrost's descriptor handling
works for the minimal sampled-texture case.
