dumb介绍

dumb buffer,一般是指CPU buffer,我们把这个buffer的内容填充,GPU只负责完整显示出来,GPU并不会对dumb buffer做任何加速。

关于dumb名字的由来,可以参照下面文章。
https://blog.csdn.net/hexiaolong2009/article/details/105961192

dumb buffer涉及三个主要操作, create, map, destroy。

dumb使用

dumb的create, map, destroy,三者都是通过drmIoctl调用的,而这个

/* create a dumb scanout buffer */
struct drm_mode_create_dumb {__u32 height;__u32 width;__u32 bpp;__u32 flags;/* handle, pitch, size will be returned */__u32 handle;__u32 pitch;__u64 size;
};/* set up for mmap of a dumb scanout buffer */
struct drm_mode_map_dumb {/** Handle for the object being mapped. */__u32 handle;__u32 pad;/*** Fake offset to use for subsequent mmap call** This is a fixed-size type for 32/64 compatibility.*/__u64 offset;
};struct drm_mode_destroy_dumb {__u32 handle;
};

代码如下:

#include <errno.h>
#include <fcntl.h>
#include <memory.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <xf86drm.h>static int test_dumb(int fd) {struct drm_mode_create_dumb creq = {0};struct drm_mode_destroy_dumb dreq = {0};struct drm_mode_map_dumb mreq = {0};int ret = 0;/* create dumb buffer */creq.width = 1920;creq.height = 1080;creq.bpp = 32;ret = drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);if (ret < 0) {fprintf(stderr, "cannot create dumb buffer (%d): %m\n", errno);return -errno;}printf("dumb created size=%llu, pitch=%d, handle=%d\n", creq.size, creq.pitch,creq.handle);/* prepare buffer for memory mapping */mreq.handle = creq.handle;ret = drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq);if (ret) {fprintf(stderr, "cannot map dumb buffer (%d): %m\n", errno);return -errno;}/* perform actual memory mapping */uint8_t* map =mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, mreq.offset);if (map == MAP_FAILED) {fprintf(stderr, "cannot mmap dumb buffer (%d): %m\n", errno);return -errno;}/* clear the framebuffer to 0 */memset(map, 0, creq.size);for (int i = 0; i < 8; i++) {printf(" 0x%x ", map[i]);}printf("\n");dreq.handle = creq.handle;drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &dreq);printf("dumb destroyed\n");return 0;
}int main(int argc, char** argv) {int fd = open("/dev/dri/card0", O_RDWR);if (fd > 0) {printf("drmOpen Succeed\n");} else {printf("drmOpen failed, fd=0x%x\n", fd);return -1;}test_dumb(fd);close(fd);return 0;
}

然后使用如下命令编译:

gcc dumb.c -I/usr/include/drm/ -ldrm -o dumb

代码里,先打开了/dev/dri/card0设备,然后create了一个dumb buffer,创建完了的dumb buffer,通过handle返回。之后我们就可以通过这个handle来唯一区分这个buffer了。再通过drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq),将buffer请求map,之后调用mmap进行真正的map,这样就可以拿到map出来的虚拟地址。然后可以对这个虚拟地址,进行读和写操作。最后通过这个handle,将整个dumb buffer 销毁掉。

可以看出,dumb buffer,主要是通过drmIoctl函数,第2个参数和第3个参数传递下面表格的参数,进行使用的。

ioctl 结构体
DRM_IOCTL_MODE_CREATE_DUMB struct drm_mode_create_dumb
DRM_IOCTL_MODE_MAP_DUMB struct drm_mode_map_dumb
DRM_IOCTL_MODE_DESTROY_DUMB struct drm_mode_destroy_dumb

而在使用的过程中,通过同一个handle来表示同一个dumb buffer。

