硬件编解码、硬件图像scale等过程,是在专有的硬件单元里进行,其使用的内存也是专有的内存,这种内存多是SoC中图形内存。如此方便与硬件加速图形渲染、图像显示、硬件图像加速处理等功能相交互。
上述过程在使用图形内存时,自然需要使用对应的图形内存管理API。常见的图形内存管理API有以下几种:

1,DRM,主要是只其中的内存管理部分,包括dumb-buffer和GEM(Graphics Execution Manager)的两种类型接口。具体的驱动根据芯片支持情况做实现,并且为用户态提供相应的API。
1.1 dumb-buffer较为通用,分配之后可以做映射处理,获取一个用户态的指针,后续可据此在向图形内存中写入数据,但此种方式不能保证图形内存中数据缓存的一致性。其一般使用流程是

a) open() drm 设备节点,多是 /dev/dri/card0 等,得到设备操作fd句柄

b) ioctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, )创建一个 dumb-buffer ,获取buffer句柄。需要指定 宽高/BPP 等参数

c) ioctl(fd, DRM_IOCTL_MODE_MAP_DUMB, ) 根据该buffer对象的伪offset

d) mmap(, offset) 将该buffer对象映射到用户态,获得一个指针,后续就可以向其中写入数据了

e) ioctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, ) 销毁 dumb-buffer 对象

1.2 GEM除了dumb-buffer所提供的功能外,对于创建和读写操作,厂商多是额外提供专有的API来进行,如此完成读写的同时,可以在其中进行缓存一致性的操作;而且GEM可以为每个Buffer对象分配一个32bit的名字,用于跨进程传递。
其使用流程一般是,以 Intel i915 系列平台威力

a) open() drm 设备节点,多是 /dev/dri/card0 等,得到设备操作fd句柄

b) ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, struct drm_i915_gem_create) 创建一个 GEM buffer对象,获取其 handle,简单指定尺寸即可。

c) ioctl(fd, DRM_IOCTL_I915_GEM_PREAD, struct drm_i915_gem_pread)/ioctl(fd, DRM_IOCTL_I915_GEM_PWRITE, struct drm_i915_gem_pwrite)进行读写,可以保证缓存一致性
ioctl(fd, DRM_IOCTL_I915_GEM_MMAP, struct drm_i915_gem_mmap) 获取一个用户态的映射指针,不保证缓存一致性

d) ioctl(fd, DRM_IOCTL_GEM_CLOSE, struct drm_gem_close) 释放刚才的 GEM buffer对象

获取GEM Buffer对象名,以及跨进程传递流程如下

a) ioctl(fd, DRM_IOCTL_GEM_FLINK, struct drm_gem_flink) 获取 GEM Buffer 的名字

b) ioctl(fd, DRM_IOCTL_GEM_OPEN, struct drm_gem_open) 根据名字,获取对应 GEM Buffer对象在当前进程内的 handle

GEM Buffer对象实现是引用计数的,当所有用户态handle全部关闭时,其才被真正释放。

2,ION
ION是Google提出的一套纯粹的图形内存管理API,在现在Android系统中支持的比较广泛。其使用方式和GEM有些类似,也可以跨进程传递Buffer句柄,来将不同的图形任务分散到不同的进程中进行(Android系统实际上就是这么做的)
其基本使用流程为

a) open() drm 设备节点,多是 /dev/ion,得到设备操作fd句柄

b) ioctl(fd, ION_IOC_ALLOC, struct ion_allocation_data) 分配,返回 struct ion_handle,简单指定尺寸信息即可。

b) ioctl(fd, ION_IOC_FREE, struct ion_handle_data) 释放

c) ioctl(fd, ION_IOC_SHARE, struct ion_fd_data)/ioctl(fd, ION_IOC_MAP, struct ion_fd_data) 返回 ION Buffer对象的 fd 表示,
后续可用此 fd 调用 mmap() 获取用户天指针,或跨进程传递

d) ioctl(fd, ION_IOC_IMPORT, struct ion_fd_data) 根据别处提供的fd,获取本地的 struct ion_handle

e) ioctl(fd, ION_IOC_SYNC, struct ion_fd_data) 对 ION Buffer做缓存刷新,保证一致性。

