alloc设备open过程分析
在开启fb设备的过程中,会调用函数gralloc_open(module, &gralloc_device);去开启alloc设备。该函数定义在:/hardware/libhardware/include/hardware/gralloc.h
/** convenience API for opening and closing a supported device */
static inline int gralloc_open(const struct hw_module_t* module, struct alloc_device_t** device) { return module->methods->open(module, GRALLOC_HARDWARE_GPU0, (struct hw_device_t**)device); }
|
由于module传进来的是Gralloc Module,所以,本质上就是调用了Gralloc Module的open函数,即:int gralloc_device_open(const hw_module_t* module, const char*name, hw_device_t** device)
// Open Gralloc device int gralloc_device_open(const hw_module_t* module, const char* name, hw_device_t** device) { int status = -EINVAL; // 这回应该走这个分支 if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) { const private_module_t* m = reinterpret_cast<const private_module_t*>( module); // gpu_context_t类继承了alloc_device_t,并实现了alloc_device_t中的alloc,free等方法。 gpu_context_t *dev; IAllocController* alloc_ctrl = IAllocController::getInstance(); dev = new gpu_context_t(m, alloc_ctrl); *device = &dev->common; status = 0; } else { status = fb_device_open(module, name, device); } return status; }
|
Gpu_context_t的构造函数为:
gpu_context_t::gpu_context_t(const private_module_t* module, IAllocController* alloc_ctrl ) : mAllocCtrl(alloc_ctrl) { // Zero out the alloc_device_t memset(static_cast<alloc_device_t*>(this), 0, sizeof(alloc_device_t));
// Initialize the procs common.tag = HARDWARE_DEVICE_TAG; common.version = 0; common.module = const_cast<hw_module_t*>(&module->base.common); common.close = gralloc_close; alloc = gralloc_alloc; #ifdef QCOM_BSP allocSize = gralloc_alloc_size; #endif free = gralloc_free;
} |
主要是完成alloc_device_t参数的初始化。其成员函数alloc,free被设置成gralloc_alloc & gralloc_free。自此,alloc设备的打开过程就分析完成了。
接下来,我们重点分析alloc_device_t中提供的几个关键函数。