我有几个关于 SurfaceFlinger 的问题:
1) 我知道应用程序会写入 Surface 本身,然后将缓冲区移动到 SurfaceFlinger(假设我使用的是 Hardware Canvas 或 EGL)。缓冲区里面有什么?原始像素?编译openGL代码? 缓冲区能否在一次交易中保存像素而在另一次交易中保存另一种类型的数据?
2) 我在某处读到 SurfaceFlinger 使用 OpenGL ES 1.0 API 写入 HWC/DisplayController 命令。是真的吗?
如果是,那么 3.0 版命令是如何翻译成 1.0 版命令的,在哪里?
谢谢
最佳答案
(1) 假设您使用的是 OpenGL ES,应用程序将命令排队到 GL 驱动程序,后者将输出呈现到缓冲区。 Surface 是生产者和消费者共享的缓冲区池/队列;在这种情况下,应用程序是生产者,SurfaceFlinger 是消费者。对于表面的 GLES 渲染,池将有两个或三个缓冲区(即双缓冲或三缓冲)。缓冲区由 gralloc 分配,具有描述内容(宽度、高度、像素格式等)的 header ,并保存原始像素。
原始像素不一定存在,因为足够复杂的系统可以在需要时重播 GLES 命令,但实际上实现是填充缓冲区并传递句柄。
因为 gralloc header 指定了缓冲区属性,所以可以随时更改缓冲区大小和像素格式。系统的某些部分不希望这样。例如,如果您将 RGB 像素提供给 MediaCodec 的表面输入,然后切换到 YUV,编解码器可能无法检测到变化。 (这可以通过一些隐藏的屏幕录制选项来演示。)
(2) Hardware Composer 有 its own API .它与 GLES 无关。在超过叠加平面数量的情况下,部分或全部合成可能会使用 GLES 完成,但这是在 SurfaceFlinger 中处理的。
更多详细信息可以在 graphics architecture doc 中找到.
关于Android Surfaceflinger 和 openGL ES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581890/