前几章介绍了 context、resource 与 capset 三个静态抽象。GPU 的执行是异步的:命令提交后不会立即完成,Guest 与 Host、CPU 与 GPU 之间需要一套同步原语来协调先后顺序。本章说明 virglrenderer 的 fence 体系:两代 fence 模型、时间线与ring_idx、VMM 获知完成的两种途径、各后端的退役路径,以及基于 sync_file 的显式同步。代码以src/virglrenderer.h、src/virglrenderer.c、src/virgl_fence.c及各后端源码为准。
6.1 为什么需要 fence
virtio-gpu 的命令提交是异步的:
- Guest 将命令写入 virtqueue 后即返回,应用继续执行;
- Host 侧 virglrenderer 解码并提交给 GPU,同样不等待执行完成(见第2章 §2.2);
- 渲染或计算结果要等 GPU 执行完毕后才可用。
因此需要一个完成信号,使 Guest 能够判断:
- 某批命令是否已执行完毕,从而可以复用其占用的资源,或提交显示这一帧;
- 跨 context、跨设备的依赖是否已满足,例如 A 的输出作为 B 的输入。
这