Android研究_Gralloc_4alloc设备open过程分析

时间:2022-06-17 15:12:04

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中的allocfree等方法。

        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中提供的几个关键函数。