Экспериментальная реализация виртуальных CRTC-видеоконтроллеров для Linux

Илья Хаджич (Hadzic) из Bell Lab представил реализацию виртуальных CRTC-видеоконтроллеров (VCRTC), позволяющих реализовать механизм перенаправления пикселей из фреймбуфера определённого GPU на другое устройство вывода. С использованием виртуального контроллера вывода можно достаточно гибко манипулировать выводом информации в системах с несколькими видеокартами, абстрагируя GPU на котором осуществляется рендеринг и непосредственное устройство вывода.

Механизм VCRTC может оказаться полезным при реализации поддержки гибридных систем с несколькими видеоадаптерами. Например, видеоподсистема NVIDIA Optimus позволяет на лету переключать вывод между встроенной энергоэффективной видеокартой на базе GPU Intel и мощной дискретной картой NVIDIA. С помощью VCRTC можно сформировать сложную 3D-сцену с использованием GPU стационарной видеокарты, но вывести её на дополнительную внешнюю видеокарту, например, на подключенный через порт USB внешний видеоадаптер DisplayLink.

Практически, в качестве устройств вывода (CTD - Compression Transmission and Display) могут выступать любые устройства, которые способны сделать что-то полезное с сформированным набором пикселей, в том числе возможно создать синтетический драйвер для вывода через V4L2 или для записи в файл. Сформировав изображение на GPU, но использовав для вывода драйвер V4L2, возможно перенаправление сформированного на GPU потока по сети с его последующим просмотром в видеоплеере, таком как VLC, или в любом другом приложении, поддерживающем V4L2.

CRTC отвечает за формирование синхросигналов и выполняют чтение содержимого фреймбуфера из видеопамяти. Виртуальный CRTC может быть реализован на уровне драйвера, который эмулирует поведение аппаратного CRTC. Перераспределением трафика между GPU и устройством вывода (CTD) занимается специальный менеджер виртуальных CRTC, который выполнен в виде модуля VCRTCM для ядра Linux, и может оперировать как виртуальными CRTC, так и реальными CRTC существующих видеокарт. Для оптимизации производительности VCRTCM по возможности старается использовать для передачи данных DMA, а также обеспечивает поддержку таких специфичных для CRTC вещей, как видеорежимы, замещения страниц, аппаратный курсор и т.п.

В рамках проекта разработан специальный DRI-модуль vcrtcm для ядра Linux, небольшая утилита vcrtcm_ctl для управления виртуальными CRTC и исчерпывающая документация по архитектуре и сборке. Код проекта доступен в рамках лицензии GPL. В настоящий момент поддерживаются только работа с драйвером Radeon и GPU R6XX, R7XX, Evergreen, Northern Island. В будущем планируется добавить поддержку драйверов Intel и Nouveau.

©  OpenNet