Ping-Pong双任务链设计
执行原子Ping-Pong翻转后,GUI模块手里的影子链会变成GPU的当前链,GPU的当前链会变成GUI的影子链。两者永远不会同时访问一条链,所以任务链本身不会产生撕裂。
TE信号同步
屏幕硬件在每帧开始扫描前会发送一个TE信号,这标志着消隐期的到来。如果每次推屏都是发生在收到TE信号后的消隐期,就能有效避免画面撕裂。
双缓冲流水线
GPU合成的画面不是一整块合成的,而是按行分块的,GPU和LCD永远都在操作不同的块,不会相互干扰。
三者如何配合工作
- 任务链解决的是CPU与GPU的冲突,确保GPU使用数据的时候,CPU也就是GUI线程不会修改。
- TE信号解决的是GPU与屏幕的冲突,确保屏幕使用数据的时候不会被修改。
- 双缓冲流水线解决的是GPU合成和DMA推屏的冲突,确保两者可以并行工作互不干扰。
它们是怎么配合工作的呢?举个例子:
- CPU在影子链上写入任务描述
- CPU写完数据后,调用函数进行原子翻转,刚刚写的影子链变成了当前链
- 并行:翻转完成后,CPU就可以继续写新的影子链了
- TE信号触发,GPU开始逐块合成画面(TE只在每帧第一块触发)
- DMA和GPU交替在不同的缓冲区上工作,比如GPU合成进
bufB,DMA就会给LCD推bufA(双缓冲区)