原子提交使用dma_fence示例
时间: 2023-08-03 20:04:14 浏览: 113
以下是一个使用DMA Fence进行原子提交的示例代码:
```c
#include <drm/drm.h>
#include <drm/drm_mode.h>
#include <drm/drm_atomic.h>
#include <linux/slab.h>
void atomic_commit_with_dma_fence(struct drm_device *dev, struct drm_plane *plane, struct dma_fence *fence)
{
struct drm_atomic_state *state;
struct drm_plane_state *plane_state;
int ret;
// 创建原子请求对象
state = drm_atomic_state_alloc(dev);
if (!state) {
printk("Failed to allocate atomic state\n");
return;
}
// 获取当前平面的状态
plane_state = drm_atomic_get_plane_state(state, plane);
if (IS_ERR(plane_state)) {
printk("Failed to get plane state\n");
drm_atomic_state_put(state);
return;
}
// 设置DMA Fence
plane_state->fence = dma_fence_get(fence);
// 将平面状态添加到原子请求中
ret = drm_atomic_set_mode_for_crtc(plane_state, NULL);
if (ret) {
printk("Failed to set mode for crtc\n");
drm_atomic_state_put(state);
return;
}
// 提交原子请求
ret = drm_atomic_commit(state);
if (ret) {
printk("Failed to commit atomic state\n");
drm_atomic_state_put(state);
return;
}
// 等待DMA Fence完成
dma_fence_wait(fence, true);
// 释放DMA Fence
dma_fence_put(fence);
// 释放原子请求对象
drm_atomic_state_put(state);
}
```
这是一个简单的示例,假设你已经获取了DRM设备和平面的引用。在该示例中,我们通过创建一个原子请求对象,并将DMA Fence添加到平面状态中,然后提交原子请求。最后,我们等待DMA Fence完成,并进行必要的清理操作。
请注意,示例中的代码可能需要根据你的具体需求进行适当的修改和扩展。同时,还要确保你的硬件和驱动程序支持DMA Fence功能,并且正确设置了其他相关的参数和状态。
阅读全文