Skip to content

refactor: OSMesa 从内置剥离为 FCLRendererPlugin 插件,保留原生加载通路 - #1959

Merged
ShirosakiMio merged 5 commits into
mainfrom
feature/osmesa-plugin
Oct 27, 2026
Merged

ShirosakiMio merged 5 commits into
mainfrom
feature/osmesa-plugin

Conversation

@ShirosakiMio

Copy link
Copy Markdown
Collaborator

动机

OSMesa 离屏渲染路径依赖两份独立构建的 Mesa(libOSMesa_8.so=Mesa 23.0.4 zink/freedreno、libOSMesa_81.so=Mesa 21.2.1 virgl),每个 ABI 占 APK 约 26-30MB(三 ABI 共 ~95MB 未压缩,压缩率仅 ~12%)。本 PR 将这些库从 APK 移除,改为由 FCLRendererPlugin 的 freedreno / virgl 分支以插件形式提供(遵循既有"分支即插件"模式,与 zink/angle/gl4es 分支一致)。

改动

删除

  • jniLibs:libOSMesa_8.so、libOSMesa_81.so、libvirgl_test_server.so(arm64/armv7/x86_64)、libvirglrenderer_1.so(armv7/x86_64)
  • RendererManager 内置 VirGL/Freedreno 渲染器条目(旧存档选择经 getRenderer 自动回落 NGGL4ES,RendererSelectDialog 对缺失 id 已有保护)

保留(外部插件的加载通路不动)

  • ctxbridges/osm_bridge、osmesa_loader、virgl/ 全部原生加载代码
  • FCLauncher 内置 VirGL/Freedreno env 分支(Renderer.ID_* 常量保留)
  • v2 插件 pojavRendererId 透传与 LIB_MESA_NAME/MESA_LIBRARY 插件路径前缀逻辑
  • Turnip(libvulkan_freedreno.so)、DriverPlugin/panvk 体系、vkshim、vulkan_check、Zink (Kopper)

插件渲染器通路补全(均为 if-absent,不覆盖插件值)

  • FCLauncher:插件渲染器自动补 MESA_GLSL_CACHE_DIR;POJAV_RENDERER=gallium_virgl 时补 VTEST_SOCKET_NAME
  • FCLauncher + virgl.c:插件目录内存在 libvirgl_test_server.so 时经 VIRGL_TEST_SERVER 绝对路径加载(原生侧默认只在主 APK 目录找)

真机测试暴露的两处修复(diting / SM8475 / Android 15)

  1. dlsym_OSMesa VIRGL 分支裸库名 dlopen("libOSMesa_81.so") 在类加载器命名空间下搜不到插件目录(LD_LIBRARY_PATH 对命名空间无效)→ 改为 LIB_MESA_NAME 优先
  2. virglMakeCurrent 把 libc 的 setbuffer() 函数地址(bionic API 23+ 声明)误当 OSMesa 颜色缓冲传给 OSMesaMakeCurrent,首帧 flush 写只读代码页 SIGSEGV → 改为按宽高分配真实缓冲区(呈现由 vtest 服务端 EGL surface 直出,该缓冲仅为管线要求的可写内存)

兼容性

  • Freedreno 插件在现有 FCL 上即可用(纯 pojavEnv 通路);VirGL 插件需要本 PR 的 FCL(VIRGL_TEST_SERVER/VTEST_SOCKET_NAME 补全)
  • x86 平台无变化(内置时代也没有 OSMesa)
  • Adreno 桌面 GL 推荐路径不变:Zink(Kopper + Turnip)

测试

  • \-Darch=arm64 assembleDebug 编译通过
  • 真机(Xiaomi diting, SM8475)实测:插件发现/加载/LIB_MESA_NAME 解析/VIRGL_TEST_SERVER 加载/OSMesa 上下文创建均验证打通;virgl 稳定性复测进行中

插件侧

  • ShirosakiMio/FCLRendererPlugin 新增 freedreno、virgl 分支(Freedreno:libOSMesa_8.so / VirGLRenderer:libOSMesa_81.so,均含 pojavEnv 与三 ABI 库)

…ibvirgl_test_server、libvirglrenderer_1 与内置 Freedreno/VirGL 渲染器条目,保留全部原生加载通路并为插件渲染器补全 VIRGL_TEST_SERVER/VTEST_SOCKET_NAME/MESA_GLSL_CACHE_DIR 运行时路径
…3+ 声明),首帧 flush 写只读代码页 SIGSEGV;改为按保存的宽高分配真实缓冲区
…keCurrent 守卫跳过本次绑定,避免 OOM 时向 OSMesaMakeCurrent 传 NULL
…/ID_FREEDRENO 分支与无关 VTEST_SOCKET_NAME),删除未引用的 VirGL/Freedreno 字符串资源
@ShirosakiMio
ShirosakiMio merged commit 8a1b8fa into main Oct 27, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant