软件环境: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
GRALLOC_MODULE_API_VERSION_0_3
GRALLOC_MODULE_API_VERSION_0_2
#头文件和实现
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:
#源码目录driver\product\android\gralloc\src\4.x实现IAllocator 和 IMapper
#rk3588基于mali bifrost
https:
3. 参考
https://www.cnblogs.com/roger-yu/category/2009688.html