Для Linux подготовлен механизм перенаправления рендеринга GPU на другое устройство вывода
Илья Хаджич (Hadzic) из Bell Labs представил реализацию виртуальных CRTC-видеоконтроллеров (VCRTC), позволяющих реализовать механизм перенаправления пикселей из фреймбуфера определённого GPU на другое устройство вывода. С использованием виртуального контроллера CRTC можно достаточно гибко манипулировать выводом информации в системах с несколькими видеокартами, абстрагируя GPU на котором осуществляется рендеринг и непосредственное устройство вывода.Механизм VCRTC может оказаться полезным при реализации поддержки гибридных систем с несколькими видеоадаптерами. Например, видеоподсистема NVIDIA Optimus позволяет на лету переключать вывод между встроенной энергоэффективной видеокартой на базе GPU Intel и мощной дискретной картой NVIDIA. С помощью VCRTC можно выполнять сложный рендеринг на GPU дискретной карте, а выводить информацию через интегрированную видеокарту. Кроме того, при подключении через порт USB внешнего видеоадаптера DisplayLink, можно сформировать сложную 3D-сцену с использованием GPU стационарной видеокарты, но вывести её на внешнюю видеокарту.
Практически, в качестве устройств вывода (CTD - Compression Transmission and Display) могут выступать любые устройства, которые способны сделать что-то полезное со сформированным набором пикселей, в том числе возможно создать синтетический драйвер для вывода через V4L2 или для записи в файл. Сформировав изображение на GPU, но использовав для вывода драйвер V4L2, возможно перенаправление сформированного на GPU потока по сети, с его последующей обработкой в в любом приложении, поддерживающем V4L2, например, в видеоплеере VLC.
CRTC отвечает за формирование синхросигналов и выполняют чтение содержимого фреймбуфера из видеопамяти. Виртуальный CRTC может быть реализован на уровне драйвера, который эмулирует поведение аппаратного CRTC. Перераспределением трафика между GPU и устройством вывода (CTD) занимается специальный менеджер виртуальных CRTC, который выполнен в виде DRI-модуля VCRTCM для ядра Linux. VCRTCM может оперировать как виртуальными CRTC, так и реальными CRTC существующих видеокарт. Для оптимизации производительности VCRTCM по возможности старается использовать для передачи данных DMA, а также обеспечивает поддержку таких специфичных для CRTC вещей, как видеорежимы, замещения страниц, аппаратный курсор и т.п.
Кроме DRI-модуля vcrtcm в рамках проекта разработана небольшая утилита vcrtcm_ctl, предназначенная для управления виртуальными CRTC. Также опубликована исчерпывающая документация по архитектуре и сборке. Код проекта доступен в рамках лицензии GPL. В настоящий момент поддерживаются только работа с драйвером Radeon и GPU R6XX, R7XX, Evergreen, Northern Island. В будущем планируется добавить поддержку драйверов Intel и Nouveau.
© OpenNet