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.
