ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2011年6月16日 星期四

code reading - fb_test.c

在 system/extra/tests/framebuffer
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

沒有留言:

標籤

網誌存檔