Android幀緩衝區(Frame Buffer)硬件抽象層(HAL)模塊Gralloc的實現原理分析(4)

        成員變量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中, 以下所示:
  1. #define GRALLOC_HARDWARE_GPU0 "gpu0"  
       gralloc設備使用結構體alloc_device_t 來描述。結構體alloc_device_t有兩個成員函數alloc和free,分別用來分配和釋放圖形緩衝區。
 
       結構體alloc_device_t 也是定義在文件hardware/libhardware/include/hardware/gralloc.h中, 以下所示:
  1. typedef struct alloc_device_t {  
  2.     struct hw_device_t common;  
  3.   
  4.     int (*alloc)(struct alloc_device_t* dev,  
  5.             int w, int h, int format, int usage,  
  6.             buffer_handle_t* handle, int* stride);  
  7.   
  8.     int (*free)(struct alloc_device_t* dev,  
  9.             buffer_handle_t handle);  
  10.   
  11. } alloc_device_t;  
       Gralloc模塊在在文件hardware/libhardware/include/hardware/gralloc.h中定義了一個幫助函數gralloc_open,用來打開gralloc設備,以下所示:
  1. static inline int gralloc_open(const struct hw_module_t* module,  
  2.         struct alloc_device_t** device) {  
  3.     return module->methods->open(module,  
  4.             GRALLOC_HARDWARE_GPU0, (struct hw_device_t**)device);  
  5. }  
       參數module指向的是一個用來描述Gralloc模塊的hw_module_t結構體,它的成員變量methods所指向的一個hw_module_methods_t結構體的成員函數open指向了Gralloc模塊中的函數gralloc_device_open。
 
       函數gralloc_device_open定義在文件hardware/libhardware/modules/gralloc/gralloc.cpp文件中,以下所示:
  1. struct gralloc_context_t {  
  2.     alloc_device_t  device;  
  3.     /* our private data here */  
  4. };  
  5.   
  6. ......  
  7.   
  8. int gralloc_device_open(const hw_module_t* module, const char* name,  
  9.         hw_device_t** device)  
  10. {  
  11.     int status = -EINVAL;  
  12.     if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {  
  13.         gralloc_context_t *dev;  
  14.         dev = (gralloc_context_t*)malloc(sizeof(*dev));  
  15.   
  16.         /* initialize our state here */  
  17.         memset(dev, 0, sizeof(*dev));  
  18.   
  19.         /* initialize the procs */  
  20.         dev->device.common.tag = HARDWARE_DEVICE_TAG;  
  21.         dev->device.common.version = 0;  
  22.         dev->device.common.module = const_cast<hw_module_t*>(module);  
  23.         dev->device.common.close = gralloc_close;  
  24.   
  25.         dev->device.alloc   = gralloc_alloc;  
  26.         dev->device.free    = gralloc_free;  
  27.   
  28.         *device = &dev->device.common;  
  29.         status = 0;  
  30.     }   
  31.     ......  
  32.   
  33.     return status;  
  34. }  
 
        這個函數主要是用來建立一個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設備的打開過程。
相關文章
相關標籤/搜索