prothes 专注嵌入式的ARM linux
全部博文(197)
分类:
2012-02-20 09:21:40
S3C6410的双Framebuffer于Android系统中存在的问题 在为S3C6410移植Android系统过程中,发现在拖动任务栏,软键盘输入信息等情况下,屏幕会出现闪烁现象,类似刷新率不足情况。一直认为
原因是自己porting的系统没有实现copybit等2D加速功能,导致填充速度不够快。昨天在调试双Framebuffer时发现,问题可能出在双
Framebuffer上的交换上。Android使用双Framebuffer机制,front显示,back填充,前后交互显得特别重要。打开三星驱
动debug宏,可以发现系统(Android 1.5)在EGL初始化后不断调用显示驱动以下几个函数,实现buffer交换:
Android2.0/2.1系统中,S3C6410双Framebuffer显示问题的解决方法 前文Problems with S3C6410 double framebuffer in Android找到了Android系统处理三星S3C6410处理器的双Framebuffer驱动时出现的屏闪问题。这两天分析了三星原厂提供的cupcake代码后,终于找到解决方法。 Android2.0之后,Google把和Framebuffer打交道的EGL显示部分也抽象为一个HAL模块——Gralloc cupcake中用于swapbuffer也被移到了Gralloc下的Framebuffer.cpp文件中,具体函数变为fb_post: static int fb_post(struct framebuffer_device_t* dev, buffer_handle_t buffer) fb_context_t* ctx = (fb_context_t*)dev; private_handle_t const* hnd = reinterpret_cast if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) { m->base.lock(&m->base, buffer, const size_t offset = hnd->base - m->framebuffer->base; m->base.lock(&m->base, buffer, memcpy(fb_vaddr, buffer_vaddr, m->finfo.line_length * m->info.yres); ======================================================================= 函数名称变了,应该是实现方法有所改变,不是直接贴swap,而是采用时间间隔来post。 但最底层的处理方法不会变,还是用FBIOPUT_VSCREENINFO。 同样,用PAN_DISPLAY修改即可。 if (ioctl(m->framebuffer->fd, FBIOPAN_DISPLAY, &m->info) < 0) unsigned int crtc = 0; if(ioctl(m->framebuffer->fd, FBIO_WAITFORVSYNC, &crtc) < 0) { ======================================================================== 至此,困扰我好几个月的显示和2D加速问题终于解决。 目前得出的结论为Android系统中2D加速引擎copybit对UI的加速作用并不明显。 Rockie Cheng |