Files
The412Banner 14f2004927 Pin the bridge rebuilt with 0015
hybris-runtime-4ed93fb9-dda132a6de-qa (DroidDeck-Components run 40284992208).
2026-10-26 07:22:36 +00:00
..
2026-10-26 07:22:36 +00:00

Experimental Qualcomm backends

The Linux backend uses the installed Qualcomm Vulkan HAL through a pinned libhybris ICD. The Android compositor imports gralloc buffers through android_wlegl. Choosing System Qualcomm driver in the runtime driver list also selects the system display driver. Restart the app after changing an already loaded display driver.

Bridge patch for Android 14 loaders

The bridge creates the Vulkan instance through Android's libvulkan.so and then checks that this instance dispatches to the same HAL it loaded itself. Upstream compares only vkGetPhysicalDeviceProperties. Android 14's loader wraps that query (seen on an AYANEO Pocket FIT, Adreno 750, Qualcomm 0.762.24, SDK 34): it resolved into libvulkan.so while vkGetPhysicalDeviceFeatures resolved to the same vulkan.adreno.so entry from both sides, so every session failed with Android instance and configured HAL use different dispatch implementations and vkCreateInstance -9. hybris-patches/0012-android-loader-wrapped-queries.patch accepts the instance when any of five core physical-device queries resolves to the HAL's own entry; another driver matches none. 0013-calibrated-timestamps-khr-alias.patch answers vkGetPhysicalDeviceCalibrateableTimeDomainsKHR and vkGetCalibratedTimestampsKHR with the HAL's EXT entries when it has only those (same signatures and time-domain values). The same Pocket FIT driver offers only VK_EXT_calibrated_timestamps; Zink called the KHR name, the desktop loader found no ICD entry and aborted (ICD associated with VkPhysicalDevice does not support GetPhysicalDeviceCalibrateableTimeDomainsKHR), which took down every OpenGL program, including Steam's update window and the browser's glxinfo check. 0015-placed-memory-dedicated-export.patch gives the placed-memory layer a mode for drivers that report OPAQUE_FD export as dedicated-only (Qualcomm). There, external buffers and images bind only to dedicated exported memory and cannot use the cached host-visible type, so the layer's export of every eligible resource broke DXVK (Failed to bind image memory: VK_ERROR_INVALID_EXTERNAL_HANDLE). In the new mode resources stay native and each host-visible allocation that is not dedicated already is dedicated to a hidden buffer of its size and exported; the driver binds other resources to it, and the dma-buf mapped at Wine's placed address is coherent with the GPU (tested on the Pocket FIT). Without placed mapping, 32-bit DXVK games failed every map (Failed to map Vulkan memory: VK_ERROR_OUT_OF_HOST_MEMORY) because the driver maps above 4 GiB. Qualcomm sessions load the layer with DROIDDECK_EXPERIMENTAL_PLACED_MEMORY=1; it acts only for devices that request VK_EXT_map_memory_placed. 0014-trim-covered-host-memory-types.patch stops reporting host-visible flags on memory types that another host-visible type of the same heap strictly contains (Pocket FIT: types 3-5 next to cached coherent type 6). No buffer or image there may use types 3-5 (buffers report 0x41, optimal images 0x1, linear 0x41), but DXVK 2.4 picks the first type with the requested flags and skipped type 6, so every DXVK title failed its first upload allocation (DxvkMemoryAllocator: Memory allocation failed ... Mem types: 0,6, then a null read in d3d11.dll). Indices and heaps are unchanged; HYBRIS_VULKAN_KEEP_MEMORY_TYPES=1 reports the driver's flags. The bridge is rebuilt with wallentx's builder (tools/hybris at 4ed93fb9, patches 0001-0011) plus these patches on DroidDeck-Components.

Imported AdrenoTools Qualcomm packages

Import a Qualcomm Android driver with Change display driver → Import an AdrenoTools zip…. In Mix and match → Change runtime driver, select its Qualcomm (AdrenoTools, experimental) entry. Previously imported packages appear without reimporting. This selects the package for Linux applications and the system driver for Android presentation. The runtime change applies to the next session; restart DroidDeck if its display driver was already loaded. Changing only the display selection does not change the Linux runtime driver.

