Переключающаяся графика скоро в Linux!

По прошествии четырех лет инженер Red Hat и участник Fedora и Debian David Airlie и инженер AMD и участник Debian Alex Deucher представили патчи для поддержки GPU offloading для Intel, NVIDIA и ATI видеокарт с помощью технологии DMA-BUF/PRIME. Ожидается поддержка в видеодрайверах для ARM-платформ.

Расскажем немного историю вопроса и начнем с самого начала. Как вы знаете, прямо сейчас на замену старой доброй технологии из 1987 года, X11 (X Window System), разрабатывается некий Wayland (мы о его развитии периодически пишем). Хейтеры, как и в случае с systemd, изливаются потоками ненависти, но, опять-таки, как и в случае с systemd, очень подозрительно, что признанные специалисты отрасли приветствуют изменение, а анонимные аналитики Linux-ресурсов ругают. Это, разумеется, ничего не доказывает, но дает повод для раздумий. Так вот, мало кто представляет, насколько убог и насколько уже устарел X11. А вы знаете, что в нем в принципе нет прозрачности (зато есть сетевая прозрачность!), нет OpenGL (есть с помощью расширения протокола, но это не работает по сети), нельзя создавать непрямоугольные (например, овальные) окна, нельзя поворачивать их на произвольные углы, несмотря на рассказы про сетевую ориентированность, невозможно отключиться от сессии, а потом подключиться заново - хороша "сетевая прозрачность", не учитывающая пропадания сети! А знаете ли вы, что DRI был придуман специально, чтоб бороться с сетевой моделью иксов? А вы в курсе, что еще в конце 1990x считалось, что графическая подсистема в Linux быстрее, чем в Mac OS и Windows? Вот только с тех пор конкуренты изменялись под стать изменениям оборудования и запросам пользователей, а иксы так и застряли с моделью развития из 1987 года ("хуже == лучше", "вместо реализации фичи добавь возможность пользователям приделать костыль на скорую руку" - это не шутка, это действующие руководящие принципы модели X Window System). X-server в Linux не может работать не от root, сетевая прозрачность выродилась в перекачку битмапов по сети кроссплатформенными графическими тулкитами. Почти никогда X11 на современных компьютерах не работает, как X11 - используются различные ухищрения, такие, как SharedMemory и DRI, чтоб обойти "тру-юниксвэйные иксовые" процедуры записи пиксмапов в unix-сокет и записывать их прямо в память видеокарты, в обход юниксвэйности. API X11 (Xlib) тоже не является эталоном - мы не будем говорить об его синхронности, т.к. асинхронность в X11 критиковалась еще специалистами DEC, и, видимо, тут есть невидимые для нас, как для неспециалистов, некие проблемы в обоих подходах. Ну а вы в курсе, что в Xlib все ошибки по умолчанию фатальные и приводят к закрытию приложения? Например, использование некоторыx функций MIT-SHM в X11-приложении, запущенном по сети, очень вероятно, что закончится ошибкой и вообще не позволит вам запустить его. В общем, с API можно что-то сделать, но, как и в случае с заменой init-системы, в живой процесс развития мертвой хваткой вцепились полумертвые монстры из прошлого (можно смело предполагать, что процесс адаптации Wayland также будет сдерживаться устаревшими Unix-системами и FUD-ом, распространяемым представителями маргинальных Linux-дистрибутивов). Более того, современные приложения используют d-bus, а он совершенно несетепрозрачный, и приложение, активно его использующее, не сможет работать правильно по сети (удивительно, но никто из пользователей KDE этого не заметил до сих пор - видимо сетевая прозрачность давно уже "не нужна"). Пора сказать открыто - архитектура иксов более не соответствует требованиям времени, и ее необходимо менять. Процитируем Julien Danjou, участника проекта Debian, X11-разработчика и автора Awesome: It's likely impossible to fix X11 (properly). But there's no reason to keep X. ...I don't think anybody should do X specific programming nowadays anyway. People should stop writing window managers, now, seriously. If they really want to work on this kind of low-level things, yes, I think putting effort in Wayland is better, so it happens.

