mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
[Docs] (Anland): record the lock-screen corruption root cause
This commit is contained in:
@@ -15,6 +15,7 @@ anland 5.x 用 MobileGL:容器(Droidspaces,arch-kde-mgl)里的 Linux cli
|
||||
|
||||
| Commit | 内容 |
|
||||
|---|---|
|
||||
| `cd610934` | **锁屏花屏/桌面变噪点的根因**:`object_death` 记录到达 server 时,`SlotTable::ReleaseTwinByHandle` 遍历进程内**所有** slot table(所有 session 的所有 bucket)释放该 handle 的 twin。handle 是各 client 自己的分配器编号,不同 session 的同一 `{slot, gen}` 是各自不相干的活对象——锁屏 greeter 退出时删除自己的纹理,同时把 KWin 同 handle 的 twin 也释放了(KWin 正在用的 driver 纹理被删,plasmashell 窗口采样到已释放显存:噪点 + 别的窗口的残影)。现在 slot table 记录自己所属 session,释放只走调用线程 session 的 bucket(同 session 的各 share group 都释放;无 session 的线程保持全进程遍历)。顺带修掉另外两类跨 session 隐患:DirectGLES 进程级「容器对象」(scratch/blit/resolve FBO、staging FBO、模拟绘制的 VAO)改为按原生 context 分(`PerNativeContext`/`NativeContextName`,按 context 生命期序号,context 销毁时遗忘);UBO/unpack/upload 三个持久映射 ring 改为每原生 context 一套,帧 fence 完成水位改为「连续」(任一更早的 fence 未 signal 都不前进,fence 环加深到 32 且回绕时等待旧 fence 而非丢弃) |
|
||||
| `4236b42a` | server:配置只在进程内第一个 session 接入时初始化一次——此前每个新 session 接入都重跑 `MG_ConfigLoader::Init()`,它先把 `Transport` 写回 Monolith 再被改回 Spawn,正在 apply 的别的 session 恰好读到就跳过 server stamp,`Fatal{UnmigratedPipeInput, "GetBoundVertexArray@DrawArrays"}` 带走整个 server 进程(整个桌面);转译:保留下来的非零 `layout(index = 1)`(双源混合)在 ESSL 里加 `#extension GL_EXT_blend_func_extended : require`(此前 Adreno 拒绝该 stage,程序整体不画) |
|
||||
| `0b6842ac` | 让 ANGLE 的 GL 后端跑在 MobileGL 上:EGL 声明 `EGL_KHR_platform_gbm`/`EGL_MESA_platform_gbm`(GBM display 当离屏 display,拒绝 gbm 窗口 surface;Chrome 的 Wayland GL 层对每个 display 都标 GBM 平台);平台标 GBM 但 native display 实为 wl_display 时按 Wayland 处理,wl_display 识别兼容自带一份 libwayland 的程序(按接口名 "wl_display" 判断,经 `process_vm_readv` 读,野指针不会崩);实现 `glGetShaderPrecisionFormat`(此前是空 stub,ANGLE 读到 0 精度即拒绝 ES 2.0);`GL_VERSION` 里不再出现 "OpenGL ES" 子串(ANGLE 用子串搜索判断 ES 驱动,"Direct (OpenGL ES) Backend" 让它把 MobileGL 当 ES 驱动、按 ES 扩展名查 BGRA 等能力,Chrome 的 shared image 全部创建失败) |
|
||||
| `47db68d5` | GLX:MobileGL 同时是 glvnd 的 GLX vendor(`__glx_Main`,装成 `/usr/lib/libGLX_mobilegl.so.0`,会话设 `__GLX_VENDOR_LIBRARY_NAME=mobilegl`;此前 X11 客户端经 Xwayland 拿到 Mesa vendor,报 `MESA-LOADER: failed to retrieve device information`);远端 X drawable(pbuffer)每次 `glXSwapBuffers` 回读并用 `xcb_put_image`(按服务器最大请求长度分带)上屏,resize 换新 pbuffer;GLX 出口持流锁;`eglReleaseThread` 在 MobileGL 已被 `eglTerminate` 拆掉后也返回 TRUE(glmark2 退出时的 "eglReleaseThread failed") |
|
||||
@@ -65,7 +66,7 @@ anland 5.x 用 MobileGL:容器(Droidspaces,arch-kde-mgl)里的 Linux cli
|
||||
- 合成成本:每个 Wayland 窗口每帧整幅 glReadPixels(2 MiB 一片)+ KWin 整幅 glTexSubImage,是当前帧率上限。
|
||||
- DirectGLES 里少量进程级「容器」对象(resolve FBO、scratch FBO、XFB helper、timer query 探测)不在 share group 里共享,多 session 交替使用时理论上会拿到别的 context 的名字——尚未观察到症状。
|
||||
- **Chrome 剩余渲染问题**:WebGL 画布不显示(get.webgl.org 的立方体区域空白、aquarium 只有底色,fps 计数正常),工具栏两个扩展图标是黑块;两边日志都无报错,待查(怀疑 shared image 的某种格式/swizzle 或画布合成路径)。
|
||||
- **锁屏界面花屏**:`kscreenlocker_greet`(空闲约 5 分钟自动锁屏)背景是噪点、时钟重复三份,疑似 1x1→2560x1412 resize 后读回尺寸/步长不对;锁屏后只能输密码,复现时用 `loginctl lock-session` / `unlock-session`。
|
||||
- ~~锁屏界面花屏~~ 已修(见上表):复现方式 `kscreenlocker_greet --testing` 起一个测试模式 greeter 再杀掉(本会话的 logind session 类型不支持 `loginctl lock-session`,真锁屏后只能输密码解锁);修复前几乎每次都让桌面/面板变噪点,修复后多次 + 并发 client 压测均正常。定位手段:给 `BackendTextureObject` 记录创建 session,析构时 session 不符就打 `_Unwind_Backtrace` 栈(符号用 NDK `llvm-addr2line` 对未 strip 的 build-android/libMobileGL.so 解)。
|
||||
2. **光标巨大化**:2026-10-02 的 Plasma 会话截图里光标尺寸正常,未再复现;若再现,查 output scale 与 cursor layer 的 buffer scale。
|
||||
3. **CPU blit 禁令**:用户明确要求最终形态上屏路径无 CPU blit——当前 Wayland wl_shm client 走 readback(`32c79f41`),只是过渡。目标:应用窗口内容也由 server 在 GPU 侧直接给 KWin 合成(server 侧 GPU buffer → 同进程共享给 compositor 的 share group → 合成上屏),不经过 CPU 回读。设计要进 11-state-ownership.md 的后续切片。
|
||||
4. **GLX 上屏是 CPU 回读**:每帧整幅 glReadPixels + `xcb_put_image`,同第 3 条的过渡方案;只处理 24/32 位深窗口;直接拿 X 窗口(未经 glXCreateWindow)当 drawable 的 surface 不会随窗口销毁回收。
|
||||
|
||||
Reference in New Issue
Block a user