明白了 fence 的基本原理,我们可以进一步的探索整个 SurfaceFlinger 的中 fence 在其中处于什么角色。
一、流转状态
从启动到屏幕的第一帧的渲染,fence 是不会有任何效果的。因为此时 fence 还没有经过 hwc_set 给 fence 进行赋值。但是到了第二帧开始,已经存在的 Layer 已经经过了 hwc_set 的赋值,存在 Layer 的 releaseFence 中。
SurfaceFlinger 中核心的 4 个流程:
- dequeueBuffer:GraphicBuffer 的出队。
- queueBuffer:GraphicBuffer 的入队。
- updateTexImage:GraphicBuffer 的消费。
- releaseBufferLocked:GraphicBuffer 的释放
下面我们看一下 Fence 在上面几个流程中参与的角色。