Android12 Gralloc

软件环境:ubuntu20.04 aosp
硬件环境:X86 PC
模拟环境:在host ubuntu20.04启动支持图形(by virtio-gpu)的Android虚拟机

1. 概述

在这里插入图片描述

2. Android12 Gralloc

2.1 接口说明

  • gralloc主要提供IAllocator和IMapper两类接口
#gralloc HAL接口定义:IAllocator
/hardware/interfaces/graphics/allocator/4.0/IAllocator.hal
#mapper HAL接口定义:IMapper
/hardware/interfaces/graphics/mapper/4.0/IMapper.hal 

2.2 实现说明

  • gralloc有多种实现,如mali,msm,nxp,goldfish,minigbm等
 #ID和版本
GRALLOC_HARDWARE_MODULE_ID
GRALLOC_MODULE_API_VERSION_1_0 //msm nxp
GRALLOC_MODULE_API_VERSION_0_3 //minigbm-gralloc0 hikey960
GRALLOC_MODULE_API_VERSION_0_2 //goldfish-gralloc30 hikey960
#头文件和实现
hardware/libhardware/include/hardware
libhardware/modules/gralloc/gralloc.cpp
  • 二进制
#厂商实现库位于vendor/lib64/hw
libminigbm_gralloc.so
#cuttlefish中allocator组成
libhidlbase.so #线程和IPC相关
android.hardware.graphics.allocator@4.0.so #BnHwAllocator实现
android.hardware.graphics.allocator@4.0-service.minigbm # main和CrosGralloc4Allocator实现
libminigbm_gralloc.so #cros_gralloc和virtgpu_virgl实现
libdrm.so #依赖 

2.3 gralloc-minigbm框架

在这里插入图片描述

#1. BnHwAllocator::onTransact binder接收消息,调用Gralloc4实现,另有Gralloc0实现
#2. CrosGralloc4Allocator框架,实现了init/initializeMetadata/allocate操作,通过cros_gralloc_driver实例调用其接口
#3. cros_gralloc_driver框架,实现了allocate/flush/lock等操作,直接调用drv框架
#4. Drv框架,实现了bo的一些操作,被cros_gralloc_driver和gbm调用,依赖于各厂商Gralloc后端实现,如drv_bo_create
#5. 各个厂商backend实现. 向drv框架注册驱动回调,如virtgpu_virgl 
const struct backend virtgpu_virgl = { .name = "virtgpu_virgl",
                       .init = virgl_init,
                       .close = virgl_close,
                       .bo_create = virgl_bo_create,
                       .bo_destroy = virgl_bo_destroy,
                       .bo_import = drv_prime_bo_import,
                       .bo_map = virgl_bo_map,
                       .bo_unmap = drv_bo_munmap,
                       .bo_invalidate = virgl_bo_invalidate,
                       .bo_flush = virgl_bo_flush,
                       .resolve_format_and_use_flags =
                       virgl_resolve_format_and_use_flags,
                       .resource_info = virgl_resource_info,
                       .get_max_texture_2d_size = virgl_get_max_texture_2d_size };
                       

2.4 线程

  • allocator进程通常一个主线程,多个个binder线程,实际执行操作如bo create都在binder线程中进程
thread #1: name = 'allocator@4.0-s'
thread #2: name = 'HwBinder:412_1'
thread #3: name = 'HwBinder:412_2'
thread #4: name = 'HwBinder:412_3'

2.5 cuttlefish allocator

服务:android.hardware.graphics.allocator@4.0-service.minigbm
实现:/vendor/lib/libminigbm_gralloc.so 
源码:external/minigbm/
操作:需要图形界面有更新才有allocator内部操作

2.6 allocator跟踪

  • 由于没有画面更新时allocator没有响应,在副屏启动web Activity看allocator都有哪些操作
am start -n com.android.webview/org.chromium.android_webview.devui.MainActivity --display 2 
2.6.1 cuttlefish 2D模式
  • 2D模式下,画面更新,基本是不断创建和销毁DUMB操作。内存操作最终依赖libdrm提供的接口
DRM_IOCTL_MODE_CREATE_DUMB -> drmPrimeHandleToFD -> DRM_IOCTL_MODE_DESTROY_DUMB ...
创建GraphicBuffer对象
IPCThreadState::getAndExecuteCommand
BnHwAllocator::onTransact #allocator@4.0.so
CrosGralloc4Allocator::allocate #allocator@4.0-service.minigbm
    cros_gralloc_driver::allocate  #libminigbm_gralloc.so
      drv_bo_create(width=777, height=471) 
        virgl_bo_create(width=400, height=600) 
          drv_dumb_bo_create_ex(..width=448, height=640) 
            #创建了一块内存放在了gem cma的对象里
            DRM_IOCTL_MODE_CREATE_DUMB
     drv_bo_get_plane_fd
       drmPrimeHandleToFD
销毁GraphicBuffer对象,与3D时接口不同
CrosGralloc4Allocator::allocate
  cros_gralloc_driver::release
    cros_gralloc_buffer::~cros_gralloc_buffer
      virgl_bo_destroy
        drv_dumb_bo_destroy
          DRM_IOCTL_MODE_DESTROY_DUMB
2.6.2 cuttlefish 3D模式
  • 3D模式下,画面更新,基本是不断创建和销毁VIRTGPU_RESOURCE操作。内存操作最终依赖libdrm提供的接口
 DRM_IOCTL_VIRTGPU_RESOURCE_CREATE -> drmPrimeHandleToFD -> DRM_IOCTL_GEM_CLOSE ...
创建一个GraphicBuffer对象
BnHwAllocator::_hidl_allocate #allocator@4.0.so
  CrosGralloc4Allocator::allocate #allocator@4.0-service.minigbm
    cros_gralloc_driver::allocate #libminigbm_gralloc.so
      virgl_bo_create 
        virgl_3d_bo_create(bo=0xe8141090, width=400, height=600, format=875708993, use_flags=2597)
          DRM_IOCTL_VIRTGPU_RESOURCE_CREATE 
      drv_bo_get_plane_fd
        drmPrimeHandleToFD
销毁GraphicBuffer对象
CrosGralloc4Allocator::allocate
  cros_gralloc_driver::release
    cros_gralloc_buffer::~cros_gralloc_buffer
      virgl_bo_destroy
        drv_gem_bo_destroy
          DRM_IOCTL_GEM_CLOSE

2.7 其他实现

gralloc每个厂商实现不同,上文只分析了再Android模拟环境中minigbm实现,还有别的实现。
#ARM Mali GPU Gralloc
https://developer.arm.com/downloads/-/mali-drivers/android-gralloc-module
#源码目录driver\product\android\gralloc\src\4.x实现IAllocator 和 IMapper

#rk3588基于mali bifrost
https://github.com/rockchip-toybrick/rk_hardware_libgralloc_bifrost

3. 参考

https://www.cnblogs.com/roger-yu/category/2009688.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值