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.