當前位置:編程學習大全網 - 源碼下載 - 怎麽用gralloc讀取framebuffer

怎麽用gralloc讀取framebuffer

1、基礎數據結構

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;

  • 上一篇:有人認為《迷妳世界》是模仿的《我的世界》,妳認為呢?
  • 下一篇:網易遊戲和騰訊遊戲的服務端是用什麽語言開發的
  • copyright 2024編程學習大全網