a4e7d8ab90
panvk-bifrost campaigns (r1..r4 Vulkan compositor + r5.video1 Vulkan
video decode) shipped before this repo existed; the deliverable
patches live in marfrit-packages, but the reasoning chain, phase docs,
and source-state evidence lived only in local working trees on the
development host.
This retrofit imports:
- mesa-panvk-bifrost/ — r1..r4 era phase docs (iter1..iter18)
(libmali stub blobs at iter18/blob/ excluded
— 109MB of RE artifacts replaced with a README
pointer)
- mesa-panvk-bifrost-video/ — sibling campaign phase docs + probe
- evidence/ — frozen .tgz source snapshots at each milestone
(basis for the 0005 patch diff generation)
Future iterations should branch off here from day one, so each iter is
a commit rather than a snapshot. See [[feedback-session-local-process-pins]]
for the process drift this retrofit closes.
Total: 1.9 MB across 124 files.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
88 lines
4.0 KiB
Plaintext
88 lines
4.0 KiB
Plaintext
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.
|