feat(termux): MC 启动接线——Linux arm64 natives + softpipe 子进程环境

- Library::native_classifier:Linux/aarch64 上把 LWJGL3 的 natives-linux
  改写成 natives-linux-arm64(Mojang 清单只有 x86_64)
- install::libraries:arm64 分类器在清单里没有下载信息时,按 Maven 相对路径
  兜底到阿里云镜像(实测 Mojang libraries 404、Aliyun 200);
  单测覆盖 arm64 兜底与 x86_64 不变
- launch::defaults:Termux glibc 构建启动 MC 时默认带
  MESA_LOADER_DRIVER_OVERRIDE=swrast / LIBGL_ALWAYS_SOFTWARE=1(用户可覆盖)
- 文档:JRE patchelf 一次性步骤与接线现状;README 同步
- 验证:patched Temurin java 直接执行;LWJGL arm64+GLFW 探针 gl-ok
This commit is contained in:
AskaEth committed 2026-11-07 09:33:22 +08:00
1 parent 02ed09ae49
commit 7eed6c6261
5 files changed
+179 -26

No files matched your search

+47
View File
@@ -174,6 +174,13 @@ pub fn environment(req: &LaunchRequest, os: OsFamily) -> Vec<(String, String)> {
set_env(&mut env, "MESA_LOADER_DRIVER_OVERRIDE", "llvmpipe");
set_env(&mut env, "GALLIUM_DRIVER", "llvmpipe");
}
// Termux + glibc 构建:termux-x11 下 glibc Mesa 的 zink 卡 DRI3,softpipe 是当前
// 可用路径。放在软件渲染块之后、用户自定义之前(用户显式设置仍可覆盖)。
if cfg!(target_os = "linux")
&& crate::platform::termux::is_termux(&crate::platform::paths::ProcessEnv)
{
apply_termux_gl_defaults(&mut env);
}
if os == OsFamily::MacOs {
if let Some(icd) = &req.renderer.vulkan_icd {
set_env(&mut env, "VK_ICD_FILENAMES", &icd.display().to_string());
@@ -201,3 +208,43 @@ fn set_env(env: &mut Vec<(String, String)>, key: &str, value: &str) {
env.push((key.to_string(), value.to_string()));
}
}
/// Termux(glibc 构建)上的默认 GL 环境:softpipe。
///
/// glibc Mesa 26 的 zink 在 termux-x11 下报 `DRI3 not available`,softpipe 是当前
/// 可用的软件路径;硬件路径等 DRI3 问题解决后再切。
fn apply_termux_gl_defaults(env: &mut Vec<(String, String)>) {
set_env(env, "MESA_LOADER_DRIVER_OVERRIDE", "swrast");
set_env(env, "LIBGL_ALWAYS_SOFTWARE", "1");
}
#[cfg(test)]
mod tests {
use super::apply_termux_gl_defaults;
#[test]
fn termux_gl_defaults_force_softpipe() {
let mut env = Vec::new();
apply_termux_gl_defaults(&mut env);
assert!(env.contains(&(
"MESA_LOADER_DRIVER_OVERRIDE".to_string(),
"swrast".to_string()
)));
assert!(env.contains(&("LIBGL_ALWAYS_SOFTWARE".to_string(), "1".to_string())));
}
#[test]
fn termux_gl_defaults_overwrite_earlier_llvmpipe_choice() {
let mut env = vec![(
"MESA_LOADER_DRIVER_OVERRIDE".to_string(),
"llvmpipe".to_string(),
)];
apply_termux_gl_defaults(&mut env);
assert_eq!(
env.iter()
.find(|(key, _)| key == "MESA_LOADER_DRIVER_OVERRIDE")
.map(|(_, value)| value.as_str()),
Some("swrast")
);
}
}