* Please use drm_gem_object_get() to acquire and drm_gem_object_put_locked() * or drm_gem_object_put() to release a reference to a GEM * buffer object. */structkrefrefcount;/** * @handle_count: * * This is the GEM file_priv handle count of this object. * * Each handle also...
给driver_features 添加上 DRIVER_GEM 标志位,告诉 DRM Core 该驱动支持 GEM 操作; dumb_create 回调接口用于创建 gem object,并分配物理 buffer。这里直接使用 CMA helper 函数来实现; fb_create 回调接口用于创建 framebuffer object,并绑定 gem objects。这里直接使用 CMA helper 函数实现。 fops 中的 mmap 接口...
.mmap = drm_gem_cma_mmap, }; static struct drm_driver mygem_driver = { .driver_features = DRIVER_GEM, .fops = &mygem_fops, .dumb_create = drm_gem_cma_dumb_create, .gem_vm_ops = &drm_gem_cma_vm_ops, .gem_free_object_unlocked = drm_gem_cma_free_object, .name = "my-gem"...
GEM 提供了 object 创建和销毁的代码,由于用户层能够打开的文件描述符数量不能超过 1024,因此 GEM 定义 handle 以实现对 object 的引用,这类似于文件描述符。还可以为GEM object分配一个uint32_t类型的name,它的生命周期和 object 保持同步。 kernel定义的GEM object数据结构如下:/** * Buffer objects are often...
给driver_features 添加上 DRIVER_GEM 标志位,告诉 DRM Core 该驱动支持 GEM 操作; dumb_create 回调接口用于创建 gem object,并分配物理 buffer。这里直接使用 CMA helper 函数来实现; fb_create 回调接口用于创建 framebuffer object,并绑定 gem objects。这里直接使用 CMA helper 函数实现。
上图蓝色部分则是对物理硬件的抽象,黄色部分则是对软件的抽象。虚线以上的为drm_mode_object,虚线以下为drm_gem_object。 之前曾对这些 objects 做过简要介绍,这里有必要再强调一下这些 objects 的概念: 这些objects 之间的关系: 通过上图可以看到,plane 是连接 framebuffer 和 crtc 的纽带,而 encoder 则是连接 ...
->drm_mode_object_register 以CMA分配方式为例,用户空间对DRM设备的read/write/ioctl都会落到如下函数集中: #define DEFINE_DRM_GEM_CMA_FOPS(name) \ static const struct file_operations name ={\ .owner =THIS_MODULE,\ .open =drm_open,\
1.1 object 创建 GEM object 在创建的同时,会按照页对齐分配内存空间。应用层通过调用 ioctl DRM_IOCTL_MODE_MAP_DUMB 来触发 kernel 创建 GEM object。 输入 需指定要创建内存 buffer 所需的 bpp、width、height 参数。 memset(&arg,0,sizeof(arg)); ...
(fd,DRM_IOCTL_MODE_CREATE_DUMB,&create);/* bind the dumb-buffer to an FB object */bo->pitch=create.pitch;bo->size=create.size;bo->handle=create.handle;drmModeAddFB(fd,bo->width,bo->height,24,32,bo->pitch,bo->handle,&bo->fb_id);/* map the dumb-buffer to userspace */map....
GEM还允许两个或者更多的用户空间进程使用相同的DRM设备(操作相同的DRM驱动)并在进程间分享GEM object。GEM 的handle是每个进程本地唯一的32位整数,并且数值在其他进程中可重复使用,因此这个handle不适合共享。因为共享操作需要一个全局的命名空间,GEM通过使用GEM name全局句柄来提供一个命名空间。GEM name是由相同的DRM...