SDV Media: управление дисплеями

SDV Media предоставляет доступ к имеющимся дисплеям для OEM-приложений с помощью API DRM для Linux.

Взаимодействие между компонентами DRM

  • Кадровый буфер — это источник пиксельных данных, поддерживаемый внешним буфером памяти.

  • Плоскость — это источник изображения, используемый CRTC. Она связана с буфером кадров и может представлять собой обрезанное изображение буфера кадров.

  • CRTC представляет собой общую схему отображения. Она может объединять несколько плоскостей для создания конечного видеосигнала и направлять его на несколько кодеров .

  • Кодер преобразует видеовыход от CRTC в формат, подходящий для конкретного разъема.

  • Обозначение "разъем" указывает на доступный разъем для подключения дисплея. Например, порт HDMI.

Для более подробного описания см.:

Поверхность API

Компания SDV Media предоставляет интерфейсы DRM для Linux. Хотя их можно использовать напрямую с помощью системного вызова ioctl , для разработки приложений рекомендуется использовать вспомогательную библиотеку пользовательского пространства. Например:

Настройте рендеринг на одном дисплее.

  1. Откройте DRM-устройство ( /dev/dri/card* ) и используйте API Linux DRM (например, через libdrm ) для выбора дисплея и его режима работы на основе его файлового дескриптора.

    Обычно хост-система предоставляет доступ только к одному виртуальному графическому процессору, который отображается как /dev/dri/card0 .

  2. Выделение переднего и заднего буферов с помощью API DRM Linux.

    Рекомендуется использовать gbm_bo_create() из minigbm и получить дескриптор файла DMA-BUF с помощью gbm_bo_get_fd() .

  3. Создайте GL-фреймбуферы, используя выделенные буферы.

    1. Создайте объект EGLImage из буфера DRM с помощью eglCreateImageKHR с использованием EGL_LINUX_DMA_BUF_EXT (из расширения EGL_EXT_image_dma_buf_import ).

    2. Создайте GL-текстуру и используйте glEGLImageTargetTexture2DOES (из расширения GL_OES_EGL_image ), чтобы установить в качестве хранилища текстуры объект EGLImage из предыдущего шага.

    3. Создайте GL-буфер кадров и используйте glFramebufferTexture2D , чтобы установить в качестве фоновой текстуры ту, которая была создана на предыдущем шаге.

  4. Для отрисовки кадра:

    1. Привяжите один из созданных GL-буферов кадров.

    2. Нарисуйте кадр, используя стандартные API GLES.

    3. Отобразить кадр на экране: используйте API Linux DRM ( drmModeAtomicCommit() ) для отправки события DRM_MODE_PAGE_FLIP_EVENT с дескриптором файла DMA-BUF, используемым привязанным GL-кадровым буфером.

Создание видеовыхода из нескольких слоев.

Для аппаратного ускорения многослойной (многоплоскостной) композиции мы полагаемся на то, что хост-система предоставляет каждый слой в виде отдельного DRM-коннектора (виртуального дисплея) и сопоставляет их с соответствующим аппаратным местоположением/конвейером.

Подробности см. в разделе «Настройка отображения на нескольких дисплеях» .

Настройте рендеринг на нескольких дисплеях.

  1. Откройте DRM-устройство /dev/dri/card* как в случае с одним дисплеем.

  2. Перечислите доступные разъемы для подключения дисплея.

    Каждый дисплей подключается как отдельный DRM- разъем DRM-устройства.

  3. Для каждого разъема дисплея:

    1. Выберите совместимый с разъемом CRTC. Для каждого разъема имеется список доступных кодировщиков, и каждый кодировщик указывает, с какими CRTC он может использоваться. Всегда будет как минимум один совместимый CRTC.

      1. Выберите самолет, совместимый с CRTC.

      2. Создайте DRM-буферы кадров, используя буферы графического процессора. Этот процесс аналогичен процессу для варианта с одним дисплеем.

      3. Подключите самолет, 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_W 16.16 фиксированная точка ширина прямоугольника исходного изображения в буфере кадра (пиксели, сдвинутые влево на 16 бит)
    самолет SRC_H 16.16 фиксированная точка высота прямоугольника исходного изображения в буфере кадра (пиксели, сдвинутые влево на 16 бит)
    самолет CRTC_X пиксели X-координата прямоугольника изображения назначения CRTC
    самолет CRTC_Y пиксели Y-координата прямоугольника изображения назначения CRTC
    самолет CRTC_W пиксели ширина прямоугольника изображения назначения CRTC
    самолет CRTC_H пиксели высота прямоугольника изображения назначения CRTC
  4. Войдите в цикл рендеринга:

    1. Дождитесь события перелистывания страниц на CRTC, прежде чем отрисовывать следующий кадр.

    2. Отобразите кадр и выведите его на экран, запланировав переключение страниц для заданного CRTC+кадрового буфера.