gr_fb_fd 就是 open /dev/graphics/fb0 的 handle. access("/dev/tty0",F_OK) : 用 access (unistd.h) 來 check 是否對 /dev/tty0 有 read/write 權限。 然後用 KDSETMODE,把 famebuffer 設定在圖形模式
fd = open("/dev/tty0", O_RDWR | O_SYNC);
if(fd < 0)
return -1;
if(ioctl(fd, KDSETMODE, (void*) KD_GRAPHICS)) {
close(fd);
return -1;
}
framebuffer 的 information 有 fix, var 兩種,分別以兩種 structure 處理:
fb_fix_screeninfo, fb_var_screeninfo.
GGLSurface 這個 structure 宣告在 system/core/include/pixelflinger/pixelflinger.h.
--- 所以是 android 獨有的。
typedef struct {
GGLsizei version; // always set to sizeof(GGLSurface)
GGLuint width; // width in pixels
GGLuint height; // height in pixels
GGLint stride; // stride in pixels
GGLubyte* data; // pointer to the bits
GGLubyte format; // pixel format
GGLubyte rfu[3]; // must be zero
// these values are dependent on the used format
union {
GGLint compressedFormat;
GGLint vstride;
};
void* reserved;
} GGLSurface;
沒什麼特殊的呀,就是多了 stride 這個 field.
其中有 set_active_framebuffer..
static void set_active_framebuffer(unsigned n)
{
if(n > 1) return;
vi.yres_virtual = vi.yres * 2;
vi.yoffset = n * vi.yres;
if(ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
fprintf(stderr,"active fb swap failed!\n");
} else
printf("active buffer: %d\n", n);
}
參考文件是說,android 支援 page flipping,會先request 兩倍大的記憶體,然後靠著更改 start mapping 的位置 (offset) ,來顯示 第 0 或 第 1 頁。
上面的 code大概就是這樣吧。 (vi.yoffset = n * yres).
ref : http://blogold.chinaunix.net/u3/104807/showart_2162774.html -- android fb double buffering
沒有留言:
張貼留言