zwp_linux_dmabuf_v1 matrix: modifiers, present sinks (CAMetalLayer, framebufferd, IOMFB, AHB), Mode A vs Mode B proofs.

Canonical matrix for zwp_linux_dmabuf_v1 on every Wawona target. Complements iland and Mode A and Mode B. Engineering source: linux-dmabuf-zero-copy.md.

Goal: one wl_buffer object, no CPU blit on GPU sessions, every client backend (EGL, Vulkan WSI, DRM/KMS, waypipe) and every present sink on that OS.

This is not Linux kernel dma-buf on Apple/Android. iLand emulates KMS/GBM over IOSurface (Apple) / AHardwareBuffer (Android). Never open /dev/dri or /dev/kgsl.

Modifier convention

OSAdvertiseImport
Apple (macOS / iOS family except watchOS)High-bit modifier 0x8000_0000_0000_0000 + IOSurface idIOSurfaceLookup
AndroidSame high-bit + AHB idAHB registry
LinuxDRM_FORMAT_MOD_LINEAR + real modifiersGBM import of the fd
watchOSDo not register zwp_linux_dmabuf_v1SpriteKit of wl_shm only

Never advertise DRM_FORMAT_MOD_LINEAR on Apple or Android.

Present sinks

SinkTarget / modeNotes
CAMetalLayermacOS Mode A; iOS/iPadOS/visionOS/tvOS Mode ADefault in-window GPU path
framebufferdmacOS Mode B ClassicPage-flip is the IOSurface; no extra blit
IOMobileFramebufferiOS/iPadOS TrollStore and Sileoldid entitlements; never in store link
ANativeWindow / SurfaceAndroid Mode A and Home Mode BAHB import then present
Host GBM/EGLLinuxReal dma-buf fd
SpriteKitwatchOSSHM upload only

macOS Mode A must stay green while Classic and TrollStore sinks land. IOMFB is Mode B only. See Desktop and iland.

Client backends (iLand)

BackendDone means
Wayland-EGLSwap posts IOSurface/AHB dmabuf wl_buffer
Vulkan Wayland WSIVK_KHR_wayland_surface shim; vkcube leaves KMS host
DRM/KMS/GBMSame IOSurface/AHB as dmabuf export
wl_shmSoftware fallback only (allowed; log fallback_shm)

Waypipe GPU transport follows the same import path. User overview: Graphics, Waypipe.

Completion gates

A GPU session is green only when structured logs show copy=zero for create → import → present. copy=cpu or unexpected fallback_shm is red.

Catalog zwp_linux_dmabuf_v1 stays Partial until the proof matrix has log + screenshot (or explicit N/A) under Wawona/.agent-device/test-artifacts/dmabuf/.

Logging schema (wwn.dmabuf)

FieldMeaning
opbind, modifier_ad, feedback, add_plane, create, create_immed, import, present, fallback_shm
os / sinkapple_metal, framebufferd, iomfb, ahb_surface, linux_gbm, watch_spritekit
modifierhex
backing_idIOSurface id / AHB id / drm name
formatfourcc
copyzero or cpu
clientopengl-cube, weston-simple-egl, vkcube, waypipe, nested weston/niri
RUST_LOG=wwn.dmabuf=trace,linux_dmabuf=trace
WAYLAND_DEBUG=1   # on the client
adb logcat -s WawonaDmabuf

Mode A vs Mode B

Mode A and Mode B are separate proofs. A Classic or TrollStore green cell does not promote the store IPA. Store CI must grep-fail Mode B / IOMFB symbols.

Jailbreak proof for iOS Desktop uses a vphone-cli jb guest (real iOS kernel VM), not the Xcode Simulator.

Hard rejects

  • LINEAR ads on Apple/Android
  • Fake dmabuf global on watchOS
  • Real kernel DRM / KGSL
  • Mode B / IOMFB in store IPA
  • Marking catalog Functional from a unit test alone