iter8 Zink-on-PanVk-Bifrost RED finding — captured 2026-05-19 on ohm (PineTab2 v2.0, RK3566, Mali-G52 r1 MC1, Mesa 26.0.6, kernel 7.0.0-danctnix1-6) ===== eglinfo with Zink + PanVk attempted ===== $ sudo -u mfritsche XDG_RUNTIME_DIR=/run/user/1001 WAYLAND_DISPLAY=wayland-0 \ MESA_LOADER_DRIVER_OVERRIDE=zink PAN_I_WANT_A_BROKEN_VULKAN_DRIVER=1 eglinfo WARNING: panvk is not a conformant Vulkan implementation, testing use only. MESA: error: Zink requires the nullDescriptor feature of KHR/EXT robustness2. WARNING: panvk is not a conformant Vulkan implementation, testing use only. MESA: error: Zink requires the nullDescriptor feature of KHR/EXT robustness2. ... OpenGL core profile vendor: Mesa OpenGL core profile renderer: llvmpipe (LLVM 22.1.3, 128 bits) ← FALLBACK OpenGL core profile version: 4.5 (Core Profile) Mesa 26.0.6-arch1.1 RC=0 (but Zink did NOT load — fell back to llvmpipe SW rasterizer) ===== PanVk-Bifrost vulkaninfo confirms robustness2 NOT in extension list ===== $ PAN_I_WANT_A_BROKEN_VULKAN_DRIVER=1 vulkaninfo | grep -iE "robust|nullDescriptor" VkPhysicalDevicePipelineRobustnessPropertiesEXT: present defaultRobustnessStorageBuffers = ROBUST_BUFFER_ACCESS defaultRobustnessUniformBuffers = ROBUST_BUFFER_ACCESS defaultRobustnessVertexInputs = ROBUST_BUFFER_ACCESS defaultRobustnessImages = ROBUST_IMAGE_ACCESS Device extensions present: VK_EXT_image_robustness (different extension) VK_EXT_pipeline_robustness (different extension) VkPhysicalDeviceImageRobustnessFeaturesEXT.robustImageAccess = true VkPhysicalDevicePipelineRobustnessFeaturesEXT.pipelineRobustness = true NOT present: VK_EXT_robustness2 ← what Zink wants VK_KHR_robustness2 ← what Zink wants VkPhysicalDeviceRobustness2FeaturesEXT.nullDescriptor ===== Mesa source: the gate ===== File: ~/src/mesa-ref/mesa/src/panfrost/vulkan/panvk_vX_physical_device.c line 94: .KHR_robustness2 = PAN_ARCH >= 10, line 194: .EXT_robustness2 = PAN_ARCH >= 10, line 590: .nullDescriptor = PAN_ARCH >= 10, Bifrost is PAN_ARCH 6 (G31/G52/G72) or 7 (G52 r1/G76). Both fall OUTSIDE the `>= 10` gate. Mali-G52 r1 on ohm reports as PAN_ARCH=7 (per iter1 driver log: arch=7 in the panvk_physical_device.c switch statement). Valhall (PAN_ARCH=9), Bifrost, and the experimental v14 fifthgen are all denied robustness2 with the same hardcoded gate. ===== Zink's hard requirement ===== File: ~/src/mesa-ref/mesa/src/gallium/drivers/zink/zink_screen.c:3488-3489 if (!screen->info.rb2_feats.nullDescriptor) { mesa_loge("Zink requires the nullDescriptor feature of KHR/EXT robustness2."); ... } No ZINK_DEBUG flag in zink_screen.c:97-127 disables this check. The feature is a hard prerequisite for Zink. ===== NIR side: the feature already plumbs through ===== File: ~/src/mesa-ref/mesa/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c:1309 .null_descriptor_support = dev->vk.enabled_features.nullDescriptor, File: ~/src/mesa-ref/mesa/src/panfrost/vulkan/panvk_vX_shader.c:1355 .robust_descriptors = dev->vk.enabled_features.nullDescriptor, The NIR lowering code already reads `enabled_features.nullDescriptor` — i.e., the plumbing exists per-arch. The gate at line 590 is what blocks the feature from being *enableable* on Bifrost; the underlying lowering machinery is already there and would activate if the feature were exposed. That doesn't guarantee Bifrost's hardware can correctly handle a null descriptor read (the gate may exist *because* Bifrost can't), but iter4 proved descriptor handling works for valid cases — and "null descriptor" mostly means "shader accesses an unbound binding cleanly without GPU fault." ===== Bigger picture ===== This is the campaign's first real finding. PanVk-Bifrost is functionally solid for everything iter1–7 tested, but Zink (and presumably many other Vulkan apps that opt into modern descriptor features) requires extensions that PanVk-Bifrost gates out. For the TuxRacer-via-Zink path, this MUST be fixed before iter9 makes sense.