任务链、TE信号与双缓冲:GUI渲染同步的三层保障

Ping-Pong双任务链设计

执行原子Ping-Pong翻转后,GUI模块手里的影子链会变成GPU的当前链,GPU的当前链会变成GUI的影子链。两者永远不会同时访问一条链,所以任务链本身不会产生撕裂。

TE信号同步

屏幕硬件在每帧开始扫描前会发送一个TE信号,这标志着消隐期的到来。如果每次推屏都是发生在收到TE信号后的消隐期,就能有效避免画面撕裂。

双缓冲流水线

GPU合成的画面不是一整块合成的,而是按行分块的,GPU和LCD永远都在操作不同的块,不会相互干扰。

三者如何配合工作

  • 任务链解决的是CPU与GPU的冲突,确保GPU使用数据的时候,CPU也就是GUI线程不会修改。
  • TE信号解决的是GPU与屏幕的冲突,确保屏幕使用数据的时候不会被修改。
  • 双缓冲流水线解决的是GPU合成和DMA推屏的冲突,确保两者可以并行工作互不干扰。

它们是怎么配合工作的呢?举个例子:

  1. CPU在影子链上写入任务描述
  2. CPU写完数据后,调用函数进行原子翻转,刚刚写的影子链变成了当前链
  3. 并行:翻转完成后,CPU就可以继续写新的影子链了
  4. TE信号触发,GPU开始逐块合成画面(TE只在每帧第一块触发)
  5. DMA和GPU交替在不同的缓冲区上工作,比如GPU合成进 bufB,DMA就会给LCD推 bufA(双缓冲区)