Android Surfaceflinger 和 openGL ES

Android Surfaceflinger and openGL ES

我有几个关于 SurfaceFlinger 的问题:

1) 我知道应用程序会写入 Surface 本身,然后将缓冲区移动到 SurfaceFlinger(假设我使用的是硬件 Canvas 或 EGL)。缓冲区里面有什么?原始像素?编译openGL代码? 缓冲区能否在一次交易中保存像素而在另一次交易中保存另一种类型的数据?

2) 我在某处读到 SurfaceFlinger 使用 OpenGL ES 1.0 API 写入 HWC/DisplayController 命令。是真的吗?

如果是,那么如何将 3.0 版命令转换为 1.0 版命令,在哪里?

谢谢

(1) 假设您使用的是 OpenGL ES,应用程序 queue 向 GL driver 发出命令,将输出呈现到缓冲区。 Surface 是生产者和消费者共享的缓冲区池 / queue;在这种情况下,应用程序是生产者,SurfaceFlinger 是消费者。对于表面的 GLES 渲染,池将有两个或三个缓冲区(即双或 triple-buffering)。缓冲区由 gralloc 分配,有一个描述内容(宽度、高度、像素格式等)的 header,并保存原始像素。

原始像素不一定存在,因为足够复杂的系统可以在需要时重播 GLES 命令,但实际上实现是填充缓冲区并传递句柄。

因为 gralloc header 指定了缓冲区属性,所以可以随时更改缓冲区大小和像素格式。系统的某些部分不希望这样。例如,如果您将 RGB 像素提供给 MediaCodec 的表面输入,然后切换到 YUV,编解码器可能无法检测到变化。 (这可以通过屏幕录制的一些隐藏选项来演示。)

(2) Hardware Composer 有 its own API。它与 GLES 无关。在超过叠加平面数量的情况下,部分或全部合成可能会使用 GLES 完成,但这在 SurfaceFlinger 中处理。

可以在 graphics architecture doc 中找到更多详细信息。