Linux DRM:PRIME Buffer Sharing 翻译学习

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实现

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值