因此通过设置 DRM_CLIENT_CAP_ATOMIC 这个 flag,来告知 DRM 驱动该应用程序支持 Atomic 操作。 基于之前的 plane-test 的参考代码,我们使用 Atomic 接口来替代原来的 drmModeSetCrtc() 接口,从而通过差异对比来学些 Atomic 接口的操作。 #define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include ...
如果设置这个选项为1,drm驱动框架核心会把原子属性暴露给应用层使用,即设置了这个选项才能使用atomic接口。 第36行和44行,获取某个资源的props指针,后面通过props指针能获取property_id,便于以后设置property_id。 1 2 3 4 5 6 7 8 9 10 11 // 函数原型 extern drmModeObjectPropertiesPtr drmModeObject...
GEMDUMB只支持连续物理内存基于CMA机制实现,用于小分辨率简单场景基于CMA机制实现,用于小分辨率简单场景mini UI的实现,如recovery mode PRIME连续、非连续内存都支持基于DMA-BUF机制,实现buffer共享,用于大内存复杂场景基于DMA-BUF机制,实现buffer共享,用于大内存复杂场景DRM_IOCTL_PRIME_FD_TO_HANDLE FENCEbuffer同步机制基...
由于上面4个 objects 在创建时,它们的 callback funcs 没有赋初值,所以真正的 modeset 操作目前还无法正常执行,不过我们至少可以使用下面这些只读的 modeset IOCTL 了: 示例4 添加FB 和 GEM 支持: #include #include #include #include staticstructdrm_devicedrm; staticstructdrm_planeprimary; staticstructdrm_cr...
//将blob_id赋值给crtc_id的mode属性 drmModeAtomicAddProperty(req, crtc_id, property_mode_id, blob_id); //提交设置的属性 drmModeAtomicCommit(fd, req, DRM_MODE_ATOMIC_ALLOC_MODESET, NULL); DRM_IOCTL(fd, DRM_IOCTL_MODE_ATOMIC, &atomic) ...
│ ├── drm_atomic_uapi.c │ ├── drm_auth.c │ ├── drm_blend.c │ ├── drm_bridge.c--bridge添加、删除、附着、去附着等操作。│ ├── drm_bufs.c │ ├── drm_cache.c │ ├── drm_client.c │ ├── drm_client_modeset.c ...
drm_dbg_atomic(dev, "[OBJECT:%d] has no properties", obj_id); drm_mode_object_put(obj); ret = -ENOENT; goto out; @@ -1432,6 +1434,9 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,prop = drm_mode_obj_find_prop_id(obj, prop_id); ...
使用drmIoctl()创建、映射framebuffer。 // requests#defineDRM_IOCTL_MODE_CREATE_DUMB ...// 创建framebuffer#defineDRM_IOCTL_MODE_MAP_DUMB ...// 映射framebufferintdrmIoctl(intfd,unsignedlongrequest,void*arg) 使用Linux API函数 mmap(),将framebuffer映射到用户空间。
有了各种 funcs 和 helper funcs,我们现在终于可以执行真正的 modeset 操作了。当前支持的 modeset IOCTL: 示例6 将上面的 Legacy code 转换为 Atomic 版本: 重点: 给driver_features 添加上 DRIVER_ATOMIC 标志位,告诉 DRM Core 该驱动支持 Atomic 操作。
使用drmIoctl()创建、映射framebuffer。使用Linux API函数 mmap(),将framebuffer映射到用户空间。加入framebuffer(不是提交显示!)。drmModeAtomicReq保存DRM请求。drmModeAtomicCommit()提交请求。比如,将framebuffer保存的图像提交显示。将framebuffer绑定到plane。程序更新framebuffer,就是更新plane。Linux ...