From aaba33949918eecf53a858f30cbc9a45a0434696 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Sat, 7 Nov 2026 07:57:24 +0800 Subject: [PATCH] =?UTF-8?q?docs(termux):=20GPU=20=E7=BB=93=E8=AE=BA?= =?UTF-8?q?=E8=90=BD=E5=9C=B0=E2=80=94=E2=80=94glibc=20=E4=BE=A7=E8=A2=AB?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E7=89=88=E6=9C=AC=E6=8C=A1=E4=BD=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实测结论: - glibc Vulkan loader + 自写 ICD 能加载 - Termux glibc Mesa 24.2.6 不认识 Adreno 840(chip 0x44050A31 unsupported) - Arch vulkan-freedreno 26.2.6 能加载但 Linux/DRM 构建找不到设备(缺 KGSL, /dev/dri 对 untrusted_app 被 SELinux 拒绝) - GPU 变体会打印具名错误并自动降级 tiny-skia README.termux 同步:GPU 标 ⛔、MC 走 glibc JVM 的结论与后续路线 --- README.termux.md | 16 ++++++++++------ packaging/docs/termux-glibc-build.md | 26 ++++++++++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/README.termux.md b/README.termux.md index d4175f9..1a58b7b 100644 --- a/README.termux.md +++ b/README.termux.md @@ -14,8 +14,8 @@ | 横屏适配 | ✅ | 默认窗口按 X 屏幕等比自适应(`source=termux-screen`) | | Java 发现 | ✅ | `JAVA_HOME`/PATH + `$PREFIX/lib/jvm` 扫描 | | Java 自动安装 | ✅ | `ull java install 17` 由内置镜像装完 openjdk-17(约 20 s) | -| GPU(wgpu) | ⏳ | bionic 侧 Vulkan/turnip 已验证;glibc 侧变体待构建验证 | -| Minecraft 运行 | ⏳ | bionic JVM 加载不了 glibc natives;计划走 glibc JVM | +| GPU(wgpu) | ⛔ | glibc 侧 Mesa 24.2.6 不支持 Adreno 840;Arch 26.2.6 缺 KGSL。CPU 渲染可用 | +| Minecraft 运行 | ⏳ | 无官方 Android natives;计划走 glibc JVM(见下) | ## 快速开始 @@ -34,13 +34,17 @@ DISPLAY=:0 ./unlucky-launcher-iced --software-renderer ## 已知边界 - 仅单机(OnePlus 15 / Android 17)验证,试验级、不在发布矩阵内。 -- GUI 只验证了 CPU 渲染;GPU 变体需要 glibc 侧 Vulkan 栈。 -- 装好 JDK ≠ 能跑 MC:MC 的 LWJGL natives 是 glibc `.so`,bionic、JVM 加载不了。 +- **GPU**:bionic 侧 zink/turnip 可用;glibc 侧被驱动挡住——Termux 的 glibc Mesa 24.2.6 + 不认识 Adreno 840,Arch 的 26.2.6 是 Linux/DRM 构建、缺 KGSL。需要 Mesa 26+ 的 + glibc+KGSL 构建;在那之前用 CPU(tiny-skia)。GPU 变体会自动降级,不会崩。 +- **MC**:Android 原生 natives 走不通(LWJGL 没有官方 Android/bionic 产物,且 GLFW 的 + 窗口模型与 termux-x11 的 X11 不兼容)。可行路线是 glibc JVM(Temurin linux-aarch64 + + glibc Mesa),让 MC 的 Linux natives 在 glibc 进程里正常加载。 - Termux 上三条测试失败是环境差异(`/proc/*/children`、长路径脱敏、mtime flaky), PC 的 Linux CI 不受影响。 ## 后续 -1. glibc 侧 GPU(wgpu)变体与取证 -2. MC 运行链:glibc JVM(Temurin linux-aarch64 + glibc Mesa)或 proot 方案 +1. Mesa 26+ 的 glibc/KGSL 构建(解锁 GPU) +2. MC 运行链:glibc JVM(Temurin linux-aarch64 + glibc Mesa);proot 作为备选 3. 剪贴板/IME 在 termux-x11 下的行为验证 diff --git a/packaging/docs/termux-glibc-build.md b/packaging/docs/termux-glibc-build.md index 3a2a8a7..fe8c84f 100644 --- a/packaging/docs/termux-glibc-build.md +++ b/packaging/docs/termux-glibc-build.md @@ -169,23 +169,37 @@ DISPLAY=:0 .gnu/target/release/unlucky-launcher-iced \ - 已实测:`ull java install 17` 从 SAU 镜像装完 `openjdk-17`(含 `openjdk-17-x`), 约 20 秒;`ull java list` 随后列出 `[system]` 的 17。 -## 5. GPU(未在 glibc 侧验证) +## 5. GPU(已排查,当前被驱动挡在 glibc 侧) termux-x11 的 X 客户端**可以**走硬件:本机 bionic 栈实测 `glxinfo -B` → `zink Vulkan 1.4 (Adreno 840 (MESA_TURNIP))`、`Accelerated: yes`, `vulkaninfo` 中 Adreno 设备带 `VK_KHR_xcb_surface` / `VK_KHR_xlib_surface`。 -要用到 ULL 的 glibc 构建上,还需要 glibc 侧的 Vulkan 栈 -(`vulkan-icd-loader-glibc`、`mesa-vulkan-icd-freedreno-glibc`,可加 `swrast-glibc` 兜底), -并用默认 feature(带 `gpu`)重编: +glibc 侧已把链路搭好并实测到具体阻塞点: + +1. **loader 正常**:`vulkan-icd-loader-glibc` + 自写 ICD JSON 能加载 ICD。 +2. **Termux 的 glibc Mesa 太旧**:`mesa-vulkan-icd-freedreno-glibc` 是 24.2.6(2024), + `vulkaninfo` 报 `chip_id = 44050A31, gpu_id = 6860 is unsupported` + (Adreno 840 不在该版本的支持表里)。 +3. **Arch 的新驱动也走不通**:`vulkan-freedreno 26.2.6`(Arch Linux ARM)能加载、 + 但它是 Linux/DRM 构建,找不到设备——Android 的 GPU 走 KGSL,而 + `/dev/dri` 对 `untrusted_app` 被 SELinux 拒绝(`ls /dev/dri` → Permission denied, + 设备节点本身是 `crw-rw-rw-`)。 + +结论:glibc 侧要用硬件 GPU,需要一个 **Mesa 26+ 的 glibc 构建且带 Android/KGSL 后端**; +现有包都缺一半。在那之前用 CPU(tiny-skia)。 + +GPU 变体仍可构建并验证降级链: ```sh -cargo ... build --release -p unlucky-app-iced # 不加 --no-default-features +cargo ... build --release -p unlucky-app-iced # 默认 feature,带 wgpu VK_ICD_FILENAMES="$PREFIX/glibc/share/vulkan/icd.d/freedreno_icd.aarch64.json" \ +VK_DRIVER_FILES="$VK_ICD_FILENAMES" \ DISPLAY=:0 .gnu/target/release/unlucky-launcher-iced --renderer=gpu ``` -这一步尚未在本仓库验证;没配好时用 `--software-renderer` 回退即可。 +没有可用驱动时它会打印具名错误并**自动降级**到 tiny-skia(同一进程不能重建事件循环, +降级走 respawn),所以 GPU 变体在只有 CPU 的环境里也能跑。 ## 6. 已知边界