Candidates must have vendor: Qualcomm metadata, an installed ARM64 library, and a minApi no newer than the phone. Mesa/Turnip packages are excluded. The runtime setting uses qualcomm-adrenotools:<imported-id>. Deleting the source package clears a matching runtime selection. A selected package that disappears or becomes incompatible outside that removal flow causes an explicit startup error rather than switching drivers silently.

PRoot privately overlays the package HAL at /vendor/lib64/hw/vulkan.adreno.so and its ARM64 companion libraries under /vendor/lib64. Packaged libc++.so is also overlaid at /system/lib64/libc++.so: Android's SP-HAL namespace resolves that dependency from system first. These mounts are repeated in nested application sandboxes and use the running session's selection. Android's instance loader and the bridge must resolve the same HAL; passing only an imported path to HYBRIS_VULKAN_HAL is insufficient. Android core libraries and its Vulkan loader are not replaced. No device system file is modified.

RedMagic 11 Pro hardware verification on 2026-10-24 used the existing v891.7 import. Its HAL SHA-256 is b2c6e92a05d4e6388250f5ec6f94408f2e693cb7fd26274382913ddcb6586108. Vulkan reports Qualcomm 0.891.7, and the GPU fill/copy/readback probe passes. Steam Big Picture reached its library and the installed Windows Isaac rendered through ARM64 Proton. Both Gamescope and the game mapped graphics_driver/v891.7/vulkan.ad891.so, its compiler/dependencies and the bridge ICD. The system HAL SHA-256 remained 16acf005480a071af9452f13d8e9bb9930971488d889ea276f87d73616cfd6f5.

The import's metadata advertises Vulkan 1.4.359, but this device's Linux Vulkan probe actually reports physical-device API 1.3.351, including with implicit layers disabled. The package label is not proof of its exposed API on a particular GPU. Driver identity and API support are separate results. Broader compatibility is untested. Evidence is in build/research/qualcomm/packaged-*, session 2026-10-24-02-steam.

Steam browser hardware-rendering investigation

Games, Gamescope and Android presentation use Vulkan hardware acceleration. Experimental builds also use Steam's regular GPU-enabled browser launch path for both system and imported Qualcomm drivers. This is a shared backend default with no GPU-model allowlist. The helper's SDL_FRAMEBUFFER_ACCELERATION=0 workaround remains scoped to its SDL window surface; it does not disable Chromium GPU compositing. The Adreno 840 browser verification and remaining limits are described below.

Earlier RedMagic 11 Pro/v891.7 trials on 2026-10-24 failed to produce a stable hardware-rendered Steam UI. They tried ANGLE Vulkan and OpenGL/Zink, explicit Chromium backend switches, removing the in-process GPU switch, and removing the SDL workaround. The browser restarted or exited; logs include command-buffer creation and X11 connection errors. Those trials preceded the private Mesa integration. Evidence remains in ignored build/research/qualcomm/cef-gpu-* and cef-trial-*, device sessions 2026-10-24-04-steam through 2026-10-24-08-steam. Chromium/ANGLE switches are documented in ANGLE debugging tips.

On Adreno 740/Qualcomm 0.676.1, session 2026-10-24-13-steam enabled the regular browser GPU path with the private Mesa integration and retained the SDL workaround. Steam reached its visible library and the user confirmed faster interaction, then reported UI corruption. Captures show persistent black rectangles obscuring portions of the library. The browser command line lacked --disable-gpu and --disable-gpu-compositing; its process mapped the Qualcomm HAL, libhybris ICD, private Zink library and Steam's ANGLE libraries, held an open /dev/kgsl-3d0 descriptor, and did not map SwiftShader. Disabling partial swap in session 2026-10-24-14-steam did not remove the visible corruption; that flag is not packaged. Investigation was paused at the user's request to prepare an Adreno 840 test APK. This path is experimental and has not passed rendering acceptance. An explicit BL_STEAM_CEF_SOFTWARE=1 session environment override remains available for diagnosis or fallback.

