2015-04-11 2 views
3

У меня есть несколько вопросов относительно SurfaceFlinger:Android SurfaceFlinger и OpenGL ES

1) Я понимаю, что приложение записывает на самой поверхности, а затем перемещает буфер в SurfaceFlinger (давайте предположим, что я использую оборудования Холст или EGL). Что находится внутри буфера? сырые пиксели? скомпилированный openGL-код? Может ли буфер удерживать пиксели на одной транзакции, а другой - на другой?

2) Я где-то читал, что SurfaceFlinger записывает команды HWC/DisplayController с использованием API OpenGL ES 1.0. Это правда?

Если это так, то как команды версии 3.0 переведены в команды версии 1.0 и где?

Спасибо

ответ

4

(1) Предполагая, что вы используете OpenGL ES, приложение очереди на команды драйвера GL, что делает вывод в буфер. Поверхность представляет собой пул/очередь буферов, которые распределяются между производителем и потребителем; в этом случае приложение является производителем, а SurfaceFlinger - потребителем. Для рендеринга GLES на Surface пул будет иметь два или три буфера (т. Е. Двойную или тройную буферизацию). Буфер выделяется gralloc, имеет заголовок, который описывает содержимое (ширина, высота, формат пикселей и т. Д.) И содержит необработанные пиксели.

Необработанные пиксели не нужны, так как достаточно сложная система может просто воспроизводить команды GLES, когда это необходимо, но на практике реализации заполняют буферы и передают ручки вокруг.

Поскольку заголовок gralloc указывает атрибуты буфера, в любой момент можно изменить размер буфера и формат пикселя. Некоторые части системы этого не ожидают. Например, если вы подаете RGB-пиксели на Поверхностный вход MediaCodec, а затем переключитесь на YUV, кодек может не обнаружить изменения. (Это можно продемонстрировать с помощью некоторых скрытых опций screenrecord.)

(2) Аппаратный композитор имеет its own API. Он не имеет отношения к GLES. В случае превышения количества плоскостей перекрытия некоторые или все композиции могут выполняться с помощью GLES, но это обрабатывается в SurfaceFlinger.

Более подробную информацию можно найти на странице graphics architecture doc.

+0

Спасибо, но я все еще не уверен, что понимаю: I) команды внутри буфера gralloc являются «скомпилированными» командами openGL, которые можно запускать на любом устройстве, поддерживающем openGL (какой именно «соответствующий» код?) II) действительно ли поверхностный flinger поддерживает только команды GLES 1.0 (если не использовать чрезмерно плоскости)? и где выполняется перевод с GLES 3.0 на GLES 1.0? – EyalBellisha

+0

Буфер gralloc хранит данные пикселя. Драйвер GLES имеет командную очередь, зависящую от поставщика. * В теории * вы могли бы просто воспроизводить команды всякий раз, когда кто-то делал буферную композицию, но на практике команды заканчиваются до того, как сигнал будет сигнализирован, и следующий этап сможет получить доступ к пикселям, что он делает, читая данные пикселя из буфер gralloc. SurfaceFlinger будет использовать GLES 1.x или 2.x для композиции без наложения; см. https://android.googlesource.com/platform/frameworks/native/+/lollipop-release/services/surfaceflinger/RenderEngine/ – fadden