Одной из проблем, которую практически невозможно оказалось решить в рамках действующей архитектуры X11 (понадобилось почти четыре года во времени которых было предложено несколько подходов, все, кроме одного, оказавшиеся тупиковыми путями), это то, как использовать несколько видеопроцессоров (например, SLI или CrossFire - две связанные видеокарты, работающие в параллель, либо вспомогательная видеокарта, включающаяся, когда не хватает электропитания, либо USB-видеокарта, периодически подключаемая и отключаемая). В Wayland изначально учитывается то, что и видеовыходы, и видеопроцессоры, и устройства ввода будут динамически подключаться и отключаться, а в X11 оказалось, что костыль на это не так то и просто прикрутить.

Проблему озвучил инженер Red Hat и участник Fedora и Russian Fedora (проверьте по статистике коммитов на Ohloh!) Adam Jackson еще в конце 2008 года, признав, что решение будет непростым. Прямая речь: "Getting this to work well should actually be a lot of fun, and there's lots of opportunity to sweep away old bad design and come up with something good.". Какие-то костыли для исправления ситуации с работой нескольких видеокарт в видеодрайверах были предложены спустя год-полтора. Сначала David Airlie написал в 2010 году vga_switcheroo, который позволял перезапускать иксы, выбирая видеокарту. Это решение, несмотря на его очевидную кривизну, реально использовалось в Ubuntu и Gentoo (жить ведь как-то надо), но оно не работает с проприетарным драйвером NVIDIA. Для этих карт, в т.ч. и для открытого видеодрайвера, было предложено иное решение (тоже основанное на перезагрузке иксов, но невидимое для пользователя - на более мощной видеокарте запускается свой, отдельный X-сервер, изображение с которого "проксируется" на X-сервер, постоянно запущенный на слабой видеокарте) - Bumblebee, прославившееся фееричным багом, уничтожавшим директорию /usr. Eсли б они использовали пакетный менеджер и собирали бы его в пакет в изолированном окружении, и не от root, то этот баг не отразился бы на столь огромном количестве наивных пользователей Ubuntu, которые привычно ставят не глядя самое различное ПО откуда попало, но там весь проект страдает от проблем с software engineering, как обычно в наколеночных проектах.

Вскоре к решению проблемы (написанию очередного костыля для иксов - иксы состоят из костылей, повторимся, и это полностью соответствует их философии) привлекли тяжелую артиллерию - инженеры самых разных компаний начали думать, как обойти это ограничение устаревших X11? После завершения поигрушек с vga_switcheroo David Airlie предложил proof-of-concept нового подхода, который он назвал PRIME - GPU offloading. Суть в том, что одна, например менее прожорливая электрически, видеокарта работает всегда, а иногда она будет передавать задачи на обработку более мощной видеокарте. Это уже было что-то. Правда, из-за ограничений X11 требовалось, чтоб драйвер видеокарты знал о драйверах для других видеокарт. Процитируем Airlie: "To make this as good as Windows we need to seriously re-architect the X server + drivers..."

Еще через год, в конце 2011, David Airlie успешно продемонстрировал GPU offloading на примере подключения на лету USB-видеоадаптера DisplayLink. Решение все еще требовало разных хаков тут и там, и автор прямо заявлял, что он не ожидает скорого включения поддержки этой технологии в X11, но в этот раз он начал более активно работать.

Примерно в это же время инженеры Linaro, Samsung и Texas Instruments предложили первый вариант того, что они назвали DMA-BUF, технологии для совместного доступа к памяти различных видеоустройств - V4L, X11, видеокамеры и т.п., которая позволит при обмене данными между этими устройствами вместо пересылок огромных серий байтов в ядро и обратно просто обмениваться адресами этих данных. David Airlie быстро оценил перспективность такого подхода, и следующий релиз своего PRIME уже выпустил, основанный на DMA-BUF. Темпы внедрения ощутимо ускорились, и последним куском мозаики был VGEM, представленный Adam Jackson, который позволит использовать различные DMA-BUF оптимизации устройствам, не имеющим DRM-драйвера (LLVMpipe). Все было готово - осталось лишь замотать все изолентой.

И вот, наконец, возвращаемся к первому абзацу. David Airlie и Alex Deucher собрали все куски вместе, и теперь ничего не останавливает Open Source коммьюнити от написания патчей для поддержки SLI/CrossFire или Optimus. Заметьте, как тяжело становится догонять проприетарные видеоподсистемы, нескованные цепями стандартов прошлого.

Что до Wayland, то говорить не о чем, т.к. в нем все это и так будет работать из коробки. Когда его допишут, разумеется - ждем, надеемся и верим! А пока почитайте Wayland anti-fud от того разработчика Collabora, который переносит Wayland на Android, о чем мы уже говорили.