Chinaunix首页 | 论坛 | 博客
  • 博客访问: 241260
  • 博文数量: 32
  • 博客积分: 2033
  • 博客等级: 大尉
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-10 01:53
文章分类
文章存档

2011年(2)

2010年(16)

2009年(13)

2008年(1)

我的朋友

分类: LINUX

2010-07-23 14:15:52


恩,看了看好像也还没有人做android的RGB555的支持。

不幸的是,我们碰到一款芯片,双核1.6G的arm芯片,LCDC是RGB555的,GPU是400M的
要支持android。所以没办法,需要做RGB555的支持

好在这个问题只是一个临时问题,下一版芯片就解决这个问题了。不过这也是
不参考他人设计的后果。别人怎么设计对后来者很有参考的。不能想当然了。
前面走了很多弯路才有现在成熟的设计的。

这里要说一下,android的整个图形系统就是为高通的芯片所设计的,
包括surface的各种不同的type,需要有2D的芯片,3D的芯片,pmem的支持,dsp(一般来
说这些芯片都支持高清解码的,dsp必须的)

目前看的TI,Freescale,还有国内各个厂家的很多芯片基本都不支持2D加速。这里的2D不是指3D的2D,而是单纯的2D芯片(非openvg)。三星的芯片有。


首先说说限制吧
1:模拟器的限制
目前的模拟器是只支持RGB565的,其他的格式一概不支持。

2:framework限制
framework这边很多地方的逻辑都是写死565的,
另外就是显存大小分配的计算等等很多逻辑。

3:EGL/OPENGLES的限制
目前EGL只支持很少的集中config。565支持是相对来说比较好的,
Android的egl实现是不全的,目前勉强可以使用。另外就是各个gpu厂商
提供的android的EGL也只支持少数的config。
pixelflinger只支持565和8888(没记错的话)这里不行,基本上shader也不行了。

4:hardware抽象层里面有一些写死的代码。

5:其他限制。


所以想要出android的芯片,就必须支持565,不过有些厂家LCDC太弱,
有些LCDC可以配置支持多种格式。
不过已经没办法了。只能想办法变通了。

最容易想到的有两种
1:我们还是保留565,因为现在的逻辑都是565的,牵一发而动全身。
等输出完毕之后我们搬运到屏幕上面,也就是说我们先画,完了之后把画出来的整个屏幕转换输出

2: 因为2D是skia的,屏幕上显示出来的东西都是走EGL的,所以我们在EGL swap
的时候先转换成555,然后输出到屏幕。也就是说我们直接画555



这里本来建议的是第二种方案,但是他们实现的时候说有问题。后来发现是我的
建议有一点点问题。给他们讲解了swap的逻辑,然后他们结合这个做到了第一个
方案里面,如何实现?

swapBuffer是在surface画完之后,调用这个输出到屏幕的,这个是和native window
相关的。android的EGL要求是直接渲染到屏幕的也就是dri,但是这个dri和我们linux
上面的dri并无直接关系,只是英文名字一样,直接渲染到屏幕的,双buffer。

这些opengl/es 在swapbuffer的时候会把backbuffer和frontbuffer交换,
然后把这个buffer queuebuffer到nativewindow里面去,然后post到屏幕上面

实际上就是eglswap ->queue buffer (native window)-> post it->fb_post
然后就到了屏幕上面,fb_post的时候不一定要memcpy, ioctl设置fb,把某个
区域作为显示区域就可以了,另外一个就是非显示区域,就可以作为backbuffer了。


当然第一个方案简单,什么都准备好了,我们在post的时候整屏幕转换到可视区域
就可以了,可以在用户空间做,也可以在内核空间做。看对哪边比较拿手了。
如果两边都拿手,还是建议在用户空间做,面的kernel里面段错误就panic了。


第二个方案我也做了一下,实际上在swap的时候我们只要忠实的反应每一个画图的步骤
画到可视区域就可以了,绘图的输出实际是在swapbuffer的时候输出的,
我们只要简单的转换和输出就可以了,post的时候我们什么都不做就可以了。
好在之前做了双屏的工作,把一部分代码抽取出来做了一下验证,第二种方案
明显比第一种要快,因为我们不用因为一小块区域的刷新而去转换整个屏幕。
需要多开一个page,如果要双缓冲则需要两个

565转555还是很快的,不过如果系统慢的时候可能会看到绘图的过程。

本来想录像来,不过屏幕太大,ffmpeg无法录像。
ailantian@vax:~/froyo-egl-rgb555$ ffmpeg -r 24  -s 1280x800  -f x11grab -i :0.0  -vcodec mpeg4  dual-display-rgb555.mpg


另外一点说明就是shader在这里是无法使用的,egl的代码里面。
还有就是没有2D的芯片,这个很不好处理。gpu画的再快也还是需要输出的。
输出性能不行,问题就来了,gpu再强,内存带宽不够也不行,内存太小也不行
因为现在都要解720p,1080p的东西,数据量都很大的,集成的显卡都是使用内存的
无论是什么方案,写测试工具所写的代码总是比方案本身的代码要多的。







阅读(3457) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-06-15 15:58:31

您好;想请教您;为什么shader是无法使用的?surfaceflinger是用opengles来画的话。在它的shader里面转不能实现吗?

chinaunix网友2010-10-28 15:01:38

厉害啊,佩服佩服,我也在搞这个,看了您的文章,获益良多,谢谢。