The GPU path is gated on Zink's OpenGL level. Before Steam starts, droiddeck-session reads Zink's maximum core profile version with glxinfo -B; below 4.0, or when the version cannot be read, the browser starts with -cef-disable-gpu and the log says why, for example == steam: browser software compositing (Zink offers OpenGL 3.2; GPU compositing needs 4.0). Setting BL_STEAM_CEF_SOFTWARE to 0 or 1 skips the gate. On the vivo V2243A (Adreno 740, system driver 0.676.1) Zink reaches OpenGL 3.2 and GPU compositing left the library without its background, tabs and parts of covers, with stale regions while moving between items. Software compositing rendered it correctly. Disabling the compat layer's shader rewrites, Zink's render-pass tracking, compact descriptors, threaded GL, Mesa's no-error mode or command reordering, or forcing synchronous Zink flushes, did not change the corruption, and the runtime from before the zero-copy work showed it too. The Adreno 840 with v891.7 reaches OpenGL 4.6 and keeps GPU compositing.

Qualcomm sessions also leave the Steam client CPU affinity unrestricted by default, preserving explicitly saved overrides. The previous SM8550 default pinned Steam, its browser and Gamescope to one core. In Qualcomm sessions the affinity loop applies client masks only to Steam and its browser; other sessions still pin Gamescope with them. A startup recording after that fix showed the complete six-second DroidDeck animation followed by the library; a brief initial white window remained before playback.

Pixmap binding without DRI3

The subsequent Adreno 840/v891.7 test APK failed during browser startup. Tracing isolated xcb_dri3_buffer_from_pixmap from Mesa's Kopper texture-from-pixmap path: the GPU supports DMA-BUF, but the nested X11 server does not advertise DRI3. XCB closed that connection with XCB_CONN_CLOSED_EXT_NOTSUPPORTED, causing the later Fatal IO error 11 in XGetWindowAttributes. Gamescope faulted after Steam exited. Disabling GL threading did not help. Forcing ANGLE Vulkan instead failed with EGL_BAD_CONFIG.

zink-pixmap-without-dri3.patch checks both GPU DMA-BUF capability and the server's DRI3 extension before pixmap import. When import is unavailable, it allocates a normal GPU texture and uses Mesa's existing pixmap pixel-copy update path. Other GPU rendering remains accelerated. No X11 extension or Vulkan capability is fabricated. The check is shared across GPU models and both Qualcomm driver sources.

Verification on RedMagic 11 Pro/Adreno 840 with the imported v891.7 driver:

  • pixmap_probe.c binds a 17×9 X11 pixmap to a GPU texture, checks two different image contents and verifies all 306 GPU readback pixels on a server without DRI3. The original libraries returned black pixels; the patched libraries pass. Build it with cc -O2 pixmap_probe.c -o pixmap-probe -lGL -lX11, then run inside the selected Qualcomm session.
  • Steam reaches its visible library, opens its main menu and survives a session restart. Device sessions are 2026-10-24-29-pixmap-probe, 2026-10-24-30-steam and 2026-10-24-31-steam.
  • Chromium SystemInfo.getInfo reports GPU compositing and rasterization enabled. Its renderer is ANGLE (Mesa, zink Vulkan 1.3(Adreno (TM) 840 (QUALCOMM_PROPRIETARY)), OpenGL 4.6 (Core Profile) Mesa 26.2.3); WebGL independently reports the same hardware path. No software-browser override or tracing preload is used.

Evidence is retained under ignored build/research/qualcomm/adreno840. The earlier Adreno 740 corruption requires retesting with this patch; this result does not validate every Adreno model, driver version or game.

Browser descriptor selection

Opening a game's details and gear menu exposed another Adreno 840/v891.7 failure after startup was fixed: controls were displaced and the menu's backdrop covered only part of the window. Chromium's offscreen screenshot was correct, but the X11 pixmap and displayed frame were corrupt. Apitrace captured both correct and corrupt frames. Disabling GL threading, partial swaps, pipeline optimization or renderpass tracking did not fix it.

