SDV Media предоставляет доступ к имеющимся дисплеям для OEM-приложений с помощью API DRM для Linux.
Кадровый буфер — это источник пиксельных данных, поддерживаемый внешним буфером памяти.
Плоскость — это источник изображения, используемый CRTC. Она связана с буфером кадров и может представлять собой обрезанное изображение буфера кадров.
CRTC представляет собой общую схему отображения. Она может объединять несколько плоскостей для создания конечного видеосигнала и направлять его на несколько кодеров .
Кодер преобразует видеовыход от CRTC в формат, подходящий для конкретного разъема.
Обозначение "разъем" указывает на доступный разъем для подключения дисплея. Например, порт HDMI.
Для более подробного описания см.:
Поверхность API
Компания SDV Media предоставляет интерфейсы DRM для Linux. Хотя их можно использовать напрямую с помощью системного вызова ioctl , для разработки приложений рекомендуется использовать вспомогательную библиотеку пользовательского пространства. Например:
-
drm-rscrate для Rust (рекомендуется), - Библиотека
libdrmдля C/C++. Страница руководстваdrm-kmsсодержит подробный обзор API и способов их использования.
Настройте рендеринг на одном дисплее.
Откройте DRM-устройство (
/dev/dri/card*) и используйте API Linux DRM (например, черезlibdrm) для выбора дисплея и его режима работы на основе его файлового дескриптора.Обычно хост-система предоставляет доступ только к одному виртуальному графическому процессору, который отображается как
/dev/dri/card0.Выделение переднего и заднего буферов с помощью API DRM Linux.
Рекомендуется использовать
gbm_bo_create()изminigbmи получить дескриптор файла DMA-BUF с помощьюgbm_bo_get_fd().Создайте GL-фреймбуферы, используя выделенные буферы.
Создайте объект
EGLImageиз буфера DRM с помощьюeglCreateImageKHRс использованиемEGL_LINUX_DMA_BUF_EXT(из расширенияEGL_EXT_image_dma_buf_import).Создайте GL-текстуру и используйте
glEGLImageTargetTexture2DOES(из расширенияGL_OES_EGL_image), чтобы установить в качестве хранилища текстуры объектEGLImageиз предыдущего шага.Создайте GL-буфер кадров и используйте
glFramebufferTexture2D, чтобы установить в качестве фоновой текстуры ту, которая была создана на предыдущем шаге.
Для отрисовки кадра:
Привяжите один из созданных GL-буферов кадров.
Нарисуйте кадр, используя стандартные API GLES.
Отобразить кадр на экране: используйте API Linux DRM (
drmModeAtomicCommit()) для отправки событияDRM_MODE_PAGE_FLIP_EVENTс дескриптором файла DMA-BUF, используемым привязанным GL-кадровым буфером.
Создание видеовыхода из нескольких слоев.
Для аппаратного ускорения многослойной (многоплоскостной) композиции мы полагаемся на то, что хост-система предоставляет каждый слой в виде отдельного DRM-коннектора (виртуального дисплея) и сопоставляет их с соответствующим аппаратным местоположением/конвейером.
Подробности см. в разделе «Настройка отображения на нескольких дисплеях» .
Настройте рендеринг на нескольких дисплеях.
Откройте DRM-устройство
/dev/dri/card*как в случае с одним дисплеем.Перечислите доступные разъемы для подключения дисплея.
Каждый дисплей подключается как отдельный DRM- разъем DRM-устройства.
Для каждого разъема дисплея:
Выберите совместимый с разъемом CRTC. Для каждого разъема имеется список доступных кодировщиков, и каждый кодировщик указывает, с какими CRTC он может использоваться. Всегда будет как минимум один совместимый CRTC.
Выберите самолет, совместимый с CRTC.
Создайте DRM-буферы кадров, используя буферы графического процессора. Этот процесс аналогичен процессу для варианта с одним дисплеем.
Подключите самолет, CRTC и разъем, а затем установите режим видео на CRTC.
С помощью API Atomic можно одновременно устанавливать режимы работы нескольких дисплеев, задавая следующие свойства DRM для каждого разъема, CRTC и набора плоскостей.
Полный список необходимых объектов:
Цель Свойство Тип Описание разъем CRTC_IDИдентификатор CRTC Идентификатор CRTC, который будет назначен коннектору. CRTC MODE_IDидентификатор блоба Идентификатор объекта свойств , созданного с помощью drmModeCreatePropertyBlob, содержащего структуруdrmModeModeInfoвыбранного видеорежима.CRTC ACTIVEбуль Значение trueозначает, что CRTC активен.самолет FB_IDидентификатор буфера кадров Идентификатор буфера кадров DRM для отображения на экране. самолет SRC_Xпиксели X-координата прямоугольника исходного изображения буфера кадра самолет SRC_Yпиксели Y-координата прямоугольника исходного изображения буфера кадра самолет SRC_W16.16 фиксированная точка ширина прямоугольника исходного изображения в буфере кадра (пиксели, сдвинутые влево на 16 бит) самолет SRC_H16.16 фиксированная точка высота прямоугольника исходного изображения в буфере кадра (пиксели, сдвинутые влево на 16 бит) самолет CRTC_Xпиксели X-координата прямоугольника изображения назначения CRTC самолет CRTC_Yпиксели Y-координата прямоугольника изображения назначения CRTC самолет CRTC_Wпиксели ширина прямоугольника изображения назначения CRTC самолет CRTC_Hпиксели высота прямоугольника изображения назначения CRTC Войдите в цикл рендеринга:
Дождитесь события перелистывания страниц на CRTC, прежде чем отрисовывать следующий кадр.
Отобразите кадр и выведите его на экран, запланировав переключение страниц для заданного CRTC+кадрового буфера.