drmModeAtomicCommit如何实现页面翻转
时间: 2024-03-29 10:40:32 浏览: 19
drmModeAtomicCommit函数可以通过更新“plane”的属性来实现页面翻转。在Linux图形系统中,“plane”是指硬件中的可重叠图层,每个“plane”可以包含一个或多个帧缓存,并可以在屏幕上叠加。
页面翻转的过程中,内核会将新的帧缓存与“plane”进行绑定,并将所有需要更新的“plane”属性打包成一个“atomic request”(原子请求)。然后,用户空间调用drmModeAtomicCommit函数将“atomic request”提交给内核,内核将修改“plane”属性以完成页面翻转。
具体实现过程如下:
1. 应用程序调用drmModeSetCrtc函数请求新的帧缓存。
2. 内核将请求加入到队列中,并返回“pending”状态。
3. 应用程序通过drmModeAtomicAlloc函数创建一个新的“atomic request”。
4. 应用程序更新“atomic request”中的“plane”属性,包括绑定新的帧缓存和更新显示位置、缩放等属性。
5. 应用程序调用drmModeAtomicCommit函数提交“atomic request”。
6. 内核检查“atomic request”是否满足所有条件,并将所有需要修改的属性打包成一个事务。
7. 内核将打包后的事务发送给硬件,并启动页面翻转。
8. 当页面翻转完成后,内核会向应用程序发送DRM_MODE_PAGE_FLIP_EVENT事件通知。
需要注意的是,页面翻转需要硬件和内核的支持。只有在支持页面翻转的硬件和内核上,drmModeAtomicCommit才会返回0,并且DRM_MODE_PAGE_FLIP_EVENT事件才会被发送。