The controlled descriptor-mode test reproduced corruption with ZINK_DESCRIPTORS=lazy and rendered the same page and menu correctly with ZINK_DESCRIPTORS=auto alone (session 2026-10-24-57-steam). The Qualcomm webhelper branch in droiddeck-steam-taskset now selects auto. Zink chooses descriptor buffers when its capability checks permit them and otherwise retains its supported fallback. This applies to system and imported Qualcomm sessions without a GPU-model list. It does not establish that drivers which fall back to lazy descriptors are fixed.

The packaged APK was installed and checked without agent environment overrides or tracing preloads in session 2026-10-24-59-steam. The game page, gear menu and Properties page rendered correctly. The browser's actual process environment contained ZINK_DESCRIPTORS=auto; its maps contained the imported v891.7 HAL and private Zink. Chromium reported GPU compositing and rasterization enabled on Adreno 840. Evidence is under build/research/qualcomm/adreno840, including descriptors-auto*, nogeneral* (a failing control), and packaged-*. Adreno 740 requires retesting; the underlying lazy-descriptor failure has not been reduced to a standalone Mesa test.

runtime.json pins the downloaded bridge and WSI archives, the locally built private Gamescope binary and corresponding source archive, and every private Mesa runtime file. fetch_runtime.py checks these pins before Gradle stages them. Missing or mismatched build outputs are downloaded from the pinned builds archive, which DroidDeck-Components builds from this tree on ARM64 CI (tools/qualcomm-runtime, Arch Linux ARM) and publishes as a qualcomm-runtime release. Qualcomm's proprietary device libraries are loaded from the phone and are not included in these archives. The WSI archive is wallentx's release, mirrored unchanged into the same Components release after its SHA-256 and size are checked; mirrored_from in runtime.json keeps the original URL. The libhybris bridge is rebuilt on DroidDeck-Components (build-hybris-runtime.yml) with wallentx's builder at the same revision plus hybris-patches; provenance.previous_build keeps wallentx's original build. gamescope.patches records the patch series the pinned Gamescope was built from, and tools/tests/test_qualcomm_gamescope_sync.py fails when a patch in gamescope-patches or tools/gamescope/patches changes without a rebuild. The bridge archive includes its licenses, source snapshot and patches.

The same lock pins a vendor-neutral X11 WSI layer and upstream Gamescope shader source. build_shaders.py applies constant-yuv-samplers.patch and builds six replacement SPIR-V modules with the configured NDK's glslc. It builds a small ARM64 glibc Vulkan layer using the NDK compiler without Android runtime linkage. The layer matches the six original Gamescope module fingerprints before substituting a shader; ordinary applications use the WSI/compatibility layers instead. Source archives, patches and licenses are packaged with the runtime. The patch can also be applied during a full Gamescope source build.

Qualcomm 0.842.44 traps in its LLVM shader compiler when Gamescope dynamically indexes YUV sampler arrays. The constant-index switch preserves the eight-layer selection. The inner X11 WSI layer uses shared-memory copies; this is a compatibility path with additional CPU and memory-bandwidth cost. Steam additionally needs a larger glibc.rtld.optional_static_tls reserve because it loads the Bionic TLS bridge late.

The private Gamescope is built from Valve revision 8f212644c46460549035971ab914421180f61a7c with the regular DroidDeck patches, the additional patches in gamescope-patches (nested SDL swapchain and refresh handling, DMA-BUF import memory types, SHM/cursor presentation), the constant YUV sampler patch, and gamescope-no-dmabuf.patch. The additional integration patches were taken from wallentx/DroidDeck revision c931c4de26339c50f92354b9b06f6fdf7043ca8f. The corresponding source is packaged in the APK. Upstream integration references:

The Wayland receiver and external-image ownership handling were adapted from wallentx/DroidDeck revision c931c4de26339c50f92354b9b06f6fdf7043ca8f. The protocol retains its Collabora/libhybris license in app/src/main/cpp/waylandcomp/protocols/wayland-android.xml.

Older Qualcomm capabilities

