关于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渲染到Surface,该池将具有两个或三个缓冲区(即双缓冲或三缓冲).缓冲区由gralloc分配,具有描述内容(宽度,高度,像素格式等)的头,并保存原始像素.
原始像素不是必须存在的,因为足够复杂的系统可以在需要时重播GLES命令,但实际上,实现是填充缓冲区并传递句柄.
由于gralloc标头指定了缓冲区属性,因此可以随时更改缓冲区大小和像素格式.系统的某些部分并不期望这样.例如,如果将RGB像素馈送到MediaCodec的“ Surface”输入,然后切换到YUV,则编解码器可能无法检测到更改. (这可以通过一些隐藏的选项来进行屏幕录制.)
(2)硬件编辑器的值为its own API.它与GLES无关.如果超出了重叠平面的数量,则可以使用GLES完成部分或全部合成,但这可以在SurfaceFlinger中处理.
更多详细信息,请参见graphics architecture doc.