成員變量fd指向一個文件描述符,這個文件描述符要麼指向幀緩衝區設備,要麼指向一塊匿名共享內存,取決於它的宿主結構體private_handle_t描述的一個圖形緩衝區是在幀緩衝區分配的,仍是在內存中分配的。
成員變量magic指向一個魔數,它的值由靜態成員變量sMagic來指定,用來標識一個private_handle_t結構體。
成員變量flags用來描述一個圖形緩衝區的標誌,它的值要麼等於0,要麼等於PRIV_FLAGS_FRAMEBUFFER。當一個圖形緩衝區的標誌值等於PRIV_FLAGS_FRAMEBUFFER的時候,就表示它是在幀緩衝區中分配的。
成員變量size用來描述一個圖形緩衝區的大小。
成員變量offset用來描述一個圖形緩衝區的偏移地址。例如,當一個圖形緩衝區是在一塊內存中分塊的時候,假設這塊內存的地址爲start,那麼這個圖形緩衝區的起始地址就爲start + offset。
成員變量base用來描述一個圖形緩衝區的實際地址,它是經過成員變量offset來計算獲得的。例如,上面計算獲得的start + offset的值就保存在成員變量base中。
成員變量pid用來描述一個圖形緩衝區的建立者的PID。例如,若是一個圖形緩衝區是在ID值爲1000的進程中建立的,那麼用來描述這個圖形緩衝區的private_handle_t結構體的成員變量pid的值就等於1000。
結構體private_handle_t的靜態成員變量sMagic前面已經描述過了,另外兩個靜態成員變量sNumInts和sNumFds的值分別等於1和6,表示結構體private_handle_t包含有1個文件描述符和6個整數,它們是用來初始化結構體private_handle_t的父類native_handle_t的成員變量numInts和numFds的,如結構體private_handle_t的構造函數所示。從這裏就能夠看出,結構體private_handle_t的父類native_handle_t的成員變量data所指向的緩衝區就是由結構體private_handle_t的成員變量fds、magic、flags、size、offset、base和pid所佔用的連續內存塊來組成的,一共包含有7個整數。
結構體private_handle_t還定義了一個靜態成員函數validate,用來驗證一個native_handle_t指針是否指向了一個private_handle_t結構體。
至此,Gralloc模塊的加載過程以及相關的數據結構體就介紹到這裏,接下來咱們分別分析定義在Gralloc模塊中的gralloc和fb設備的打開過程。
2. gralloc設備的打開過程
在Gralloc模塊中,gralloc設備的ID值定義爲GRALLOC_HARDWARE_GPU0。GRALLOC_HARDWARE_GPU0是一個宏,定義在文件hardware/libhardware/include/hardware/gralloc.h中, 以下所示:
-
#define GRALLOC_HARDWARE_GPU0 "gpu0"
gralloc設備使用結構體alloc_device_t 來描述。結構體alloc_device_t有兩個成員函數alloc和free,分別用來分配和釋放圖形緩衝區。
結構體alloc_device_t 也是定義在文件hardware/libhardware/include/hardware/gralloc.h中, 以下所示:
-
typedef struct alloc_device_t {
-
struct hw_device_t common;
-
-
int (*alloc)(struct alloc_device_t* dev,
-
int w, int h, int format, int usage,
-
buffer_handle_t* handle, int* stride);
-
-
int (*free)(struct alloc_device_t* dev,
-
buffer_handle_t handle);
-
-
} alloc_device_t;
Gralloc模塊在在文件hardware/libhardware/include/hardware/gralloc.h中定義了一個幫助函數gralloc_open,用來打開gralloc設備,以下所示:
-
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模塊的hw_module_t結構體,它的成員變量methods所指向的一個hw_module_methods_t結構體的成員函數open指向了Gralloc模塊中的函數gralloc_device_open。
函數gralloc_device_open定義在文件hardware/libhardware/modules/gralloc/gralloc.cpp文件中,以下所示:
-
struct gralloc_context_t {
-
alloc_device_t 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)) {
-
gralloc_context_t *dev;
-
dev = (gralloc_context_t*)malloc(sizeof(*dev));
-
-
-
memset(dev, 0, sizeof(*dev));
-
-
-
dev->device.common.tag = HARDWARE_DEVICE_TAG;
-
dev->device.common.version = 0;
-
dev->device.common.module = const_cast<hw_module_t*>(module);
-
dev->device.common.close = gralloc_close;
-
-
dev->device.alloc = gralloc_alloc;
-
dev->device.free = gralloc_free;
-
-
*device = &dev->device.common;
-
status = 0;
-
}
-
......
-
-
return status;
-
}
這個函數主要是用來建立一個gralloc_context_t結構體,而且對它的成員變量device進行初始化。結構體gralloc_context_t的成員變量device的類型爲gralloc_device_t,它用來描述一個gralloc設備。前面提到,gralloc設備是用來分配和釋放圖形緩衝區的,這是經過調用它的成員函數alloc和free來實現的。從這裏能夠看出,函數gralloc_device_open所打開的gralloc設備的成員函數alloc和free分別被設置爲Gralloc模塊中的函數gralloc_alloc和gralloc_free,後面咱們再詳細分析它們的實現。
至此,gralloc設備的打開過程就分析完成了,接下來咱們繼續分析fb設備的打開過程。