- app/boot/termux_gpu:glibc 构建 + Termux 且随附 ICD 存在时,在探测前设 VK_ICD_FILENAMES/VK_DRIVER_FILES;用户显式设置不覆盖 - 文档:Mesa 26.2.6 + KGSL 的完整构建/安装/验证步骤(含 shebang、 --wrap-mode=nofallback、C++/链接参数三处坑) - 实测:wgpu 选中 Adreno 840(turnip Mesa 26.2.6),截图首帧 61 ms - README.termux:GPU 标 ✅,MC 标 🟡(glibc JRE+AWT 已验证,GLX 待 GL 构建)
59 lines
2.0 KiB
Rust
59 lines
2.0 KiB
Rust
//! Termux 上自动启用随附的 Vulkan ICD(glibc 侧 turnip,`ull_freedreno.json`)。
|
||
//!
|
||
//! 背景:Termux 软件源里的 glibc Mesa(24.2.6)不认识 Adreno 840,硬件 GPU 需要用
|
||
//! `packaging/docs/termux-glibc-build.md` §5 里自编的 Mesa 26(KGSL)。驱动装在
|
||
//! `$PREFIX/glibc/share/vulkan/icd.d/ull_freedreno.json` 时,这里在探测之前把它设进
|
||
//! `VK_ICD_FILENAMES` / `VK_DRIVER_FILES`,让 `auto` 也能选到 GPU。
|
||
//!
|
||
//! 只在 **glibc 构建**(`target_os = "linux"`)上生效:Termux 原生(bionic)构建的
|
||
//! `target_os = "android"`,glibc 驱动对它没有意义。用户显式设了这两个变量时不覆盖。
|
||
|
||
use std::path::{Path, PathBuf};
|
||
|
||
use unlucky_core::platform::paths::ProcessEnv;
|
||
use unlucky_core::platform::termux;
|
||
|
||
/// 随附 ICD 的相对路径(相对 `$PREFIX`)。
|
||
const ICD_REL: &str = "glibc/share/vulkan/icd.d/ull_freedreno.json";
|
||
|
||
/// 在 GPU 探测之前调用:装了就启用,没装就什么都不做。
|
||
pub(super) fn enable() {
|
||
if !cfg!(target_os = "linux") {
|
||
return;
|
||
}
|
||
if std::env::var_os("VK_ICD_FILENAMES").is_some()
|
||
|| std::env::var_os("VK_DRIVER_FILES").is_some()
|
||
{
|
||
return;
|
||
}
|
||
let Some(prefix) = termux::prefix(&ProcessEnv) else {
|
||
return;
|
||
};
|
||
let icd = icd_path(&prefix);
|
||
if icd.is_file() {
|
||
std::env::set_var("VK_ICD_FILENAMES", &icd);
|
||
std::env::set_var("VK_DRIVER_FILES", &icd);
|
||
}
|
||
}
|
||
|
||
/// `$PREFIX` 下随附 ICD 的路径(纯函数,测试用)。
|
||
fn icd_path(prefix: &Path) -> PathBuf {
|
||
prefix.join(ICD_REL)
|
||
}
|
||
|
||
#[cfg(test)]
|
||
mod tests {
|
||
use super::icd_path;
|
||
|
||
#[test]
|
||
fn icd_path_is_under_the_glibc_prefix() {
|
||
let path = icd_path(std::path::Path::new("/data/data/com.termux/files/usr"));
|
||
assert_eq!(
|
||
path,
|
||
std::path::PathBuf::from(
|
||
"/data/data/com.termux/files/usr/glibc/share/vulkan/icd.d/ull_freedreno.json"
|
||
)
|
||
);
|
||
}
|
||
}
|