概述

笔者在涉及RK平台中如下链路时,对drm申请的buffer相关字段有些疑惑。因此写此贴作为一个记录。

mppdec解码 --> rga缩放 --> drm显示

流程解析

如下接口是申请drm类型的dumb。首先需要传入的fd是设备的文件句柄,比如/dev/dri/card0。随后通过drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &arg)申请到一个DUMB的内存块,此时出现了handle,随后又通过drmPrimeHandleToFD获取到一个fd(对应buff_fd)。

static struct bo_new *
bo_create_dumb(int fd, unsigned int width, unsigned int height, unsigned int bpp)
{struct drm_mode_create_dumb arg;struct bo_new *bo;int ret;bo = calloc(1, sizeof(*bo));if (bo == NULL) {fprintf(stderr, "failed to allocate buffer object\n");return NULL;}memset(&arg, 0, sizeof(arg));arg.bpp = bpp;arg.width = width;arg.height = height;ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &arg);if (ret) {fprintf(stderr, "failed to create dumb buffer: %s\n",strerror(errno));free(bo);return NULL;}bo->fd = fd;bo->handle = arg.handle;bo->size = arg.size;bo->pitch = arg.pitch;drmPrimeHandleToFD(fd, arg.handle, 0, &bo->buff_fd);return bo;
}

上述函数执行完毕,我们获取到drm buff的一个handle和一个fd。但是在该drm buff送往drm显示时,还需要再进行一次转换(通过接口drmModeAddFB2 ),需要获取一个fb(对应代码fb_id)。

  kmsmem = calloc(sizeof(KMSMEM), 1);kmsmem->bo = bo_create(self->fd, vinfo->format,vinfo->width, vinfo->height,handles, pitches,offsets, UTIL_PATTERN_TILES);printf("bo handles: %d, %d, %d, %d, ptr %p\n", handles[0],handles[1], handles[2], handles[3], kmsmem->bo->ptr);ret = drmModeAddFB2 (self->fd, vinfo->width, vinfo->height,vinfo->format, handles, pitches,offsets, &kmsmem->fb_id, 0);

在drm送显时,则是传入上文提到的fb,比如如下代码中的fb_id

  ret = drmModeSetPlane (self->fd, self->plane_id, self->crtc_id, fb_id, 0,result.x, result.y, result.w, result.h,/* source/cropping coordinates are given in Q16 */src.x << 16, src.y << 16, src.w << 16, src.h << 16);

总结

上文中涉及drm buff的三个变量:handle,fd,fb;我的理解如下:

  • handle:驱动层的标识符,因此通过drmIoctl像驱动获取到的标识符便为handle形式。
  • fd:用户层的标识符,用户可通过该fd,对buffer进行map处理。在rga处理时,可直接使用drm buff的fd作为接口入参。
    // rk扩展ffmpeg解码器时自定义的结构。代码中的fd就是drmbuff的fd。drm_fram_desc = (AVDRMFrameDescriptor*)frame->data[0];memset(&src_info, 0, sizeof(rga_info_t));src_info.fd = drm_fram_desc->objects[0].fd;src_info.mmuFlag = 1;// 目标为新申请的drm buff的fd,rga缩放后,新的图像存放此处。memset(&dst_info, 0, sizeof(rga_info_t));dst_info.fd = buffer->bo->buff_fd;dst_info.mmuFlag = 1;/********** set the rect_info **********/rga_set_rect(&src_info.rect, 0, 0, srcWidth, srcHeight, srcWidth/*stride*/, srcHeight, srcFormat);rga_set_rect(&dst_info.rect, 0, 0, dstWidth, dstHeight, dstWidth/*stride*/, dstHeight, dstFormat);src_info.rotation = rotate;ret = c_RkRgaBlit(&src_info, &dst_info, NULL);if (ret) {av_log(NULL, AV_LOG_FATAL, "rk rga split func failed!\n");return;}
  • fb:我理解为framebuff的标识符,用于额外封装drm buff为framebuff结构,然后才能通过drm接口送显。之所以封装,是因为framebuff额外提供了当前buff的宽高等信息。

