Описание общих принципов работы оконной подсистемы
Screen
является композитной оконной подсистемой ЗОСРВ «Нейтрино», реализующей композицию графических окружений, а также аппаратную акселерацию приложений.
В отличие от традиционных оконных окружений, управляющих единственным буфером, ассоциированным с каждым дисплеем, в композитном окружении приложениям предоставляется возможность off-screen рендеринга (от англ. rendering
) с последующей визуализацией на экране средствами оконной подсистемы.
Off-screen рендеринг на системном уровне позволяет графической и оконной подсистеме производить манипуляции с окнами не вовлекая в это прикладное приложение. Содержимое окон может быть перемещено, масштабировано, повернуто на заданный угол, а также отражено вертикально или горизонтально без необходимости дополнительной перерисовки со стороны приложения.
Оконная подсистема Screen
ответственна за:
- запуск драйверов акселерации (например, драйвера блиттера или OpenGL ES)
- выделение памяти, требуемой для хранения ресурсов окон приложений
- отображение контента при завершении рендеринга
Screen
объединяет множество графических и UI (user interface) технологий в единое окружение. Посредством композиции это окружение объединяется оконной подсистемой в единое изображение для последующего отображения на экране. При этом осуществляется композиция (совмещение) слоев, окон и курсоров.
Рисунок 1. Композиция окон и слоев в оконной подсистеме Screen
Как уже было сказано, одной из основных задач, решаемой оконной подсистемой Screen
является комбинирование всех видимых оконных буферов в единое изображение при отображении. Эта функция возложена на модуль, именуемый композитором (Composition Manager) и достигается за счет привлечения аппаратной акселерации.
Screen имеет модульную архитектуру, включающую аппаратно-специфичные компоненты и модули организации OpenGL for Embedded Systems (OpenGL ES) акселерации.
Screen использует GPU-акселерированные операции для оптимального построения финальной сцены.
Кроме менеджмента окон композитор (Composition Manager) тесно связан с маршрутизацией потоков ввода от соответствующих устройств. При этом происходит перехват потоков у классических путей, используемых в оконной подсистеме Photon (отмечены красным).
Рисунок 2. Маршрутизация потоков ввода в оконной подсистеме
 | Стоит отметить, что каждое событие ввода при маршрутизации направляется либо окнам Screen , либо в оконную подсистему Photon. Сосуществование обеих оконных подсистем возможно, но не рекомендуется из соображений производительности. Степень потерь при этом сильно зависит от особенностей устройств акселерации и общей производительности системы (пропускная способность памяти, CPU, вид и степень параллелизма, ...). |
Приложения взаимодействуют с композитором (Composition Manager) используя Screen
API. Основные векторы взаимодействия:
- создание и удаление окон
- создание и удаление pixmap-ов
- доступ к параметрам окон, pixmap-ов, дисплеев, устройств и буферов
- рендеринг содержимого буферов, ассоциированных с окнали или pixmap-ами
- обозначение областей внутри буферов, которые должны быть отображены
- передача и получение асинхронных сообщений от Screen
- отправление сообщений другим приложениям
Приложения могут осуществлять рендеринг, используя:
- программные методики (приложения могут получить доступ к оконным буферам и формировать их содержимое средствами CPU)
- OpenGL ES (используя EGL для доступа к оконным буферам и OpenGL ES для формирования их содержимого)
- OpenGL (используя EGL для доступа к оконным буферам и OpenGL для формирования их содержимого)
Screen API характеризует способы взаимодействия приложения с оконной подсистемой Screen
Все компоненты Screen API достаточно тесно связаны между собой (в настоящий момент не все виды объектов доступны через API).
Рисунок 3. Компоненты Screen API
- Контексты
- Контекст представляет совокупность параметров графических операций в рамках подсистемы
Screen
.
Все остальные объекты API создаются в рамках конкретного контекста и доступ к ним осуществляется с использованием ассоциированного контекста. Через контекст также можно получить доступ к объектам, на которых будет производиться рендеринг (например, окна, группы, дисплеи, pixmap-ы
), чтобы устанавливать или изменять их свойства и атрибуты.
Устройства, дисплеи и окна зависят от контекста, который ассоциирован также с событиями, группами и pixmap-ами
. - Устройство
- Определяет устройство ввода. Это устройство (например, клавиатура, мышь, джойстик, геймпад или мультитач) можно сфокусировать на конкретных дисплеях.
- Дисплей
- Дисплей относится к физическому устройству отображения. Используя API можно получить доступ к свойствам дисплея, его режимам и вертикальной синхронизации.
- Окна
- Окно представляет поверхность для рисования. Окно может отображать различные типы контента, отсюда следует доступность нескольких типов окон: окна приложений, дочерние окна и встроенные окна.
- Pixmap
- Pixmap схож с битовой картой, за исключением того, что она может иметь глубину цвета в несколько бит на пиксель. Битовые карты, напротив, имеют глубину цвета в 1 бит на пиксель.
Вы можете рисовать непосредственно на поверхность pixmap-а, размещенную в off-screen области, а затем копировать его содержимое в буфер. - Событие
- Событие включает такие действия, как создание окна, изменение его параметров, события клавиатуры и других устройств ввода. События связаны с контекстом.
Screen
API предоставляет одну очередь событий для каждого контекста. - Группа
- Группа используется для организации и управления несколькими окнами приложения. Принадлежащие группе окна имеют идентичные параметры.
- Буфер
- Буфер - это область памяти (обычно видео-памяти), где можно быстро перемещать данные не занимая CPU. Хотя буфер создается в рамках контекста, его нельзя использовать, если он не привязан к окну или
pixmap-у
.
Несколько буферов могут быть ассоциированы с окном, тогда как только один буфер может быть связан с pixmap-ом.
Screen
предоставляет набор простых приложений для демонстрации основных функций Screen API. Запуск этих приложений позволяет, в том числе, определить настроен ли Screen
должным образом.
- screen-blank
- Приложение позволяет отобразить простейшее композитное окно.
- screen-egl-configs
- Утилита позволяет запрашивать и отображать перечень доступных конфигураций framebuffer-а для указанного дисплея. Если номер дисплея не указан, используется дисплей, заданный по умолчанию.
- screen-gles2-gears
- Это приложение отображает в окне стандартную демонстрацию «gears», использующую OpenGL ES 2.x API.
- screen-gl1-gears
- Это приложение отображает в окне стандартную демонстрацию «gears», использующую OpenGL 1.x API и EGL.
- screen-gles2-glmark2
- Это приложение позволяет оценить производительность 3D акселерации при использовании OpenGL ES 2.x API.
- display-screenshot
- Утилита записывает файл в формате BMP, содержащий скриншот изображения указанного дисплея.
- gf-vsync
- Приложение демонстрирует стандартный тест сигнала vsync монитора. По загрузке CPU можно судить о том, работают ли аппаратные vsync-прерывания контроллера дисплея.
Предыдущий раздел: Оконная подсистема Screen