libdrm学习-dumb buffer相关推荐

  1. oracle buffer block,8 Oracle深度学习笔记——BUFFER CACHE深入一

    8.Oracle深度学习笔记--BUFFER CACHE深入一 最近项目一直和ORACLE死磕,感觉总是找不到出口,只能多看书少说话了. 先记录多少是多少吧! BUFFER CACHE在ORACLE的 ...

  2. Drm 例程2 双dumb buffer显示

    Drm 例程2 双buffer 显示 显示过程中,drm是通过申请framebuffer 填充其中的dumb的buf来显示的,drmModeAddFB对不同的dumb buff拿到的bufid也不一样 ...

  3. DRM系列(1)之DUMB BUFFER

  4. Linux图形显示DRM框架学习

    一.Direct Rendering Manager(DRM)是linux内核子系统,负责与显卡交互.DRM提供一组API,用户空间程序可以使用该API将命令和数据发送到GPU或者专用图形处理硬件(如 ...

  5. 关于 DRM 中 DUMB 和 PRIME 名字的由来

    前言 在上一篇<DRM驱动程序开发(VKMS)>文章里,我们学习了如何编写一个最简单的 KMS 驱动.而本篇,我将以叙述的形式为大家讲解 DRM GEM 的相关概念,代码留到下一篇进行讲解 ...

  6. DRM dumb,prime介绍

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

  7. DRM GEM 驱动程序开发(dumb)

    前言 在上一篇<关于 DRM 中 DUMB 和 PRIME 名字的由来> 文章中,我们知道了 dumb buffer 名字的由来.本篇,我们将一起来写一个最简单的 GEM 驱动程序. 驱动 ...

  8. DRM DUMB相关说明

    概述 笔者在涉及RK平台中如下链路时,对drm申请的buffer相关字段有些疑惑.因此写此贴作为一个记录. mppdec解码 --> rga缩放 --> drm显示 流程解析 如下接口是申 ...

  9. 6. 彤哥说netty系列之Java NIO核心组件之Buffer

    --日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第六篇. 简介 上一章我们一起学习了Java NIO的核心组件Channel,它可以看作是实体与实体之间的连接,而且需要与Buffer交 ...

最新文章

  1. pagehelper分页
  2. Fort.js – 时尚、现代的表单填写进度提示效果
  3. python比excel优势-python数据分析相对于bi和excel的优势是什么?
  4. 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]…*a[N-1]/a[i];...
  5. (JavaScript)实现在客户端动态改变Treeview节点的选中状态
  6. 20150310-删除数组中原有对象
  7. UVA10945 Mother bear【Ad Hoc】
  8. MyBatis学习后篇
  9. Nginx系列(4):Web服务器分析(理论上)
  10. python增量爬虫_python网络爬虫——增量式爬虫
  11. 山东计算机考研909,山东大学2018年计算机考研909数据结构考试大纲
  12. 在AVD上运行程序时,程序闪退并报错unfortunately,xx has stopped
  13. Pytorch TextCNN实现中文文本分类(附完整训练代码)
  14. linux上ftp登录失败解决办法
  15. Vue高级语法(一) | 自定义指令详解
  16. 正余弦函数的复指数表示
  17. 兄弟姐妹们,有没有啥开源的项目能加一下我吗?
  18. CSS基础- 3.14 定位练习-弹出层
  19. 计算机三级数据库考试题型,计算机三级《数据库技术》考试试题与答案
  20. LeetCode1-340题汇总,希望对你有点帮助!

热门文章

  1. UTM投影分带标准及投影转换
  2. 常见乱码产生原因以及锟斤拷的产生过程
  3. 基于反馈的动态补偿模型
  4. Spring启动执行流程
  5. 钉钉群机器人关键词自动回复_企业微信群机器人怎么用?企业微信群机器人有什么功能?...
  6. C#输入分数自动成绩评级
  7. Skippr – 轻量、快速的 jQuery 幻灯片插件
  8. Window10主硬盘更换及系统重装
  9. 【转】几个期货基本面因子的研究
  10. android wifi增强,Android增强WiFi性能