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.