3

我有几个关于 SurfaceFlinger 的问题:

1)我知道应用程序会写入 Surface 本身,然后将缓冲区移动到 SurfaceFlinger(假设我使用的是硬件画布或 EGL)。缓冲区里面是什么?原始像素?编译的openGL代码?缓冲区可以在一个事务上保存像素,在另一个事务上保存另一种类型的数据吗?

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

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

谢谢

4

1 回答 1

4

(1) 假设您使用的是 OpenGL ES,应用程序将命令排队到 GL 驱动程序,该驱动程序将输出呈现到缓冲区。Surface 是在生产者和消费者之间共享的缓冲区池/队列;在这种情况下,应用程序是生产者,而 SurfaceFlinger 是消费者。对于向 Surface 渲染的 GLES,池将具有两个或三个缓冲区(即双缓冲或三缓冲)。缓冲区由 gralloc 分配,具有描述内容(宽度、高度、像素格式等)的标头,并保存原始像素。

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

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

(2) Hardware Composer 有自己的 API。它与 GLES 无关。在超出覆盖平面数量的情况下,部分或全部合成可以使用 GLES 完成,但在 SurfaceFlinger 中处理。

更多细节可以在图形架构文档中找到。

于 2015-04-12T15:56:43.223 回答