(1) Предполагая, что вы используете OpenGL ES, приложение очереди на команды драйвера GL, что делает вывод в буфер. Поверхность представляет собой пул/очередь буферов, которые распределяются между производителем и потребителем; в этом случае приложение является производителем, а SurfaceFlinger - потребителем. Для рендеринга GLES на Surface пул будет иметь два или три буфера (т. Е. Двойную или тройную буферизацию). Буфер выделяется gralloc, имеет заголовок, который описывает содержимое (ширина, высота, формат пикселей и т. Д.) И содержит необработанные пиксели.
Необработанные пиксели не нужны, так как достаточно сложная система может просто воспроизводить команды GLES, когда это необходимо, но на практике реализации заполняют буферы и передают ручки вокруг.
Поскольку заголовок gralloc указывает атрибуты буфера, в любой момент можно изменить размер буфера и формат пикселя. Некоторые части системы этого не ожидают. Например, если вы подаете RGB-пиксели на Поверхностный вход MediaCodec, а затем переключитесь на YUV, кодек может не обнаружить изменения. (Это можно продемонстрировать с помощью некоторых скрытых опций screenrecord.)
(2) Аппаратный композитор имеет its own API. Он не имеет отношения к GLES. В случае превышения количества плоскостей перекрытия некоторые или все композиции могут выполняться с помощью GLES, но это обрабатывается в SurfaceFlinger.
Более подробную информацию можно найти на странице graphics architecture doc.
Спасибо, но я все еще не уверен, что понимаю: I) команды внутри буфера gralloc являются «скомпилированными» командами openGL, которые можно запускать на любом устройстве, поддерживающем openGL (какой именно «соответствующий» код?) II) действительно ли поверхностный flinger поддерживает только команды GLES 1.0 (если не использовать чрезмерно плоскости)? и где выполняется перевод с GLES 3.0 на GLES 1.0? – EyalBellisha
Буфер gralloc хранит данные пикселя. Драйвер GLES имеет командную очередь, зависящую от поставщика. * В теории * вы могли бы просто воспроизводить команды всякий раз, когда кто-то делал буферную композицию, но на практике команды заканчиваются до того, как сигнал будет сигнализирован, и следующий этап сможет получить доступ к пикселям, что он делает, читая данные пикселя из буфер gralloc. SurfaceFlinger будет использовать GLES 1.x или 2.x для композиции без наложения; см. https://android.googlesource.com/platform/frameworks/native/+/lollipop-release/services/surfaceflinger/RenderEngine/ – fadden