3, 厂商私有的API
3.1 Allwinner A20平台,其硬件编解码单元cedar,在用户态的提供的图形内存的接口就是一套私有的API,具体请见 https://github.com/allwinner-zh/media-codec/tree/master/sunxi-cedarx/SOURCE/common
其提供的API具体访问的设备节点是 /dev/cedar_dev, 详情见 ve.h/ve_alloc.h 中的API和对应实现。
3.2 Intel HD系列集成GPU平台,其图形内存的管理API是在libva中,具体硬件访问是在 libva 的用户态后端 vaapi-driver 中进行的。
其中使用 VASurface 名词表示图形内存对象,其创建是需要制定 宽高/像素格式 基本参数。其使用时需要先获取一个 VADisplay 对象,而获取该对象的入口在 Android/DRM/Wayland 不同的显示后端上有不同入口。详细见libva 的API说明。

~~~ end ~~~

常见Soc平台图形内存管理学习笔记的更多相关文章

  1. C++内存管理学习笔记(5)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  2. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  3. C++内存管理学习笔记(7)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  4. C++内存管理学习笔记(4)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  5. C++内存管理学习笔记(3)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  6. C++内存管理学习笔记(2)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  7. C++内存管理学习笔记(1)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  8. Linux内存管理学习笔记 转

    https://yq.aliyun.com/articles/11192?spm=0.0.0.0.hq1MsD 随着要维护的服务器增多,遇到的各种稀奇古怪的问题也会增多,要想彻底解决这些“小”问题往往 ...

  9. Unity移动游戏加载性能和内存管理-学习笔记

    前言 正在学习Doctor 张.鑫大佬的移动游戏加载性能和内存管理,内容非常非常的干,所以我烧了很多开水,边喝边看,一边拿小本几做好笔记 本文只是关于前2章的内容笔记,关于各种资源的加载耗时 纹理资源 ...

随机推荐

  1. 探索 | “中医+AI”会诊电力设备故障

    在 AlphaGo 成功挑战围棋世界冠军后,人工智能(AI)“深度学习”家喻户晓.电力企业有机会着眼自身战略,利用落地的 AI 技术和应用聚焦业务流程优化.效率提升以及对全新机遇的发掘.本文针对设备故 ...

  2. 关于sql的查询操作记录

    1.--读取库中的所有表名 select name from sysobjects where xtype='u'  --读取指定表的所有列名 select name from syscolumns  ...

  3. 第7天:Q Quant库(未完待续)

    一.本文大纲: 1.Python内置函数计算期权的价格 2.numpy加速数值计算 3.SciPy进行仿真模拟 4.SciPy求解器计算隐含波动率 5.matplotlib绘图 二.案例 (看不懂,略 ...

  4. 关于GitHub

    gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub 对于程序员来说就相当于一个仓库可以把自己写的东西放到网上 要想使用GitHub必须 ...

  5. 装B命令行,常用Windows命令

    winver检查Windows版本 dxdiag检查DirectX信息 gpedit.msc 组策略   regedit.exe 注册表 Msconfig.exe 系统配置实用程序  lusrmgr. ...

  6. git常用命令学习笔记

    安装好git之后即可使用git来管理项目了,鼠标右键点击 git bash出现命令黑窗口,接下来执行git指令即可. https://git-scm.com/book/zh/v2 以下整理了git常用 ...

  7. java入门-day02

    变量和数据类型 Java是强类型语言.数据在计算之前一定要有确定的类型 基本数据类型;   byte /short /int /long/(分别占1-4字节) float(4字节,精度6-7位)    ...

  8. jvm参数及分析工具

    -Xmx4G 设置堆的最大内存大小为4GB,也可通过-XX:MaxHeapSize=4GB进行设置 -Xms256m 设置堆的初始内存大小为256兆,如果未设置此选项,则初始大小将设置为新生代和年老代 ...

  9. JAVA 第1课

    JAVA第一课 电脑识别的进制:二进制,八进制,十六进制 二进制来表示高低电压,类似于抗战时期的发报机.2进制的存储 8进制和16进制:计算器,在计算的时候有一定的临时存储,8位或者16位禁止的存储 ...

  10. 虚拟机3种网络模式(桥接、nat、Host-only)

    http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html