DRM DUMB相关说明相关推荐

  1. DRM dumb,prime介绍

    直接渲染管理器(Direct Rendering Manager)是给予DRI客户端直接访问硬件的内核模块,简称DRM.DRM 中管理内存的模块叫做GEM(Graphics Execution Man ...

  2. 《DRM 专栏》| 彻底入门 DRM 驱动

    https://cloud.tencent.com/developer/article/2021477 前面的 DRM 应用程序系列文章中,我们学习了如何使用 libdrm 接口编写 DRM 应用程序 ...

  3. drm单个framebuffer显示

    Drm 单个buff显示 这章介绍drm的部分的函数和结构体,实现单个frambuffer的显示 drm buff相关结构体 struct buffer object struct buffer_ob ...

  4. DRM (Direct Rendering Manager) 的发展历史

    !!!声明!!! 本文章转自:何小龙 链接:https://blog.csdn.net/hexiaolong2009/article/details/88075520 转载只是为了学习备份. 前言 了 ...

  5. Kindle 电子书相关的工具软件【转】

    这里是与 Kindle 电子书相关的工具软件.它们可以帮助我们解决在日常使用电子书时所可能遇到的问题,比如 kindle 管理工具.kindle 转换工具.kindle电子书制作工具.kindle 推 ...

  6. Android Qcom Display学习(九)

    该系列文章总目录链接与各部分简介: Android Qcom Display学习(零) 最简单的DRM应用程序 (single-buffer)- 学习drm看这个大神的就行 DRM驱动支持MODESE ...

  7. epub是什么文件?epub文件怎么打开?

    EPUB 属于一种可以"自动重新编排"的内容:也就是文字内容可以根据阅读设备的特性,以最适于阅读的方式显示. EPUB 解决了 PDF 和开发人员友好性有关的所有瑕疵.一个 EPU ...

  8. [RK3288][Android6.0] 调试笔记 --- ro.serialno的获取

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 rk3288平台的serial number是由drmservice写进去的,drmservice在r ...

  9. 对国产板子有阴影这些软硬件开源的ARM开发板可以学习Linux驱动

    对国产板子有阴影?这些软硬件开源的ARM开发板可以学习Linux驱动开发 为了点亮一块MIPI屏幕,我们除了要了解MIPI DSI的工作原理之外,大前提要了解整个MIPI DSI图显系统的组成,更需要 ...

最新文章

  1. sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)
  2. python入门作业编程题-Python编程:从入门到实践——【作业】——第六章(字典)...
  3. 分治法:关于选择算法,找最大,找最小,同时找最大和最小,找第二大
  4. react 更新input 默认值setfieldsvalue_值得收藏的React知识点查漏补缺
  5. 一天一个Java基础——序列化
  6. python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法
  7. ML~线性代数~python
  8. 如何使用imageJ绘制热图 伪彩色
  9. matlab仿真整流电路设计,整流电路MATLAB仿真实验
  10. 图片的格式怎么改?教你快速转格式的方法?
  11. 相见恨晚 linux下的c++filt 命令
  12. 兴业研发晨会纪要2008年 10月 30日
  13. 使用超级表格快速创建在线表单(如问卷调查、报名表)
  14. Binomial Showdown
  15. 36艺教育完成3000万元Pre-A轮融资,星火资本投资 1
  16. 227 Entering Passive Mode (xxx,xxx,,xxx,xxx,x)
  17. 这是昨天的内容,就这样慢慢整吧,然后,荒废了好多时间啊!!
  18. 深度:一文看懂Linux内核,Linux内核架构和工作原理详解
  19. vc6 调试 附加到进程 列表空_今天,进程告诉我线程它它它它不想活了
  20. 上手体验华为AI平台ModelArts

热门文章

  1. magisk卸载内置软件_手机刷入面具magisk授权后,ROOT权限经常丢失解决方法
  2. ubifs 分区格式化方法
  3. 【Metal2剖析(三):OIT顺序无关透明渲染[Imageblock]】
  4. PO模式项目实战思路分析
  5. 仿豌豆荚实现android连接pc方法
  6. 让工控机通过笔记本的Wifi实现上网
  7. linux上cgconfig服务,linux系统调优-Cgroups
  8. 领英营销—领英外贸开发客户的方法细节
  9. 2019提前批——拼多多笔试题
  10. 多种语言画玫瑰,总有一款适合你表白