目录
1. dma-fence
以高通平台Android系统为依据,介绍内核dma-fence实现机制及dma-fence在Android显示框架内中的作用。
Android 的“显式同步(Explicit Sync)”依赖内核中 dma‑fence 实现,其抽象与 Android Sync 文档一致:sync_timeline / sync_pt / sync_fence。sync_timeline 是单调递增的时间轴,厂商需要为每个驱动实例(如 GL 上下文、显示控制器 DPU、2D blitter 等)提供各自的 timeline;sync_pt 是时间轴上的一个点(Active/Signaled/Error);sync_fence 是若干点的集合,只有当全部点触发时 fence 才算触发,且可作为 sync_file(fd) 在内核/用户态与跨进程间传递。
驱动在提交一个异步作业时,会在其 timeline 上生成一个点(sync_pt)并把它加入一个 fence(或把 fence 与其它点进行 merge);完成时调用 dma_fence_signal() 触发该点(或整条 fence),从而唤醒等待该 fence 的下游用户或子系统。fence 也可以通过 merge 把多个设备的依赖“合并成一个 fd”,只有当全部子依赖 signal 后,合并后的 fence 才变为已触发。
Android显示框架内显示buffer在CPU、GPU、DPU之间的同步就是通过dma-fence机制实现。
2. 显示fence特性
Android显示框架中有三种fence:acqiure-fence、release-fence、present-fence用来确保显示资源在不同硬件、不同状态之间的同步。
在 Android 显式同步中,生产者想要重用(覆盖写)一个 buffer,必须先等到消费者返回的 release fence(out-fence)signal;消费者要读取一个buffer时,需要等待生产者返回acquire fence(in‑fence) sinal ;这正是“生产-消费”双向契约的核心:in‑fence 解决“先写后读”,out‑fence 解决“先读后写”。
在 DRM/KMS框架中:release fence 在 vblank/page‑flip 发生、旧帧退出扫描时 signal;而 present fence 要等到整帧扫描完成才 signal——二者时间点不同,但是高通 sde 的实际代码逻辑中 release fence 和 present fence 都是在 vblank/page-flip 中断中被 signal 的,可以认为是同时产线的。显示 buffer 是否可再次使用与“旧帧是否已不再被读”直接相关,因此看 release fence。present fence逻辑上用于说明当前帧是否已经刷新到显示屏幕,用于应用层控制、判定帧刷新操作。


1309

被折叠的 条评论
为什么被折叠?



