我有几个关于SurfaceFlinger:的问题
1) 我知道应用程序会写入Surface本身,然后将缓冲区移动到SurfaceFlinger(假设我使用的是硬件画布或EGL)。缓冲区里面是什么?原始像素?编译的openGL代码?缓冲区能否容纳一个事务上的像素,以及另一个事务中的另一种类型的数据?
2) 我在某个地方读到SurfaceFlinger使用OpenGL ES 1.0 API写入HWC/DisplayController命令。这是真的吗?
如果是,那么3.0版本的命令如何转换为1.0版本的命令,以及在哪里?
谢谢
(1)假设您使用的是OpenGL ES,应用程序会将命令排队到GL驱动程序,GL驱动程序会将输出渲染到缓冲区。Surface是生产者和消费者之间共享的缓冲池/队列;在这种情况下,应用程序是生产者,SurfaceFlinger是消费者。对于曲面的GLES渲染,池将具有两个或三个缓冲区(即双缓冲区或三缓冲区)。缓冲区由gralloc分配,有一个描述内容(宽度、高度、像素格式等)的标题,并保存原始像素。
原始像素没有必要存在,因为一个足够复杂的系统可以在需要时回放GLES命令,但在实践中,实现是填充缓冲区并传递句柄。
由于gralloc标头指定缓冲区属性,因此可以随时更改缓冲区大小和像素格式。系统的某些部分没有预料到这一点。例如,如果将RGB像素输入到MediaCodec的Surface输入,然后切换到YUV,则编解码器可能无法检测到更改。(这可以通过一些隐藏的屏幕记录选项来证明。)
(2) 硬件生成器有自己的API。它与GLES无关。在超过覆盖平面数量的情况下,可以使用GLES完成部分或全部合成,但这是在SurfaceFlinger中处理的。
更多细节可以在图形架构文档中找到。