The connected vivo V2243A/SM8550 reports Adreno 740, proprietary Qualcomm 0.676.1, and physical Vulkan API 1.3.128. It lacks VK_EXT_external_memory_dma_buf and VK_KHR_maintenance5. The original private Gamescope refused to create a device. The new Gamescope permits missing DMA-BUF only for Vulkan swapchain backends, disables DMA-BUF format advertisement and imports/exports, and uses synchronous SHM uploads. Non-swapchain backends retain their requirement. GPU composition and Android hardware-buffer presentation remain Vulkan operations.

Mesa 26.2.3 made maintenance5 mandatory for Zink. zink-optional-maintenance5.patch restores the earlier optional extension check, preserves point-size shader stores without that feature, and omits the maintenance5 buffer-view usage structure when unsupported. The private build uses the same Mesa release as the installed runtime, exposes a distinct GLVND vendor, and includes only Zink as its Gallium driver. qualcomm-gl.sh selects its libraries for applications and Mangoapp in Qualcomm sessions. It does not change the Vulkan device's reported features or enable software rendering. This does not establish full OpenGL conformance or game compatibility.

Hardware verification on 2026-10-24 installed the full-runtime development APK and reached the visible Steam Big Picture library on this Adreno 740. Steam and Gamescope mapped /vendor/lib64/hw/vulkan.adreno.so through the bridge; Steam also mapped the private GLX vendor and libgallium-26.2.3.so. egl_probe.c reported OpenGL 3.2 Compatibility Profile, rendered a triangle through zink Vulkan 1.3(Adreno (TM) 740 (QUALCOMM_PROPRIETARY)), and verified all 256 readback pixels. Evidence is under ignored build/research/qualcomm/adreno740, initially device session 2026-10-24-05-steam, followed by the browser GPU trial described above. Games have not been verified on this phone. The later DRI3 pixmap fix has been verified on Adreno 840 as described above, but not yet on this Adreno 740.

