我对SurfaceFlinger有几个问题:
1)我知道应用程序写入Surface本身,然后将缓冲区移动到SurfaceFlinger(我们假设我使用的是硬件画布或EGL)。什么是缓冲区内?原始像素?编译openGL代码? 缓冲区可以在一个事务上保留像素而在另一个事务上保持另一种类型的数据吗?
2)我在某处读到SurfaceFlinger使用OpenGL ES 1.0 API写入HWC / DisplayController命令。这是真的吗?
如果是,那么如何将3.0版命令转换为版本1.0命令,以及在哪里?
谢谢
答案 0 :(得分:4)
(1)假设您正在使用OpenGL ES,应用程序将命令排队到GL驱动程序,GL驱动程序将输出呈现给缓冲区。 Surface是生产者和消费者之间共享的缓冲池/队列;在这种情况下,app是生产者,SurfaceFlinger是消费者。对于渲染到Surface的GLES,池将具有两个或三个缓冲区(即,双缓冲或三缓冲)。缓冲区由gralloc分配,有一个描述内容的标题(宽度,高度,像素格式等),并保存原始像素。
原始像素不一定存在,因为一个足够复杂的系统可以在需要时重放GLES命令,但实际上实现是填充缓冲区并传递句柄。
因为gralloc标头指定了缓冲区属性,所以可以随时更改缓冲区大小和像素格式。系统的某些部分不期望这样。例如,如果将RGB像素提供给MediaCodec的Surface输入,然后切换到YUV,则编解码器可能无法检测到更改。 (这可以通过屏幕记录的一些隐藏选项来演示。)
(2)硬件编辑器有its own API。它与GLES无关。如果超出覆盖平面的数量,可以使用GLES完成部分或全部组合,但这是在SurfaceFlinger中处理的。
更多详细信息,请参阅graphics architecture doc。