gralloc 模塊通過 struct private_module_t 來描述,該結構定義如下:
[cpp] view plain copy
struct private_module_t {
gralloc_module_t base;
private_handle_t* framebuffer; /* 指向圖形緩沖區的句柄 */
uint32_t flags; /* 用來標誌系統幀緩沖區是否支持雙緩沖 */
uint32_t numBuffers; /* 表示系統幀緩沖的個數 */
uint32_t bufferMask; /* 記錄系統幀緩沖的使用情況 */
pthread_mutex_t lock; /* 保護結構體private_module_t的並行訪問 */
buffer_handle_t currentBuffer; /* 描述當前正在被渲染的圖形緩沖區 */
int pmem_master; /* pmem設備節點的描述符 */
void* pmem_master_base; /* pmem的起始虛擬地址 */
struct fb_var_screeninfo info; /* lcd的可變參數 */
struct fb_fix_screeninfo finfo; /* lcd的固定參數 */
float xdpi; /* x方向上每英寸的像素數量 */
float ydpi; /* y方向上每英寸的像素數量 */
float fps; /* lcd的刷新率 */
int orientation; /* 顯示方向 */
enum {
PRIV_USAGE_LOCKED_FOR_POST = 0x80000000 /* flag to indicate we'll post this buffer */
};
};
該結構的成員記錄了 gralloc 模塊的各種參數,主要為模塊自己使用,應用程序操作的圖形緩沖區的數據結構是struct private_handle_t,定義如下:
[cpp] view plain copy
#ifdef __cplusplus
struct private_handle_t : public native_handle {
#else
struct private_handle_t {
struct native_ha www.hnnedu.com ndle nativeHandle; /* 用來描述壹個本地句柄值 */
#endif
enum {
PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
PRIV_FLAGS_USES_PMEM = 0x00000002,
PRIV_FLAGS_USES_MMEM = 0x00000004,
PRIV_FLAGS_NEEDS_FLUSH = 0x00000008,
};
enum {
LOCK_STATE_WRITE = 1<<31,
LOCK_STATE_MAPPED = 1<<30,
LOCK_STATE_READ_MASK = 0x3FFFFFFF
};
/* 指向壹個文件描述符,這個文件描述符要麽指向幀緩沖區設備,要麽指向壹塊匿名***享內存
* 取決於private_handle_t描述的圖形緩沖區是在幀緩沖區分配的,還是在內存中分配的 */
int fd;
/* 指向壹個魔數,它的值由靜態成員變量sMagic來指定,用來標識壹個private_handle_t結構體 */
int magic;
/* 用來描述壹個圖形緩沖區的標誌,它的值要麽等於0,要麽等於PRIV_FLAGS_FRAMEBUFFER
* 當壹個圖形緩沖區的標誌值等於PRIV_FLAGS_FRAMEBUFFER的時候,就表示它是在幀緩沖區中分配的 */
int flags;
int size; /* 描述壹個圖形緩沖區的大小 */
int offset; /* 描述壹個圖形緩沖區的偏移地址 */
int phys; /* 圖形緩沖區或幀緩沖的起始物理地址 */
int base; /* 圖形緩沖區或幀緩沖的起始虛擬地址 */
int lockState;
int writeOwner;
int pid; /* 描述壹個圖形緩沖區的創建者的PID */
#ifdef __cplusplus
static const int sNumInts = 9; /* 有9個整數變量 */
static const int sNumFds = 1; /* 有1個文件描述符 */
static const int sMagic = 0x3141592;
private_handle_t(int fd, int size, int flags) :
fd(fd), magic(sMagic), flags(flags), size(size), offset(0),
phys(0), base(0), lockState(0), writeOwner(0), pid(getpid())
{
version = sizeof(native_handle);
numInts = sNumInts;
numFds = sNumFds;
}
~private_handle_t() {
magic = 0;
}
bool usesPhysicallyContiguousMemory() {
return (flags & PRIV_FLAGS_USES_PMEM) != 0;
}
/* 用來驗證壹個native_handle_t指針是否指向了壹個private_handle_t結構體 */
static int validate(const native_handle* h) {
const private_handle_t* hnd = (const private_handle_t*)h;
if (!h || h->version != siz www.hbbz08.com eof(native_handle) ||
h->numInts != sNumInts || h->numFds != sNumFds ||
hnd->magic != sMagic)
{
LOGE("invalid gralloc handle (at %p)", h);
return -EINVAL;
}
return 0;
}
static private_handle_t* dynamicCast(const native_handle* in) {
if (validate(in) == 0) {
return (private_handle_t*) in;
}
return NULL;
}
#endif
};
圖形緩沖區的操作接口由結構 struct gralloc_module_t 定義:
[cpp] view plain copy
typedef struct gralloc_module_t {
struct hw_module_t common;
/* 註冊壹個圖形緩沖區,這個指定的圖形緩沖區使用壹個buffer_handle_t句柄來描述 */
int (*registerBuffer)(struct gralloc_module_t const* module,
buffer_handle_t handle);
/* 註銷壹個圖形緩沖區 */
int (*unregisterBuffer)(struct gralloc_module_t const* module,
buffer_handle_t handle);
/* 用來鎖定壹個圖形緩沖區並將緩沖區映射到用戶進程
* 在鎖定壹塊圖形緩沖區的時候,可以指定要鎖定的圖形繪沖區的位置以及大小
* 這是通過參數l、t、w和h來指定的,其中,參數l和t指定的是要訪問的圖形緩沖區的左上角位置
* 而參數w和h指定的是要訪問的圖形緩沖區的寬度和長度
* 鎖定之後,就可以獲得由參數參數l、t、w和h所圈定的壹塊緩沖區的起始地址,保存在輸出參數vaddr中
* 另壹方面,在訪問完成壹塊圖形緩沖區之後,需要解除這塊圖形緩沖區的鎖定 */
int (*lock)(struct gralloc_module_t const* module,
buffer_handle_t handle, int usage,
int l, int t, int w, int h,
void** vaddr);
int (*unlock)(struct gralloc_module_t const* module,
buffer_handle_t handle);
int (*perform)(struct gralloc_module_t const* module,
int operation, ... );
/* reserved for future use */
void* reserved_proc[7];
} gralloc_module_t;