发布网友
共1个回答
热心网友
1、基础数据结构
gralloc 模块通过 struct private_mole_t 来描述,该结构定义如下:
[cpp] view plain copy
struct private_mole_t {
gralloc_mole_t base;
private_handle_t* framebuffer; /* 指向图形缓冲区的句柄 */
uint32_t flags; /* 用来标志系统帧缓冲区是否支持双缓冲 */
uint32_t numBuffers; /* 表示系统帧缓冲的个数 */
uint32_t bufferMask; /* 记录系统帧缓冲的使用情况 */
pthread_mutex_t lock; /* 保护结构体private_mole_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.hnne.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_mole_t 定义:
[cpp] view plain copy
typedef struct gralloc_mole_t {
struct hw_mole_t common;
/* 注册一个图形缓冲区,这个指定的图形缓冲区使用一个buffer_handle_t句柄来描述 */
int (*registerBuffer)(struct gralloc_mole_t const* mole,
buffer_handle_t handle);
/* 注销一个图形缓冲区 */
int (*unregisterBuffer)(struct gralloc_mole_t const* mole,
buffer_handle_t handle);
/* 用来锁定一个图形缓冲区并将缓冲区映射到用户进程
* 在锁定一块图形缓冲区的时候,可以指定要锁定的图形绘冲区的位置以及大小
* 这是通过参数l、t、w和h来指定的,其中,参数l和t指定的是要访问的图形缓冲区的左上角位置
* 而参数w和h指定的是要访问的图形缓冲区的宽度和长度
* 锁定之后,就可以获得由参数参数l、t、w和h所圈定的一块缓冲区的起始地址,保存在输出参数vaddr中
* 另一方面,在访问完成一块图形缓冲区之后,需要解除这块图形缓冲区的锁定 */
int (*lock)(struct gralloc_mole_t const* mole,
buffer_handle_t handle, int usage,
int l, int t, int w, int h,
void** vaddr);
int (*unlock)(struct gralloc_mole_t const* mole,
buffer_handle_t handle);
int (*perform)(struct gralloc_mole_t const* mole,
int operation, ... );
/* reserved for future use */
void* reserved_proc[7];
} gralloc_mole_t;