当前位置: 首页 > news >正文

Gralloc 接口全解析(Android 14+ 最新版本)

前面我有篇博客说了gralloc1_perform这个函数,主要是因为我知道有刷cache这个动作,但是不知道具体在哪里实现。但是gralloc1_perform这个接口是很老版本的gralloc用的。这篇博客概括一下最新版本的Gralloc接口。

Gralloc(Graphics Allocation)主要用于 GPU/CPU 共享图形缓冲区(buffer)。最新的 Gralloc 体系由 Allocator HAL 3.xMapper HAL 4.x 组成,分别负责 buffer 分配buffer 访问/管理


1️⃣ Gralloc 最新架构

模块作用
Allocator HAL 3.x负责 buffer 分配
Mapper HAL 4.x负责 buffer 访问、映射、缓存管理等

2️⃣ Allocator HAL 3.x(分配 Buffer)

接口类android.hardware.graphics.allocator@3.0::IAllocator

🔹 主要接口

函数作用
IAllocator::allocate()申请 buffer
IAllocator::dumpDebugInfo()获取 allocator 相关调试信息

🔹 代码示例

sp<IAllocator> allocator = IAllocator::getService();
if (allocator != nullptr) {
    hidl_vec<uint8_t> rawHandle;
    auto result = allocator->allocate(1, {/*请求参数*/}, 
        [&](auto error, auto buffers) {
            if (error == Error::NONE) {
                rawHandle = buffers[0];
            }
        });
}

✅ 作用:向 Gralloc 请求 1 个 buffer 并返回 handle。


3️⃣ Mapper HAL 4.x(管理 Buffer)

接口类android.hardware.graphics.mapper@4.0::IMapper

🔹 主要接口

函数作用
IMapper::importBuffer()通过 native handle 获取 buffer
IMapper::freeBuffer()释放 buffer
IMapper::lock()申请 CPU 访问 buffer
IMapper::unlock()释放 CPU 访问权限
IMapper::flushLockedBuffer()刷新 CPU 缓存,确保数据写入内存
IMapper::invalidateLockedBuffer()失效缓存,确保读取最新数据

🔹 代码示例

// 1. 获取 Mapper 服务
sp<IMapper> mapper = IMapper::getService();

// 2. Import Buffer
buffer_handle_t importedHandle = nullptr;
mapper->importBuffer(rawHandle, [&](auto error, auto buffer) {
    if (error == Error::NONE) {
        importedHandle = buffer;
    }
});

// 3. Lock Buffer 进行 CPU 读写
void* data = nullptr;
mapper->lock(importedHandle, GRALLOC_USAGE_SW_WRITE_OFTEN, 
             {}, [&](auto error, void* addr) {
    if (error == Error::NONE) {
        data = addr;
    }
});

// 4. Unlock Buffer 释放访问权限
mapper->unlock(importedHandle, [&](auto error, auto releaseFence) {
    if (error != Error::NONE) {
        LOG(ERROR) << "Failed to unlock buffer";
    }
});

✅ 作用

  1. importBuffer() 获取 buffer

  2. lock() 获取 buffer 读写权限

  3. unlock() 释放权限


4️⃣ 旧版本 vs. 新版本

功能Gralloc 1.0(旧)Gralloc 3.x/4.x(新)
分配 Buffergralloc1_perform(GRALLOC1_PERFORM_ALLOCATE, …)IAllocator::allocate()
释放 Buffergralloc1_perform(GRALLOC1_PERFORM_FREE, …)IMapper::freeBuffer()
CPU 读写gralloc1_perform(GRALLOC1_PERFORM_LOCK, …)IMapper::lock() / IMapper::unlock()
缓存管理gralloc1_perform(GRALLOC1_PERFORM_FLUSH_CACHE, …)IMapper::flushLockedBuffer() / invalidateLockedBuffer()

5️⃣ 总结

  1. Gralloc 3.x/4.x 采用 IAllocator(分配)+ IMapper(管理)架构

  2. gralloc1_perform() 已被 IMapper::lock/unlock 替代

  3. 所有 buffer 访问(如 cache flush)必须使用 IMapper::flushLockedBuffer()

Gralloc 最新版本引入了更现代化的 HIDL 接口,相比旧的 gralloc1_perform 方式,更加模块化、安全、可扩展。🚀

如果追一下代码,会发现QtiMapper::flushLockedBuffer最终会调用到:

118  int DmaManager::CleanBuffer(void * /*base*/, unsigned int /*size*/, unsigned int /*offset*/,
119                              int /*handle*/, int op, int dma_buf_fd) {
120    ATRACE_CALL();
121    ATRACE_INT("operation id", op);
122  
123    struct dma_buf_sync sync;
124    int err = 0;
125  
126    switch (op) {
127      case CACHE_CLEAN:
128        sync.flags = DMA_BUF_SYNC_END | DMA_BUF_SYNC_RW;
129        break;
130      case CACHE_INVALIDATE:
131        sync.flags = DMA_BUF_SYNC_START | DMA_BUF_SYNC_RW;
132        break;
133      case CACHE_READ_DONE:
134        sync.flags = DMA_BUF_SYNC_END | DMA_BUF_SYNC_READ;
135        break;
136      default:
137        ALOGE("%s: Invalid operation %d", __FUNCTION__, op);
138        return -1;
139    }
140  
141    if (ioctl(dma_buf_fd, INT(DMA_BUF_IOCTL_SYNC), &sync)) {
142      err = -errno;
143      ALOGE("%s: DMA_BUF_IOCTL_SYNC failed with error - %s", __FUNCTION__, strerror(errno));
144      return err;
145    }
146  
147    return 0;
148  }

这里就看到具体的ioctl操作了。

相关文章:

  • Leetcode 最长递增子序列的个数
  • Linux操作系统配置本地yum源和定时任务
  • win10 安装后的 系统盘的 分区
  • 爱普生 SG2520CAA 有源晶振赋能车身以太网 PHY
  • 机器学习与深度学习4:数据集处理Dataset,DataLoader,batch_size
  • 动态规划:路径类dp
  • JWT、seesion、cookie、csrf漏洞
  • Git回退文件到指定提交
  • 告别代码Bug,GDB调试工具详解
  • 《Spring Cloud Eureka 高可用集群实战:从零构建 99.99% 可靠性的微服务注册中心》
  • 智能设备定制PCBA板卡快速接入OPC UA系统
  • Elasticsearch-实战案例
  • 反射、枚举以及lambda表达式
  • 多台 Windows 电脑之间共享鼠标和键盘,并支持 剪贴板同步(复制粘贴)
  • 解锁算法密码:多维度探究动态规划,贪心,分治,回溯和分支限界经典算法
  • 个人学习编程(3-27) leetcode刷题
  • JavaScript 调试入门指南
  • 鸿蒙UI开发
  • ​​SenseGlove与Aeon Robotics携手推出HEART项目,助力机器人培训迈向新台阶
  • 【银河麒麟系统常识】命令:uname -m(查看系统架构)
  • 微信开发小程序开发网站建设/网站建设教程
  • 专门做win7的网站/seo推广营销公司
  • 西安建设和住房保障局网站首页/站长网站提交
  • 做网站开发服务商/南宁seo关键词排名
  • centos7做网站/百度移动权重
  • wordpress 自定义简码/天天seo伪原创工具