libdrm学习-dumb buffer
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相关推荐
- oracle buffer block,8 Oracle深度学习笔记——BUFFER CACHE深入一
8.Oracle深度学习笔记--BUFFER CACHE深入一 最近项目一直和ORACLE死磕,感觉总是找不到出口,只能多看书少说话了. 先记录多少是多少吧! BUFFER CACHE在ORACLE的 ...
- Drm 例程2 双dumb buffer显示
Drm 例程2 双buffer 显示 显示过程中,drm是通过申请framebuffer 填充其中的dumb的buf来显示的,drmModeAddFB对不同的dumb buff拿到的bufid也不一样 ...
- DRM系列(1)之DUMB BUFFER
- Linux图形显示DRM框架学习
一.Direct Rendering Manager(DRM)是linux内核子系统,负责与显卡交互.DRM提供一组API,用户空间程序可以使用该API将命令和数据发送到GPU或者专用图形处理硬件(如 ...
- 关于 DRM 中 DUMB 和 PRIME 名字的由来
前言 在上一篇<DRM驱动程序开发(VKMS)>文章里,我们学习了如何编写一个最简单的 KMS 驱动.而本篇,我将以叙述的形式为大家讲解 DRM GEM 的相关概念,代码留到下一篇进行讲解 ...
- DRM dumb,prime介绍
直接渲染管理器(Direct Rendering Manager)是给予DRI客户端直接访问硬件的内核模块,简称DRM.DRM 中管理内存的模块叫做GEM(Graphics Execution Man ...
- DRM GEM 驱动程序开发(dumb)
前言 在上一篇<关于 DRM 中 DUMB 和 PRIME 名字的由来> 文章中,我们知道了 dumb buffer 名字的由来.本篇,我们将一起来写一个最简单的 GEM 驱动程序. 驱动 ...
- DRM DUMB相关说明
概述 笔者在涉及RK平台中如下链路时,对drm申请的buffer相关字段有些疑惑.因此写此贴作为一个记录. mppdec解码 --> rga缩放 --> drm显示 流程解析 如下接口是申 ...
- 6. 彤哥说netty系列之Java NIO核心组件之Buffer
--日拱一卒,不期而至! 你好,我是彤哥,本篇是netty系列的第六篇. 简介 上一章我们一起学习了Java NIO的核心组件Channel,它可以看作是实体与实体之间的连接,而且需要与Buffer交 ...
最新文章
- pagehelper分页
- Fort.js – 时尚、现代的表单填写进度提示效果
- python比excel优势-python数据分析相对于bi和excel的优势是什么?
- 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]…*a[N-1]/a[i];...
- (JavaScript)实现在客户端动态改变Treeview节点的选中状态
- 20150310-删除数组中原有对象
- UVA10945 Mother bear【Ad Hoc】
- MyBatis学习后篇
- Nginx系列(4):Web服务器分析(理论上)
- python增量爬虫_python网络爬虫——增量式爬虫
- 山东计算机考研909,山东大学2018年计算机考研909数据结构考试大纲
- 在AVD上运行程序时,程序闪退并报错unfortunately,xx has stopped
- Pytorch TextCNN实现中文文本分类(附完整训练代码)
- linux上ftp登录失败解决办法
- Vue高级语法(一) | 自定义指令详解
- 正余弦函数的复指数表示
- 兄弟姐妹们,有没有啥开源的项目能加一下我吗?
- CSS基础- 3.14 定位练习-弹出层
- 计算机三级数据库考试题型,计算机三级《数据库技术》考试试题与答案
- LeetCode1-340题汇总,希望对你有点帮助!