Wayland на замену X Window System

    В предыдущем посте мы узнали, почему X Window System — один из самых успешных проектов с открытым кодом в истории, пора заменить на новое решение для графического окружения Linux. В этой же статье мы узнаем, каков из себя Wayland — наиболее вероятный кандидат на замену X.





    Глоссарий Wayland


    Имеет смысл сначала разобраться с некоторыми определениями и терминологией.


    Compositor — Композитный оконный менеджер является одним из центральных понятий Wayland и вокруг него. Нигде толком не определено, что это такое, но термин этот используется так, как будто все всё знают. Во всяком случае на русском языке никакого определения я так и не нашел. К счастью примеры-таки проясняют суть дела. Вот их список в контексте Wayland:


    • KWin — дисплейный сервер KDE,
    • Mutter — дисплейный сервер GNOME,
    • Weston — эталонный композитный менеджер для Wayland,
    • Enlightenment — графическая оболочка рабочего стола,
    • Marco — оконный менеджер MATE.

    Как мы видим, это не что иное как знакомые нам оконные менеджеры, хотя на самом деле нет. Это дисплейные сервера, которые все-таки отличаются по своему функционалу от WM. Первые взаимодействуют с пользовательскими устройствами ввода-вывода, с железом, управляют потоком данных клиентских программ. Вторые же отвечают за отображение окон и их размещение в системе оконного интерфейса.


    Иллюстрация со страницы в википедии.





    Но сказать, что есть четкая смысловая и терминологическая граница между всему этими серверами, менеджерами и композиторами, было бы обманом. Например KWin является и дисплейным сервером и WM, точно так же как и Enlightenment. Для данной статьи композитный оконный менеджер (в сокращении КОМ) и дисплейный сервер будут эквивалентами термина Compositor.


    $ eix -c enlightenment; eix -ce kwin
    [N] x11-wm/enlightenment (1.0.17): Enlightenment Window Manager (e16)
    [I] kde-plasma/kwin (5.8.5(5)@01.02.2017): KDE window manager

    Композитный менеджер, он же дисплейный сервер может обозначаться еще как композитный оконный менеджер.


    $ eix -c mutter
    [N] x11-wm/mutter (3.20.3): GNOME 3 compositing window manager based on Clutter

    Weston — Эталонный дисплейный сервер протокола Wayland. Недавно вышла вторая версия КОМ-а.
    EGL — платформонезависимый эквивалент программных интерфейсов OpenGL GLX/AGL/WGL, разрабатываемый Khronos Group. EGL предоставляет инфраструктурный набор для быстрой настройки приложения и инициализации сцены.


    • Механизмы для создания областей рендеринга (окно, пиксельная карта, пиксельный буфер), чтобы клиентские API могли на них рисовать и разделять их.
    • Создание графического контекста для клиентских API.
    • Синхронизация отрисовки клиентскими API а также родными API рендеринга платформы.

    EGL в отличие от GLX/AIGLX умеет выполнять лишь direct rendering, в котором приложения через DRI2/DRI3 могут безопасно и быстро получать доступ к видеоаппаратуре минуя X сервер.


    GLES — Подмножество OpenGL, разработанное специально для встраиваемых систем — мобильных телефонов, планшетов, компьютеров, игровых консолей.


    Архитектура Wayland


    Итак, что представляет собой Wayland? Так же как и в случает с X Window System, речь идет о протоколе и его реализации. Wayland — это протокол взаимодействия между КОМ и клиентами, а также его библиотечная реализация в Си. В роли клиента может выступать пользовательское приложение, X сервер или другой дисплейный сервер.


    • Цель: радикально упростить графическую среду Linux по сравнению с иксами.
    • Использует Unix Domain Sockets, сетевой прозрачности нет.
    • Главным образом использует EGL и DRI.
    • Устройства ввода-вывода управляются полностью из ядра.
    • Распределение буфера и отрисовка полностью на стороне клиента.

    На самом нижнем уровне протокола клиент и КОМ синхронизируют сообщения, обмениваются упорядоченными объектами, используя средства IPC библиотек libwayland-client и libwayland-server. На этом уровне не определены способы управления оконным интерфейсом — только сообщения, передаваемые через Unix Domain Sockets, объекты и события.


    +-------------------+           +-------------------+
    |                   |           |                   |
    | Client            |           | Compositor        |
    +-------------------+           +-------------------+
    | libwayland-client |           | libwayland-server |
    +-------------------+           +--+----------------+
                     |                 |
                     |  Wayland        |
      User space     |  protocol       |
    +---------------------------------------------------+
    | Kernel space   |       +---+     |                |
    |                +------>|IPC|<----+                |
    |                        +---+                      |
    +---------------------------------------------------+

    Объекты создаваемые клиентом представлены структурой wl_proxy, содержащей идентификатор сообщения передаваемого серверу через сокет, void указатель данных и указатель на статичный объект wl_interface. Отправляются сообщения с помощью структуры wl_proxy_marshal.


    static inline void
    wl_surface_attach(struct wl_surface *wl_surface, struct wl_buffer *buffer, int32_t x, int32_t y)
    {
      wl_proxy_marshal((struct wl_proxy *) wl_surface, WL_SURFACE_ATTACH, buffer, x, y);
    }

    Wayland — асинхронный протокол, объектно ориентированный и нацеленный на обработку сообщений. Сообщение, передаваемое от клиента серверу, есть вызов, а в обратную сторону — событие. Каждое сообщение состоит из 32-битных слов, значения представлены в порядке следования байтов хоста.


    Иллюстрация с главной страницы Wayland.





    Как взаимодействуют эти блоки?


    1. Ядро регистрирует событие и отправляет КОМ-у.
    2. КОМ в своем графе сцены находит окно, которому следует доставить данное событие и он точно знает какой тип трансформации следует применить к объекту. КОМ транслирует экранные координаты в локальные для данного окна путем обратной трансформации.
    3. Клиент, отрабатывает событие, обновляя область графического интерфейса, производит рендеринг и извещает КОМ об изменениях.
    4. КОМ собирает с клиентов все данные по территориям, в которых содержимое зависимого буфера отлично от участка поверхности, и затем перекомпонует экран. Далее, дисплейный сервер подгружает новую страницу, с помощью ioctl вызова адресованного KMS.

    А как происходит рендеринг? Клиенты самостоятельно производят отрисовку своих окон в отдельном буфере, передавая информацию об обновлениях дисплейному серверу, который комбинирует содержимое буферов разных приложений для формирования итогового вывода с учетом возможных нюансов, таких как перекрытие окон и прозрачность.


    Wayland vs. X


    Так чем-же, все-таки отличается в лучшую сторону Wayland? Давайте пробежимся по основным пунктам, чтобы понять ради чего все затевалось. Для меня лично достаточно факта отсутствия файла настройки xorg.conf. Впрочем плодотворное влияние прямых рук на правку этого файла уже обсудили в комментариях к предыдущему посту.


    1. Версии пронизывают протокол сверху донизу. Каждый интерфейс имеет ту или иную версию, каждый объект протокола реализует определенную версию своего интерфейса. Это исключает ситуацию с постоянными конфликтами версий X из-за того, что согласование версий привязано к клиентам, а не к соединению. Если приложение поддерживает одну версию расширения, тулкит другую а X11 третью, то невозможно предсказать, что в итоге получает приложение.
    2. Работа с устройствами ввода в Wayland сильно похожа на Xinput 2.2 минус нагромождения отжившего свой век кода и Master/Slave порядком между устройствами ввода. Глобальный объект seat, т. е. место определяет группу устройств ввода, включая мышь, клавиатуру и сенсорный экран. Кошмарные проблемы с мультитачем исчезнут.
    3. Wayland в отличие от X не имеет API для отрисовки, и соответственно не занимается художествами. Все что ему требуется — буфера полные клиентских пикселей, а дальше он ими дирижирует так, чтобы приложение А не напортачило чего-нибудь в буферах, содержащих картинки приложения Б. Клиенты определяют какие пиксели будет находится в буферах и в ответе за изображение, которое высветится на экране!



    1. Wayland минимален. Вспомним, чем был X — государством в государстве, с полным набором функций ядра ОС и даже имел свой сервер печати, после того, как кому-то в голову взбрела идея добавить поддержку печати для glxgears. Так вот, всего этого в Wayland нет и никогда не будет. Основную тяжесть тащат на себе клиенты и это славно, так как они сами не захотят загибаться под тяжестью совместимости элементов UI 30-летней давности.
    2. Обязательная компоновка (compositing). Это не значит, что 3D эффекты неизбежны. Компоновка означает, бесшовное изображение, которое не трясется и не прыгает. Девиз Waylandни единого разрыва каждый кадр прекрасен. Каждый пиксель на своем месте, как клиент задумал и осуществил. Для сравнения, как работает расширение X Composite? Для эффектов рабочего стола, GL компоновка вполне тянет лямку, но во время просмотра видео в браузере сразу же начинаются проблемы. Окно браузера и подокно с флаш плеером никак не синхронизированы. Для них события обрабатываются независимо и остается только надеяться, что два потока не будут сильно разбегаться во времени. По этой причине во время прокрутки окна с активным видеороликом Youtube, изображение может прыгать и дергаться.
    3. Никаких шрифтов на сервере, клиенты сами справятся. Уже справляются.
    4. X страдает беспамятством, из-за чего и нужен пресловутый xfree86.conf/xorg.conf, чтобы запомнить настройки для двух и более мониторов, графических карт. Мы ведь не будем скучать без этих убойных фич в грядущей пост-X эпохе?

    Ошибочные суждения об X и Wayland


    Существует ряд устойчиво неправильных мнений на сей счет.


    • X юниксвейный. Ну как сказать, принципу делай что-то одно, но делай это хорошо Unix громоздкая всеядность иксов явно противоречит.
    • Сетевая прозрачность X. Да, это было-было, но прошло с тех пор как X пересел на DRI2 и разделяемую память, а работать по сети не умеют оба. Все крутится на медлительном синхронном Xlib, и выхлоп получается как с VNC, если не хуже.
    • Wayland пишут те, кто не понимает X. Ничего нет более далекого от правды — его пишут те разработчики X, кто устал постоянно латать дыры и чинить костыли. Хороший пример Daniel Stone, один из трех людей на земле, которые точно знают как работает привязка клавиатуры на X.
    • Wayland навязывает 3D. Это не так, обязательна только компоновка. Об этом уже было сказано выше.

    Использованные материалы и полезные ссылки


    The Wayland Situation: Facts About X vs. Wayland
    Статус разработки прослойки для обеспечения работы X11-приложений поверх Wayland
    Документация Wayland

    Поделиться публикацией

    Комментарии 50

      +2
      И когда же это счастье придет в основные дистрибутивы линукса?
        0
        В «Федорином горе» уже давно.
          0
          И как оно? Для повседневной работы уже гут?
            0
            Иногда менюшки не в том месте появляются.
              +2
              В Х-ах с менюшками тоже какие-то траблы, они заграбастывают себе весь ввод.
              0

              Да, без особых косяков.
              Напрягает только этот баг https://bugs.freedesktop.org/show_bug.cgi?id=99235

                0
                Пишут пофиксили, как сейчас? Кстати, по VNC из коробки к последней Федоре на Wayland уже можно цепляться?
          0
          Странно, а я всегда считал, что композитный оконный менеджер — это тот, который рендерит во внеэкранный буфер (например, Compiz для иксов или DWM из Windows Vista+).
            +1
            А мне всегда казалось, что он собирает внеэкранные буферы и рендерит в свой, уже экранный. Но я могу ошибаться.
            Надо в комменты какого-нибудь разработчика под Х-ы.
              0
              Я имел ввиду отличия от обычного, но да, ваша формулировка точнее. На самом деле, иксы тут даже ни при чем, эта терминология используется во многих графических программах.
            –4
            > Все крутится на медлительном синхронном Xlib, и выхлоп получается как с VNC, если не хуже.

            Так VNC — это и есть X-сервер. Уйдут X-сервера, уйдёт и VNC.

            Кстати, интересно, под вейланд есть аналог xpra?
              +7
              Вы что-то путаете. vnc — это совсем не X-сервер. Если бы это было так, как вы бы обьяснили vnc сервера на той же винде? Или x11vnc под линукс?
                –1
                Под линуксом интерфейсом vnc является x11. Приложение, которое запущено внутри vnc как бы видит x11 сервер, который так или иначе предоставляет vnc.
                  +3

                  Нет, конечно же нет. Вы неправомерно обобщаете одну из возможных реализаций vnc сервера.
                  Один вариант — это шаринг текущего рабочего стола, как в винде. Этот вариант предполагает граббинг экрана, что требует как определённых привелегий для приложения, так и наличия определённого набора библиотек в системе, которые позволяют это делать.
                  Другой вариант, это о чём говорите вы — vnc-сервер запускается как отдельная иксовая сессия и, собственно, её и представляет — просто отрисовка идёт не на экран, а в буфер vnc-сервера. Но это вовсе не значит, что всё так работает. Нет, vnc-сервер надо запускать отдельно и специально. И сетевой протокол vnc (он называется rfb) ничего общего с х-протоколом не имеет. Vnc просто передаёт пожатые битмапы в одну сторону, а события мыши и клавиатуры в другую.

                    –1
                    > Один вариант — это шаринг текущего рабочего стола, как в винде.

                    Не слишком полезный вариант. Но в винде лицензионные ограничения не дают запускать отдельные сессии — так что там понятно.

                    > И сетевой протокол vnc (он называется rfb) ничего общего с х-протоколом не имеет

                    Я этого и не говорил. Меня интересует как будет происходить общение приложений с vnc. Если отказаться от X-сервера, сможет ли vnc эмулировать вейланд?
                      0
                      Один вариант — это шаринг текущего рабочего стола, как в винде.
                      Не слишком полезный вариант

                      Отнюдь нет. Распространённый вариант — хелпдеск рулит машиной клиента, помогает решить проблему.


                      Я этого и не говорил. Меня интересует как будет происходить общение приложений с vnc. Если отказаться от X-сервера, сможет ли vnc эмулировать вейланд?

                      Так, вроде, нет особых проблем запускать отдельную вейланд сессию у которой не настоящий экран, а vnc-шный фреймбуфер. Wayland сервер с virtual framebuffer же существует. Вот туда и приделываются vnc кодеки. Другое дело, что, возможно, ещё ни кто из разработчиков vnc-шек не сделал ничего такого, ну, так это дело времени и желания кого-нибудь оплатить работу.

              +3
              Сетевая прозрачность X. Да, это было-было, но прошло

              Ну не знаю, ещё в прошлом году активно тыкал проброс иксов через ssh — отлично работает, скорость быстрая, прокрутка плавная, лагов нет, ни в какое сравнение с тормознутым vnc — и из-за этого отсутствие сетевой прозрачности в wayland меня сильно печалит

                0
                Не знаю, что вы запускали, но во всяких GTK сейчас иксы только для создания OpenGL-контекста используются. Весь рендер идет внутри движка, так что в сетевой прозрачности нет никакого смысла.
                  0

                  Именно GTK-приложения и запускал, да. Как GTK2, так и GTK3 — все летали. А вот Qt подлагивал, но, к счастью, большинство используемых мной программ используют нелагающий GTK)

                  0
                  А через какую сеть это было?
                  По поводу отсутствия прозрачности, думаю, не стоит печалиться. Вроде уже что-то такое пилят. Можно на сервере гонять КОМ, который вместо экрана будет жать картинки и слать их по сети.
                    0

                    Через что-то с низким пингом, уже не помню точно. Иксы — они такие, скорость им почти не важна, зато важен низкий пинг, иначе начинает слоупочить (в частности, скорость прокрутки в sublime text через сеть ниже чем на локалхосте)

                      0
                      скорость им почти не важна

                      Скорее это было так, когда использовались Х примитивы. Сейчас скорость очень даже важна, т.к. по сети летает картинка картинка.
                      А пинг важен, согласен.
                        0

                        Ну не знаю, я тоже вполне логично думал что скорость важна, однако скроллинг в gtk-приложниях абсолютно плавный даже на сетях меньше мегабита и evince рисует пдфки тоже шустро (хотя ощутимо медленнее чем на локалхосте, но на юзабельности не сказывается)

                          0
                          Кстати, про скроллинг интересно, может ли контент скроллируемой области кешироваться на стороне Х-сервера?
                          ЕМНИП, в Х11 могут быть не только окна верхнего уровня, но и вложенные в них.
                          Есть ли там что-то вроде viewport для окна? Т.е. чтобы контент при скроле не пересылался от клиента, а сдвигался Х-сервером, клиент бы при этом только менял координаты сдвига.
                            0

                            Моих знаний не хватит чтобы это проверить, я простой юзер)

                              0
                              Разумеется, в иксах есть дочерние окна. Можете поискать их через xwininfo. Но в современных GUI-тулкитах от этой фичи изо всех сил стараются отказаться.
                                0
                                Да, что-то такое слышал, но не помню, почему отказываются.

                                Ещё всплыл вопрос про кеширование. Заметил достаточно давно.
                                Если программу на GTK или QT остановить, то содержимое окна повреждается и не регенерируется (если провезти другим окном поверх окна с остановленным приложением, композитинг отключён), а у приложений из состава GNUStep содержимое окна сохранялось.
                                Т.е. есть какое-то кеширование на стороне сервера. Интересно, почему не везде используется?
                                  0
                                  Да, что-то такое слышал, но не помню, почему отказываются.
                                  Там было много проблем. Прозрачность, мерцание, производительность. Если вы загляните в исходники GTK/GDK, то найдете там класс GdkWindow, который инкапсулирует некоторую область для рисования и может реагировать на внешние события (например, если провести над ним курсор). Раньше этот класс был реализован через дочерние окна иксов, сейчас есть альтернатива в виде своей реализации. Также на Wayland, если я не ошибаюсь, нету такой возможности. Win32-реализация не использует нативные дочерние окна вообще и никак, потому что там творится полный «ад и Израиль» (даже сама Microsoft с начала 2000-ых не использует «нативный» API в приложениях вроде IE или офиса, гуглите на тему «win32 windowless controls»).

                                  Т.е. есть какое-то кеширование на стороне сервера. Интересно, почему не везде используется?
                                  Нет, это «фишка» GTK/Qt. Там на каждую свистелку-перделку приходится по отдельному буферу, в который реально рисуется содержимое. Когда вы инвалидуете какую-то область окна, то GTK/Qt восстанавливает ее из этого буфера. Хотя изначально это затевалось для избавления от мерцания…
                                    0
                                    Просто хочу уточнить свой ответ. В иксах все-таки есть «кеш», называется «backing store». Но его почему-то никто не использует и информация о нем почти не гуглится.
                              0
                              Поставил сейчас на сервер (до которого 56 мсек) файловый менеджер thunar.
                              В принципе, пользоваться можно, но ооооочень не комфортно. Ощущения, как от игры в шутер на старом компе при 10 FPS.
                              При примерно таком же пинге (52) RDP с включенным RemoteFX работает ощутимо лучше. пару раз даже так графический редактор запускал для небольших манипуляций.
                                0

                                Завтра попробую повторить на чём-нибудь медленном

                                  0
                                  Как бы это ещё объективно замерить? Понятие комфорта у всех разное. Кому-то и за обычным монитором не комфортно, 144 Гц надо (да, это немного из другой оперы, просто как пример).
                                    0

                                    Ну я субъективно наблюдал 60фпс, и мысли не было о том что это может быть некомфортным) Завтра попутно видео запишу, там кадры посчитаю

                                      0

                                      Хех, на 3G с пингом 60-100 мс и правда тормознутенько, но жить можно. А провод с пингом до 10 мс уже вполне юзабелен и даже в гимпе что-то порисовать можно (хотя кисточка иногда отстаёт, наверно из-за скорости всего мегабит)

                                  0
                                  Попробуйте 8-bit цвет.
                          0
                          В локалке тыкали? Там очень важен низкий пинг, чем он выше, тем тормознутее.
                            0

                            В районе 20-40 мс пинг был вроде

                          0
                          А что с либами, на которых построены почти все X11 приложения ( gtk, qt, etc )? Они уже поддерживают Wayland или какие-то переговоры с ними идут? Или все только на уровне эмуляции X11-сервера ( какой оверхэд кстати? )
                          И что с коммерческими ( Стим & co ) продуктами, тоже через эмуляцию?
                            +3
                            С разморозкой. GTK (точнее, GDK) уже давно от них не зависит. В Qt5 даже есть возможность запилить свой Wayland-сервер «из коробки».
                              0

                              Актуальные версии Gtk и Qt поддерживают wayland из коробки, у старых версий(к примеру GTK2) поддержка отсутствует, приложение запускается в режиме эмуляции X11-сервера. Про оверхэд не в курсе, субъективно он особо не осущащется, но это не значит что его нет...

                              +2
                              У меня в отношении wayland'а есть одно пожелание. Сейчас я могу сказать ssh -XYC user@server и запускать на сервере приложение с рендерингом локально. Вот то же самое мне хочется и от wayland-приложений. Без запуска «локального десктопа» на сервере. Как именно оно будет сделано — дело десятое, но remote X application — пусть кривой и плохой, но всё же есть и работает в 90% случаев. Даже видео умеет играть.
                                0
                                Одно окно — один битмап — это грустно на самом деле. Опять будут героически решать проблемы прокрутки. Хотя ещё в древних макосях всё было сделано правильно — вывод через OpenGL, одна текстура на окно, другая на прокручиваемый контент, либо полной длинны, либо в 3-4 экрана, и потом просто меняем UV-оффсет
                                  0

                                  Я тоже не понимаю радости от постоянного и полного формирования битмапа окна.
                                  Если окно видно на 10% (только краешек), так как на 90% перекрыто другими окнами, то зачем рендерить эти 90%, тем более если в эти 90% может входить какая-нибудь тяжёлая векторная графика (типа ГИС) или вывод видео.


                                  Приложение бы могло не рендерить лишнее, если бы знало, что этот участок окна не виден. Но Wayland заставляет тратить лишние ресурсы и рендерить каждое окно на 100%. Поправьте, если я не прав.

                                    +1

                                    Однажды юзер альт-табнется в перекрытое окно, и тут битмап сильно поможет: без него все эти тяжёлые векторы начнут перерисовываться с нуля, и первое, что увидит юзер — не вектор, а серое окно, которое будет оставаться серым, пока вектор не отрисуется — такое часто можно было наблюдать в каких-нибудь WinXP или любых иксах без композитинга. Если же битмап с готовым вектором будет, то он отобразится сразу, что сильно повышает юзерфрендли. Плюс к этому если верхнее окно двигать поверх нижнего окна, то за окном будет оставаться серый след (или в запущенных случаях след из содержимого окна), так как нижнее окно будет не успевать перерисовываться. Лично мне не жалко небольшой нагрузки на проц и память ради того, чтобы подобного не происходило.


                                    А держать запущенное видео в фоне вообще не надо, такое окно стоит хотя бы свернуть)

                                  0
                                  Wayland навязывает 3D. Это не так, обязательна только компоновка. Об этом уже было сказано выше.

                                  А без неё совсем никак? Дело в том, что при включенном композитинге всегда навязывается VSync, по крайней мере, из моей практики и из написанного в статье. А VSync даёт ощутимый input lag в шутерах, например. Играешь будто в киселе. Если никак нельзя его форсированно выключить, то это ставит крест на соревновательных FPS под линуксом.

                                    0
                                    Для полноэкранных окон компоновка может быть отключена.
                                      0

                                      И VSync тоже отключится? Я немного не в курсе, но вроде бы есть какое-то различие между фулскрином и borderless windowed. В Windows слышал жалобы, мол, хотим borderless, чтобы Alt+Tab был то ли быстрее, то ли безболезненнее, не помню, а на Linux для меня «настоящий» фулскрин характеризовался захватом ввода, т.е. Alt+Tab или аналог из оконного менеджера не работал. Но скорее всего, там такое же окно размером с текущее разрешение экрана, а граббинг — просто побочный эффект организации ввода в конкретной игре.


                                      Я почему спрашиваю — сам пользуюсь Compton именно для форсирования VSync, и хотя там есть опция unredirect fullscreen windows, это не влияет на VSync, он остаётся включен. Хоткеем можно включать/выключать Compton, когда нужно отсутствие тиринга или напротив, отсутствие input lag, так что тут не проблема. Но на Wayland просто так выключить его уже не получится.

                                        0
                                        Попробую проверить как время будет. Достоверных источников не нашел, но вроде бы способ есть. Похоже, что не все display server'а это умеют.
                                    0
                                    Я так понял multiseat под ним не будет как в X?
                                      0
                                      Уже есть и по отзывам неплохо работает. В нем даже есть понятие seat, как одно из базовых, типично включает в себя монитор(ы), клавиатуру, мышь.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое