我有几个关于surfaceflinger的问题:
1)我知道应用程序会写入surface本身,然后将缓冲区移动到surfaceflinger(假设我使用的是硬件画布或egl)。缓冲区里面是什么?原始像素?编译的opengl代码?
缓冲区能否在一个事务上保存像素,在另一个事务上保存另一种类型的数据?
2)我在某个地方读到surfaceflinger使用opengl es 1.0api写入hwc/displaycontroller命令。是真的吗?
如果是,那么3.0版的命令如何转换为1.0版的命令,在哪里?
谢谢你
最佳答案
(1)假设您使用的是opengl es,应用程序将命令排队到gl驱动程序,该驱动程序将输出呈现到缓冲区。surface是在生产者和消费者之间共享的缓冲池/队列;在本例中,应用程序是生产者,surfaceflinger是消费者。对于将gles渲染到曲面,池将有两个或三个缓冲区(即双缓冲区或三缓冲区)。缓冲区由gralloc分配,有一个描述内容(宽度、高度、像素格式等)的头,并保存原始像素。
原始像素不必存在,因为一个足够复杂的系统可以在需要时回放gles命令,但实际上实现是填充缓冲区并传递句柄。
因为gralloc头指定缓冲区属性,所以可以随时更改缓冲区大小和像素格式。系统的某些部分并不期望这样。例如,如果将rgb像素馈送到媒体编解码器的表面输入,然后切换到yuv,编解码器可能无法检测到更改。(这可以通过屏幕记录的一些隐藏选项来演示。)
(2)硬件生成器具有its own API。它与gles无关。如果超过覆盖平面的数量,可以使用gle完成部分或全部合成,但这是在surfaceflinger中处理的。
更多详情请参见graphics architecture doc。