Build the private components on ARM64 Linux with their normal development dependencies (GCC/C++, Meson, Ninja, pkg-config, Wayland/X11/SDL2 headers, Vulkan headers, glslang, and Mesa's Python Mako/packaging/PyYAML, Flex and Bison requirements):

python3 tools/qualcomm/build_gamescope.py
python3 tools/qualcomm/build_zink.py
python3 tools/qualcomm/build_wsi.py

The recipes pin upstream source revisions and retain local outputs under build/qualcomm-gamescope, build/qualcomm-zink/runtime and build/qualcomm-wsi. build_wsi.py takes the WSI source from the pinned WSI archive in build/qualcomm-cache, so stage it once with fetch_runtime.py first. Update runtime.json from the produced build.json hashes after deliberately rebuilding a component. The APK check verifies the pinned Gamescope, its source archive, WSI files, and private Mesa files alongside the full Linux runtime and all add-on packs. Native build outputs are prerequisites, just like the other prepared runtime components.

Zero-copy game presentation

Proton games in Qualcomm sessions present through Gamescope's WSI layer instead of X11 shared memory when the driver can export LINEAR DMA-BUFs. The Steam client, its browser and other session programs keep WSI_X11_FORCE_SHM=1 and DISABLE_GAMESCOPE_WSI=1; the Proton wrapper's bl_present drops both for the game only when DROIDDECK_QUALCOMM_ZERO_COPY=1. Set BL_QUALCOMM_SHM=1 in the session environment to keep games on the shared-memory path regardless.

droiddeck-session sets DROIDDECK_QUALCOMM_ZERO_COPY from droiddeck-qualcomm-caps, which runs once per session through the bridge ICD and the session's layers, so an imported AdrenoTools driver is judged rather than the system one. Its driver checks are saved in $XDG_CACHE_HOME/droiddeck/qualcomm-caps.json and reused while the driver file (by SHA-256), the selected driver, the bridge build, the layers and the script are unchanged; Gamescope's zwp_linux_dmabuf_v1 is checked every session, and failed probes are never saved. The Steam browser's OpenGL check (glxinfo -B) is saved the same way in qualcomm-gl. Zero-copy is enabled only when all of these hold:

  • The driver offers VK_KHR_external_memory_fd, VK_EXT_external_memory_dma_buf, VK_KHR_image_format_list and VK_KHR_external_fence_fd.
  • LINEAR B8G8R8A8_UNORM images are exportable as DMA-BUF colour attachments and importable as sampled images.
  • A device with those extensions, VK_KHR_swapchain and VK_EXT_swapchain_maintenance1 with its feature (which Gamescope's WSI layer forces on) is created through the session's layers, and a LINEAR image's dedicated memory is exported with vkGetMemoryFdKHR. The WSI layer implements the swapchain extensions without listing them, so only device creation confirms them.
  • Gamescope's Wayland display offers zwp_linux_dmabuf_v1.

Any failure, timeout or crash leaves games on SHM. With Performance mode on, the session log also says which of its parts reach games: on SHM only the unpaced release and Wine's window-check cache apply, because Gamescope's WSI layer is not used. The session log records the result, for example == qualcomm: zero-copy off: missing VK_EXT_external_memory_dma_buf; Gamescope offers no linux-dmabuf (Adreno (TM) 740, driver 0.676.1).

The Qualcomm HAL used for development has DMA-BUF export but no VK_EXT_image_drm_format_modifier, and Android has no DRM device. The WSI layer is therefore rebuilt with its Wayland backend and wsi-patches:

  • 0001 allocates swapchain images in the driver as LINEAR images with exportable dedicated memory, exports them with vkGetMemoryFdKHR, takes offset and stride from vkGetImageSubresourceLayout, and sends them as LINEAR zwp_linux_dmabuf_v1 buffers. The modifier extension is no longer required at vkCreateDevice. X11 DRI3 keeps its previous behavior.
  • 0002 removes the __STDC_VERSION__ workaround that GCC 16 rejects.
  • 0003 opens /dev/dma_heap/system read-only, the only access Android grants apps.
  • 0004 exposes vkAcquireNextImage2KHR on Vulkan 1.0 devices; Gamescope's WSI layer acquires every image through it.
  • 0005 keeps devices without the Wayland backend's extensions usable. Upstream fails vkCreateDevice for any instance that enables VK_KHR_wayland_surface (Zink always does) when an extension is missing. Calibrated timestamps are now optional because only present timing uses them. When the remaining requirements are missing, the device is created without them, Wayland surfaces report no presentation support, and swapchain creation on them fails. Other platforms keep the upstream behaviour.

gamescope-linear-dmabuf.patch makes the private Gamescope create a version 3 linux-dmabuf global without a DRM device (wlroots otherwise creates none), advertise LINEAR beside the implicit layout, and import LINEAR buffers as LINEAR images. Without modifiers the stride cannot be imposed, so an import is refused when the buffer's offset or stride differs from the driver's own LINEAR layout.

Verification on 2026-10-24 used the RedMagic 11 Pro, Adreno 840 and the imported v891.7 driver at 1590x720. vkcube (600 frames, uncapped mailbox) went from 131.5 to 198.0 fps; its own CPU time fell from 1.15 s to 0.23 s, Xwayland from 1.64 s to 0.69 s and Gamescope from 6.88 s to 4.00 s. DRAGON BALL: Sparking! ZERO at 60 fps was launched from the same installed APK after a 60-second Steam settle, with only BL_QUALCOMM_SHM toggled, and sampled over the same 12-second startup window: Gamescope used 0.35 cores against 0.43 and 0.44 over two shared-memory runs, Xwayland 0.14 against 0.20, and the game 1.28 against 1.21 and 1.22. Average GPU load ranged from 5% to 13% across these runs and does not separate the paths at this phase. The startup logos rendered correctly and the performance overlay hooked DXVK directly. Gamescope's remaining extra cost comes from its SDL backend, the nested-swapchain copy and bridged Vulkan calls. vkcube in FIFO mode presented 169.5 fps against a 144 Hz output, so FIFO pacing through this path still needs checking. Native Linux games are not covered by the Proton wrapper.

Compat-layer image-bounds rewrite

Qualcomm sessions set HYBRIS_VULKAN_COMPAT_IMAGE_BOUNDS=0. The bridge's VK_LAYER_HYBRIS_compat enables this pass by default, although it ports a Mali+DXVK workaround (Vortek's removeImageBoundCheck). After any OpSampledImage or OpImageFetch, it replaces the zero false operand of the next OpSelect with its true operand without checking that the select uses the image result. DXVK writes HLSL comparisons and step() as select(cond, 1.0, 0.0), so those collapse to the constant 1.0.

On RedMagic 11 Pro/Adreno 840 with v891.7, DRAGON BALL: Sparking! ZERO rendered its main-menu scene with a red cast. Replaying the pass over the 479 shaders DXVK compiled up to that menu rewrote 112 of them at 205 selects; 148 of those selects do not depend on any image read. The same scene rendered correctly with only this switch set to 0, and with every compat shader rewrite disabled. Other compat passes keep their defaults. Evidence is under ignored build/research/sparking-zero/red2-*.

APK packaging

Prepare the normal Linux runtime inputs and all five published add-on packs before compiling. Every APK must support a fresh installation; installed-device runtime reuse is prohibited by AGENTS.md and rejected by Gradle.

./gradlew.bat -PskipRust=true :app:assembleDebug

The build verifies prepared inputs before packaging, then verifies the APK and the add-on pack contents after assembly. Published packs are downloaded on first use using their pinned checksums, as in the normal DroidDeck build. The base Linux root filesystem is downloaded during setup. The package follows droiddeck.debugApplicationIdSuffix in local.properties.

Device probes

probe.py runs inside the Linux runtime with the bridge ICD selected. It submits a GPU fill and copy, then checks 4 KiB of host-visible readback. It requires Python 3 and the runtime's normal glibc Vulkan loader.

ahb_probe.c is an Android NDK program. Pass the newly built libdroiddeckwayland.so as its argument, with that library's dependencies on LD_LIBRARY_PATH. It allocates and writes an Android hardware buffer, imports it through the compositor's system Qualcomm Vulkan path, and verifies all 4096 converted BGRA pixels by GPU readback.

The two standalone probes do not establish presentation or game compatibility. Additional RedMagic 11 Pro tests confirmed Wayland vkcube presentation, a visible X11 cube through Gamescope, accelerated Zink OpenGL 4.6, Steam Big Picture startup and rendering in the installed Windows version of The Binding of Isaac through ARM64 Proton. Qualcomm 0.842.44, Adreno 840 and Vulkan 1.4.295 were identified under the development app's UID; the game's process maps also contain the Qualcomm HAL and the selected bridge ICD. Steam's browser uses software compositing and its SDL window-surface workaround is scoped to the webhelper. Broader game compatibility and performance remain untested. A Gamescope shutdown SIGSEGV after child exit is still under investigation. Device evidence is retained in build/research/qualcomm/, including isaac-driver-maps.txt, isaac-qualcomm.png and isaac-menu-qualcomm.png.

Credits

  • wallentx (wallentx/DroidDeck) did the libhybris groundwork this backend is built on:
    • the libhybris runtime builder and its DroidDeck patches (tools/hybris at 4ed93fb9), and the prebuilt bridge runtime release and component CI that runtime.json pins (mirrored unchanged on DroidDeck-Components);
    • the prebuilt ARM WSI layer release (wsi-abe5861.zip) that the rebuilt layer starts from;
    • the system-driver staging approach of SystemVulkanDriver (component preparation, ICD manifest and per-process environment) on wallentx/powervr at c931c4de;
    • the android_wlegl hardware-buffer receiver and external-image ownership handling;
    • the Gamescope and session integration patches (revisions c931c4de and af320dd8).
  • JeezDisReez identified the fix for the red graphics in DRAGON BALL: Sparking! ZERO: turning off the compat layer's image-bounds rewrite on Adreno.
  • The bridge builds on libhybris and taowen/libhybris; imported drivers use the AdrenoTools package format from bylaws/libadrenotools.