iter3 fullscreen triangle 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/iter3/{probe_triangle.c, probe_triangle.vert, probe_triangle.frag, Makefile}
Deployed to: /tmp/panvk-iter3/
Build: clean

===== RUN #1 (no validation layer) =====
$ PAN_I_WANT_A_BROKEN_VULKAN_DRIVER=1 ./probe_triangle

[step] vkCreateInstance (+VK_KHR_get_physical_device_properties2)
[step] vkEnumeratePhysicalDevices
WARNING: panvk is not a conformant Vulkan implementation, testing use only.
[info] gpu='Mali-G52 r1 MC1' apiVersion=1.0.335
[step] vkCreateDevice (+dynamic_rendering chain)
[step] vkCreateImage (64x64 R8G8B8A8_UNORM, COLOR_ATTACHMENT|TRANSFER_SRC)
[info] image memReq size=20480 alignment=4096
[step] vkCreateImageView
[step] vkCreatePipelineLayout + shaders
[step] vkCreateGraphicsPipelines
[step] record (dynamic rendering + draw + copy)
[step] submit + wait (10s)
[step] invalidate + verify
[info] mismatches=0/4096 sentinel=0 cleared_black=0
[PASS] PanVk-Bifrost triangle: all 4096 pixels match.
===== RC=0 =====

===== RUN #2 (VK_LAYER_KHRONOS_validation) =====
[same step trace; no validation warnings/errors]
[info] mismatches=0/4096 sentinel=0 cleared_black=0
[PASS]
===== RC=0 =====

===== STABILITY: 5 consecutive reruns =====
[info] mismatches=0/4096 sentinel=0 cleared_black=0   [PASS]
[info] mismatches=0/4096 sentinel=0 cleared_black=0   [PASS]
[info] mismatches=0/4096 sentinel=0 cleared_black=0   [PASS]
[info] mismatches=0/4096 sentinel=0 cleared_black=0   [PASS]
[info] mismatches=0/4096 sentinel=0 cleared_black=0   [PASS]

7/7 runs PASS, all 4096 pixels per run match the expected gl_FragCoord encoding.

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

1. Device-extension chain enables cleanly with all 5 KHRs:
     VK_KHR_multiview
     VK_KHR_maintenance2
     VK_KHR_create_renderpass2
     VK_KHR_depth_stencil_resolve
     VK_KHR_dynamic_rendering
   plus instance VK_KHR_get_physical_device_properties2 and
   VkPhysicalDeviceDynamicRenderingFeaturesKHR.dynamicRendering = VK_TRUE.

2. Image memReq for 64×64 RGBA8 COLOR_ATTACHMENT|TRANSFER_SRC:
     size      = 20480 (5 pages)
     alignment = 4096
   Raw pixel data: 64*64*4 = 16384 bytes (4 pages).
   The extra page is Mali tile state / AFBC metadata / aux tiling structures
   that PanVk allocates alongside the color attachment.

3. Pixel-position encoding round-trips exactly:
     (0,0)         -> 0xff800000   ✓
     (63,0)        -> 0xff80003f   ✓
     (0,63)        -> 0xff803f00   ✓
     (63,63)       -> 0xff803f3f   ✓
     (32,32)       -> 0xff802020   ✓
     (all 4096)    -> exact match
   gl_FragCoord.xy in pixel-center coords (+0.5) → uvec2 floor gives exact
   pixel index. Vulkan's top-left origin honored. No off-by-half, no Y-flip.

4. Bifrost tile binning works:
     16×16 tile size × 64×64 image = 16 tiles (4×4 grid)
     Each tile flushed cleanly; no missing tile, no swapped tiles, no
     tile-coverage gap at boundaries.

5. No GPU faults, no MMU faults, no kernel-side panfrost messages
   across all 7 runs.
