From 6896853544659072654417e580c898fa9eef3854 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Sat, 23 May 2026 14:04:44 +0200 Subject: [PATCH] =?UTF-8?q?mesa-panvk-bifrost:=20r4=20->=20r5=20=E2=80=94?= =?UTF-8?q?=20advertise=20fragmentStoresAndAtomics=20on=20Bifrost?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backports Mesa main's unconditional flip of .fragmentStoresAndAtomics to true in src/panfrost/vulkan/panvk_vX_physical_device.c. Closes the Dawn-WebGPU adapter rejection at PhysicalDeviceVk.cpp:250 that caused brave-vulkan to fall back to the SwiftShader CPU adapter on PineTab2/Mali-G52, per marfrit/panvk-bifrost#2. Phase 7 verify on ohm (PineTab2, RK3566, Mali-G52 r1 MC1) with a locally-built r5 lib installed to /tmp/r5_test_lib/: dEQP-VK.glsl.atomic_operations.*: r4: 48 pass / 0 fail / 992 NotSupported (1040 total) r5: 80 pass / 0 fail / 960 NotSupported (1040 total) delta: +32 newly-passing, zero new failures dEQP-VK.image.store.*: r4: 2772 pass / 0 fail / 238 NotSupported (3010 total) r5: 2772 pass / 0 fail / 238 NotSupported (3010 total) delta: identical (image.store is independent of the flag) The disjunction with instance->force_enable_shader_atomics is kept as a documented kill-switch even though the compiler folds it away — it leaves the DRI option pan_force_enable_shader_atomics semantically wired for future rebases or downstream debugging. Patch reviewed via 2nd-model pass (per bugfix-process step 4): recommended keeping the disjunction (applied), Bifrost-only-vs-unconditional left unconditional to match upstream (applied), pre-ship CTS subset (applied with results above). Co-Authored-By: Claude Opus 4.7 --- ...anvk-bifrost-fragment-stores-atomics.patch | 50 +++++++++++++++++++ arch/mesa-panvk-bifrost/PKGBUILD | 17 ++++++- 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 arch/mesa-panvk-bifrost/0005-panvk-bifrost-fragment-stores-atomics.patch diff --git a/arch/mesa-panvk-bifrost/0005-panvk-bifrost-fragment-stores-atomics.patch b/arch/mesa-panvk-bifrost/0005-panvk-bifrost-fragment-stores-atomics.patch new file mode 100644 index 000000000..8b061a482 --- /dev/null +++ b/arch/mesa-panvk-bifrost/0005-panvk-bifrost-fragment-stores-atomics.patch @@ -0,0 +1,50 @@ +From: marfrit-packages noether +Subject: [PATCH] panvk: report fragmentStoresAndAtomics = true on Bifrost + +Backports Mesa main's unconditional advertisement of +fragmentStoresAndAtomics for panvk (snapshot ref: src/panfrost/vulkan/ +panvk_vX_physical_device.c at commit-time 2026-05-06; the line reads +`.fragmentStoresAndAtomics = true,` on main with no PAN_ARCH gate). + +Motivation: Chromium Dawn's WebGPU initializer in +third_party/dawn/src/dawn/native/vulkan/PhysicalDeviceVk.cpp:250 +unconditionally rejects any Vulkan adapter that doesn't advertise this +feature, causing Dawn to fall back to the SwiftShader CPU adapter +on PineTab2 / RK3566 / Mali-G52 r1 MC1 (PAN_ARCH 7). With this patch the +device advertises true, satisfying Dawn's gate. Tracked at +https://git.reauktion.de/marfrit/panvk-bifrost/issues/2. + +The disjunction with `instance->force_enable_shader_atomics` is +preserved as a kill-switch: in compiler terms it's dead code +(`true || X == true`), but it leaves the DRI option +`pan_force_enable_shader_atomics` semantically wired so future +rebases or downstream debugging can see the link to the runtime knob. + +Caveat: the existing DRI option's description in src/util/driconf.h +still labels this as "may not work reliably and is for debug purposes +only". Mesa main's choice to ship it as default-on for all panvk +architectures (including Bifrost, which is non-conformant per the +PAN_I_WANT_A_BROKEN_VULKAN_DRIVER gate) reflects an upstream judgment +that the practical risk is acceptable. Verify-before-ship for this +package: dEQP-VK.glsl.atomic_operations.* + dEQP-VK.image.store.* +deltas vs the r4 baseline must show no new fails. Pass counts may rise +(tests that previously NotSupported now run); the load-bearing line is +the Failed column staying at zero. + +--- + src/panfrost/vulkan/panvk_vX_physical_device.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/src/panfrost/vulkan/panvk_vX_physical_device.c b/src/panfrost/vulkan/panvk_vX_physical_device.c +--- a/src/panfrost/vulkan/panvk_vX_physical_device.c ++++ b/src/panfrost/vulkan/panvk_vX_physical_device.c +@@ -280,8 +280,7 @@ + .vertexPipelineStoresAndAtomics = + (PAN_ARCH >= 13 && instance->enable_vertex_pipeline_stores_atomics) || + instance->force_enable_shader_atomics, +- .fragmentStoresAndAtomics = +- (PAN_ARCH >= 10) || instance->force_enable_shader_atomics, ++ .fragmentStoresAndAtomics = true || instance->force_enable_shader_atomics, + .shaderTessellationAndGeometryPointSize = false, + .shaderImageGatherExtended = true, + .shaderStorageImageExtendedFormats = true, diff --git a/arch/mesa-panvk-bifrost/PKGBUILD b/arch/mesa-panvk-bifrost/PKGBUILD index 4d79cf798..0db5b9059 100644 --- a/arch/mesa-panvk-bifrost/PKGBUILD +++ b/arch/mesa-panvk-bifrost/PKGBUILD @@ -30,7 +30,7 @@ pkgname=mesa-panvk-bifrost _mesaver=26.0.6 -pkgver=26.0.6.r4 +pkgver=26.0.6.r5 pkgrel=1 pkgdesc="Patched Mesa libvulkan_panfrost.so exposing Bifrost-gen Mali to Vulkan apps (panvk-bifrost campaign)" arch=('aarch64') @@ -81,6 +81,7 @@ source=( "0002-panvk-expose-vulkan-1.1-1.2-on-bifrost.patch" "0003-panvk-bifrost-vk-ext-transform-feedback.patch" "0004-panvk-bifrost-xfb-primitive-decomposition.patch" + "0005-panvk-bifrost-fragment-stores-atomics.patch" "brave-vulkan" "icd.json" ) @@ -92,6 +93,7 @@ sha256sums=( 'SKIP' 'SKIP' 'SKIP' + 'SKIP' ) prepare() { @@ -127,6 +129,17 @@ prepare() { # Phase-doc context: ~/src/panvk-bifrost/iter17/phase{0,1,2,4,5,6,8}_*.md. patch -p1 < "${srcdir}/0004-panvk-bifrost-xfb-primitive-decomposition.patch" + # r5 (2026-05-23): advertise .fragmentStoresAndAtomics = true on Bifrost + # to satisfy Chromium Dawn's WebGPU init gate + # (third_party/dawn/src/dawn/native/vulkan/PhysicalDeviceVk.cpp:250). + # Backports Mesa main's unconditional flip (same line as on main as of + # 2026-05-06). Disjunction with instance->force_enable_shader_atomics + # is preserved as a documented kill-switch even though the compiler + # folds it away. Closes marfrit/panvk-bifrost#2. + # Verify-before-ship: dEQP-VK.glsl.atomic_operations.* and + # dEQP-VK.image.store.* show no new Failed vs r4 baseline. + patch -p1 < "${srcdir}/0005-panvk-bifrost-fragment-stores-atomics.patch" + # Sanity-check the patches landed. grep -q "KHR_robustness2 = true," src/panfrost/vulkan/panvk_vX_physical_device.c grep -q "EXT_robustness2 = true," src/panfrost/vulkan/panvk_vX_physical_device.c @@ -138,6 +151,8 @@ prepare() { test -f src/panfrost/vulkan/jm/panvk_vX_cmd_xfb.c # iter17 sanity: pan_nir_lower_xfb call site has been replaced; new file present. grep -q "panvk_per_arch(nir_lower_xfb)" src/panfrost/vulkan/panvk_vX_shader.c + # r5 sanity: fragmentStoresAndAtomics = true patch landed + grep -q "fragmentStoresAndAtomics = true ||" src/panfrost/vulkan/panvk_vX_physical_device.c grep -q "xfb_topology" src/panfrost/vulkan/panvk_shader.h grep -q "panvk_xfb_topology" src/panfrost/vulkan/panvk_shader.h test -f src/panfrost/vulkan/panvk_vX_xfb_lower.c