Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(8)...
- static int gralloc_alloc(alloc_device_t* dev,
- int w, int h, int format, int usage,
- buffer_handle_t* pHandle, int* pStride)
- {
- if (!pHandle || !pStride)
- return -EINVAL;
- size_t size, stride;
- int align = 4;
- int bpp = 0;
- switch (format) {
- case HAL_PIXEL_FORMAT_RGBA_8888:
- case HAL_PIXEL_FORMAT_RGBX_8888:
- case HAL_PIXEL_FORMAT_BGRA_8888:
- bpp = 4;
- break;
- case HAL_PIXEL_FORMAT_RGB_888:
- bpp = 3;
- break;
- case HAL_PIXEL_FORMAT_RGB_565:
- case HAL_PIXEL_FORMAT_RGBA_5551:
- case HAL_PIXEL_FORMAT_RGBA_4444:
- bpp = 2;
- break;
- default:
- return -EINVAL;
- }
- size_t bpr = (w*bpp + (align-1)) & ~(align-1);
- size = bpr * h;
- stride = bpr / bpp;
- int err;
- if (usage & GRALLOC_USAGE_HW_FB) {
- err = gralloc_alloc_framebuffer(dev, size, usage, pHandle);
- } else {
- err = gralloc_alloc_buffer(dev, size, usage, pHandle);
- }
- if (err < 0) {
- return err;
- }
- *pStride = stride;
- return 0;
- }
- static int gralloc_alloc_framebuffer(alloc_device_t* dev,
- size_t size, int usage, buffer_handle_t* pHandle)
- {
- private_module_t* m = reinterpret_cast<private_module_t*>(
- dev->common.module);
- pthread_mutex_lock(&m->lock);
- int err = gralloc_alloc_framebuffer_locked(dev, size, usage, pHandle);
- pthread_mutex_unlock(&m->lock);
- return err;
- }
- static int gralloc_alloc_framebuffer_locked(alloc_device_t* dev,
- size_t size, int usage, buffer_handle_t* pHandle)
- {
- private_module_t* m = reinterpret_cast<private_module_t*>(
- dev->common.module);
- // allocate the framebuffer
- if (m->framebuffer == NULL) {
- // initialize the framebuffer, the framebuffer is mapped once
- // and forever.
- int err = mapFrameBufferLocked(m);
- if (err < 0) {
- return err;
- }
- }
- const uint32_t bufferMask = m->bufferMask;
- const uint32_t numBuffers = m->numBuffers;
- const size_t bufferSize = m->finfo.line_length * m->info.yres;
- if (numBuffers == 1) {
- // If we have only one buffer, we never use page-flipping. Instead,
- // we return a regular buffer which will be memcpy'ed to the main
- // screen when post is called.
- int newUsage = (usage & ~GRALLOC_USAGE_HW_FB) | GRALLOC_USAGE_HW_2D;
- return gralloc_alloc_buffer(dev, bufferSize, newUsage, pHandle);
- }
- if (bufferMask >= ((1LU<<numBuffers)-1)) {
- // We ran out of buffers.
- return -ENOMEM;
- }
- // create a "fake" handles for it
- intptr_t vaddr = intptr_t(m->framebuffer->base);
- private_handle_t* hnd = new private_handle_t(dup(m->framebuffer->fd), size,
- private_handle_t::PRIV_FLAGS_FRAMEBUFFER);
- // find a free slot
- for (uint32_t i=0 ; i<numBuffers ; i++) {
- if ((bufferMask & (1LU<<i)) == 0) {
- m->bufferMask |= (1LU<<i);
- break;
- }
- vaddr += bufferSize;
- }
- hnd->base = vaddr;
- hnd->offset = vaddr - intptr_t(m->framebuffer->base);
- *pHandle = hnd;
- return 0;
- }
- static int gralloc_alloc_buffer(alloc_device_t* dev,
- size_t size, int usage, buffer_handle_t* pHandle)
- {
- int err = 0;
- int fd = -1;
- size = roundUpToPageSize(size);
- fd = ashmem_create_region("gralloc-buffer", size);
- if (fd < 0) {
- LOGE("couldn't create ashmem (%s)", strerror(-errno));
- err = -errno;
- }
- if (err == 0) {
- private_handle_t* hnd = new private_handle_t(fd, size, 0);
- gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
- dev->common.module);
- err = mapBuffer(module, hnd);
- if (err == 0) {
- *pHandle = hnd;
- }
- }
- LOGE_IF(err, "gralloc failed err=%s", strerror(-err));
- return err;
- }
- int mapBuffer(gralloc_module_t const* module,
- private_handle_t* hnd)
- {
- void* vaddr;
- return gralloc_map(module, hnd, &vaddr);
- }
转载于:https://blog.51cto.com/shyluo/967089
Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(8)...相关推荐
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
前面在介绍Android系统的开机画面时提到,Android设备的显示屏被抽象为一个帧缓冲区,而Android系统中的SurfaceFlinger服务就是通过向这个帧缓冲区写入内容来绘制应用程序的用户 ...
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(10)...
7. 图形缓冲区的注销过程 图形缓冲区使用完成之后,就需要从当前进程中注销.前面提到,注销图形缓冲区是由Gralloc模块中的函数gralloc_unregister_buffer来实现 ...
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(9)...
5. 图形缓冲区的释放过程 前面提到,用户空间的应用程序用到的图形缓冲区是由Gralloc模块中的函数gralloc_free来释放的,这个函数实现在文件hardwa ...
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(2)...
函数load也是实现在文件hardware/libhardware/hardware.c文件中,如下所示: static int load(const char *id, const char *pa ...
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(5)...
3. fb设备的打开过程 在Gralloc模块中,fb设备的ID值定义为GRALLOC_HARDWARE_FB0.GRALLOC_HARDWARE_FB0是一个宏,定义在文件h ...
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(4)...
成员变量fd指向一个文件描述符,这个文件描述符要么指向帧缓冲区设备,要么指向一块匿名共享内存,取决于它的宿主结构体private_handle_t描述的一个图形缓冲区是在帧缓冲区分配的 ...
- Android帧布局(Frame Layout)
Android帧布局(Frame Layout) FrameLayout是最简单的一个布局管理器.FrameLayout为每个加入其中的组件创建一个空白区域(一帧),这些组件根据layout_grav ...
- 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)
更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...
- Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析
在前文中,我们分析了SurfaceFlinger服务的启动过程.SurfaceFlinger服务在启动的过程中,会对系统的硬件帧缓冲区进行初始化.由于系统的硬件帧缓冲区一般只有一个,并且不是谁都可以随 ...
最新文章
- 还在用 BeanUtils来做对象转换吗?快试试 MapStruct吧
- PTA基础编程题目集-7-38 数列求和-加强版
- 用cmake编译caffe
- mysql 字符集测试_MySQL多字符集备份恢复测试
- mysql数据库用户的创建_mysql创建用户及数据库
- mysql 聚合函数 怎么用在条件里_MySql 中聚合函数增加条件表达式的方法
- JeecgBoot Minio版本6.0.13升级到8.0.3修改方法
- python编程一球从100米_Python基础练习实例20(弹球问题)
- Split Byte(文件分割助手) v2.4
- 红米骁龙855旗舰关键细节曝光:256G ROM+GPU超频模式
- Symbian编程总结-基础篇-活动对象正解(1)-理解活动对象
- matlab画图函数基本使用(适合新手)
- freertos demo2: LED blinky queue 发送消息
- Oracle 11gR2光钎链路切换crs服务发生crash
- C# .net MVC 微信红包(服务号发送红包)
- Vue实现页面导航实战
- 六度分离(floyd算法,SPFA算法,最短路—Dijkstra算法)
- [高项]消极风险VS积极风险
- python有什么颜色_Python中常见颜色记录
- vux组件库更换主题颜色的方法
热门文章
- winform中ShowInTaskbar设为false时,注册的热键失效的问题解决
- (二)设置hexo支持mermaid
- vc++ 类 定时器api_关于JS中一些重要的api实现, 巩固你的原生JS功底
- sqoop增量导入hive_Sqoop 增量导MySQL数据 至Hive
- 请领导审阅并提意见应怎么说_成功的领导是怎样跟下属沟通的?在交谈的时候,应当注意这三点...
- tcpip详解有必要看吗_车辆有必要安装“行车记录仪”吗?如何挑选看这里!
- 实现语音对讲_什么是五方通话?智慧电梯SIP五方对讲系统详细方案
- git 安装_Windows系统Git安装教程(详解Git安装过程)
- 职称计算机怎么练,2017职称计算机windows操作训练题
- android 动画间隔时间,Android使用View Animation实现动画加载界面