PRIME 是 drm 中的跨设备缓冲区共享框架,最初是为 OPTIMUS 系列的多 gpu 平台创建的。对于userspace,PRIME 缓冲区是基于 dma-buf 的文件描述符。
概述和驱动程序接口
和GEM全局名称类似,PRIME文件描述符也用于跨进程共享buffer对象。不同的是PRIME文件描述符提供了额外的安全保障:由于文件描述符必须显式的通过UNIX domain sockets发送,以便在应用程序之间共享,因此,不能像全局唯一的GEM名称那样猜测PRIME文件描述符。
支持PRIME API的驱动程序必须在struct drm_driver的driver feature成员变量中设置DRIVER_PRIME标志位,并需要实现结构体中的prime_handle_to_fd和prime_fd_to_handle函数
DRIVER_PRIME标志位在v5.4中被移去
int (*prime_handle_to_fd)(struct drm_device *dev,
struct drm_file *file_priv,
uint32_t handle,
uint32_t flags,
int *prime_fd);
int (*prime_fd_to_handle)(struct drm_device *dev,
struct drm_file *file_priv,
int prime_fd,
uint32_t *handle);
这两个operations完成了PRIME文件描述符fd和handle之间的互相转换。驱动必须使用kernel dma-buf buffer共享框架管理PRIME文件描述符。与mode setting类似,API PRIME对于底层的buffer对象是不可见的,只要handle是一个32bit无符号整形数。
非GEM驱动必须自己实现这两个操作,而对GEM驱动程序而言,则必须使用提供的helper functions drm_gem_prime_handle_to_fd() 和drm_gem_prime_fd_to_handle()。这两个helper function依赖于gem_prime_export和gem_prime_import,这两个operation一个用来实现从GEM对象创建一个dma_buf实例(dma-buf框架中的exporter角色),一个用来实现从一个dma-buf实例创建一个GEM对象(dma-buf框架中的importer角色)。
struct dma_buf * (*gem_prime_export)(struct drm_device *dev,
struct drm_gem_object *obj,
int flags);
struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
struct dma_buf *dma_buf);
这两个operation是支持PRIME的GEM驱动必须要实现的operation。
prime_handle_to_fd / prime_fd_to_handle 必须使用drm_gem_prime_handle_to_fd和drm_gem_prime_fd_to_handle来实现,
gem_prime_export和gem_prime_import默认使用drm_gem_prime_export和drm_gem_prime_import实现