DRM 的Property IN_FENCE_FD和OUT_FENCE_PTR配合屏幕刷新三帧代码
时间: 2023-08-04 19:03:36 浏览: 166
i915_drm_public.rar_True and False
以下是一个使用 `IN_FENCE_FD` 和 `OUT_FENCE_PTR` 配合屏幕刷新三帧的示例代码:
```c
// 定义变量
drmModeAtomicReqPtr atomic_req;
int in_fence_fds[3];
int out_fence_ptrs[3];
// 创建 DRM Atomic 请求对象
atomic_req = drmModeAtomicAlloc();
// 创建三个 in_fence_fd 和 out_fence_ptr
for (int i = 0; i < 3; i++) {
// 创建 in_fence_fd
in_fence_fds[i] = sync_fence_create("in_fence", 0);
// 添加 IN_FENCE_FD 到 Atomic 请求中
drmModeAtomicAddProperty(atomic_req, crtc_id, IN_FENCE_FD, in_fence_fds[i]);
// 添加 OUT_FENCE_PTR 到 Atomic 请求中
drmModeAtomicAddProperty(atomic_req, crtc_id, OUT_FENCE_PTR, (uint64_t)&out_fence_ptrs[i]);
}
// 提交 Atomic 请求
drmModeAtomicCommit(drm_fd, atomic_req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
// 等待前两帧的刷新完成
sync_wait(in_fence_fds[0], -1);
sync_wait(in_fence_fds[1], -1);
// 进行第三帧的渲染
// 等待第一帧的 out_fence_ptr 完成
sync_wait(out_fence_ptrs[0], -1);
// 清理资源
for (int i = 0; i < 3; i++) {
close(in_fence_fds[i]);
close(out_fence_ptrs[i]);
}
// 释放 Atomic 请求对象
drmModeAtomicFree(atomic_req);
```
请注意,上述代码仅为示
阅读全文