icd_shim: the resolve probe clamps the core version only (replaces #54's extension hiding)
Replaces the extension hiding from GameNative/gamenative-drm#54 with a probe that only clamps the core version.
Mechanism
Once per GPU and process, on the first properties/features query, resolve_probe.rs creates a bare device on the guest's real instance (no extensions, no features, the same chain link the guest's creates use). It resolves each core version's device commands by exact core name through proxy::device_gate, the gate the guest's lookups use, for every version from 1.1 up to min(driver apiVersion, the instance's forwarded apiVersion), then destroys the device. The first version that fails sets the reported apiVersion to the version below it (clamp_api: variant, major and patch kept), and the VkPhysicalDeviceVulkan1xFeatures structs above the clamp read false. Promoted extensions and their structs are left alone.
The probe device enables no extension. Mesa gates a core device command on the instance's apiVersion alone, so a bare device answers the exact core names the same way the guest's device would. It is also the cheapest device to create, and it keeps the WSI-scoped names out of the probe.
Log line, one per GPU and process, ungated:
proxy pd: resolve probe: core version 1.4 (N.N ms)
proxy pd: resolve probe: core version 1.3 (driver 1.4; vkCmdBindDescriptorSets2 unresolved) (N.N ms)
proxy pd: resolve probe: skipped (instance 1.0)
GN_VKSHIM_NO_RESOLVE_PROBE=1 still turns it off.
Removed, and why
Per-extension resolution and hiding: the VK_DEVICE_EXTENSION_COMMANDS table and its generator code, device_ext, the hidden verdict, the enumeration filter, create-time masking and its log line, extension feature zeroing, and their tests and docs. It never fired: RP6, S24 Ultra, Fold 7 and the Honor GT all reported 0 hidden. The Honor failure was a core-version failure. The generator now emits only VK_CORE_DEVICE_COMMANDS, with each version's Vulkan1xFeatures struct. The guest path's full alias-group lookup (other_spellings, added in #54) stays as it was, moved into proxy.rs, its only user.
Cost
One vkCreateDevice/vkDestroyDevice per GPU per process at startup, with its elapsed time on the log line. There is no device at all for 1.0 instances (Wine helpers) or 1.0 drivers, or with the escape variable set. No per-frame code: the hooks read the cached outcome.
Evidence so far
- Honor GT (MagicOS Android 16): Xwayland forwards instance 1.4.315 and Turnip reports 1.4.359, but every 1.4 core name is NULL (the OEM loader hands Turnip an instance below 1.4). The exact-name probe reported
core version 1.3 (driver 1.4; vkCmdBindDescriptorSets2 unresolved), and zink then came up on a 1.3 device. - RP6: gamescope (instance 1.3), Wine helpers (1.0) and Xwayland (1.4) all keep 1.4.
A fresh RP6 A/B (probe cost, no change) and a Honor run on this build follow.
Verify
cargo test -p adrenotools_gamescope(rust:1.90 docker, lld): 113 lib + 2 + 13 integration passgen-vk-dispatch.py --checkup to date- Android release build,
tools/check-exports.shPASS, no libandroid NEEDED