LINUX.ORG.RU

XCB либа — ужасный недокументированный монстр — как сделать рендер?

 , , , ,


2

2

имеется арч, i3wm, c++ и желание сделать свой композитный менеджер.
однако никакой внятной документации к ентой либе в части рендеринга я не нашел.
даже в хедерах в данной части либы только автоматически сгенеренные неинформативные комменты.
хочу сделать рендер через вулкан.

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

★★

xcb это клиентская часть иксов. Как ты собрался писать композитор, если вообще не разбираешься?

И лучше делай на wayland. Это тренд. Это хипстерство.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Дурачек что ли ? Wayland это то что отличает linux от windows , изначально в linux не было своего видео стека сто пудово был перекопепизжен с windows с помощью кастылизации конфигов.

anonymous
()

обычно там всё делается относительно похоже на аналогичное в xlib, просто со своими особенностями

поверхность для вулкана создаётся через vkCreateXcbSurfaceKHR(), всё остальное графическое можно делать через вулкан

anonymous
()
Ответ на: комментарий от anonymous

изначально в linux не было своего видео стека сто пудово был перекопепизжен с windows с помощью кастылизации конфигов.

Графическая подсистема X на Линукс пришла из мира Юникс. И первый ее выпуск был в 1984г. А у Микрософта первая Винда появилась в конце 1985г. К этому времени уже была 9-я версия Х, а в конце 1985 вышла Х10.

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от l4gfcm

можно отрендерить сцену чем угодно и дать её на отрисовку иксам.

Да. Но он же хочет сделать композитор. Композиторы не работают через библиотеку xcb.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

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

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

safocl ★★
() автор топика
Ответ на: комментарий от l4gfcm

именно — рендерить я собираюся вулканом — а вот как отдать на отрисовку — один из главных вопросов настоящей темы.

safocl ★★
() автор топика
Ответ на: комментарий от ox55ff

эмм... а через чо они работают???
как бы в ентой либе есть свой композитинг и рендер...
а вот как их юзать — енто уже не документировано ваще никак

safocl ★★
() автор топика
Ответ на: комментарий от anonymous

ну скажем так — тут вопрос получается в том, как скажем отрисовать чото поверхъ всего на видимом скрине?

safocl ★★
() автор топика
Ответ на: комментарий от ox55ff

не переживай, мы все кадато были такими же)) вухаахахаахх

safocl ★★
() автор топика
Ответ на: комментарий от ox55ff

<vulkan/vulkan_xcb.h> — даже есть)) вуххахахаах — я пока не знал но енто чудесна

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от anonymous

ок — похоже я понял чо мне особо голую XCB юзать то и не надо...
все уже есть в вулканАПИ

safocl ★★
() автор топика
Ответ на: комментарий от James_Holden

я просто думал чо Xlib более не актуально — поскольку фридесктоп типа сделали новый апи...
если енто не так то действительно — Xlib приятнее юзать — если следовать моим познаниям в ентих двух апи.

safocl ★★
() автор топика
Ответ на: комментарий от James_Holden

У всего что связано с иксами внутри каша, хотя лучше ничего нет и не будет. Даже такая простая штука, как XKB внутри содержит говнокод и умудряется падать от OpenGL/vulcan приложений в полноэкранном режиме. Но вместо того чтобы пофиксить говнокод, решили с нуля новый напихать.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Но вместо того чтобы пофиксить говнокод, решили с нуля новый напихать.

ну обычно так и делается — что бы сразу учесть пичали предыдущей архитектуры либы — в принципе мне сама по себе концепция XCB нравится — тут все понятно — есть получение куков, из которых в какой то момент можно достать значения — енто отличная идея с моего взгляда...
вся же пичаль в отсутствии документации... хоть какой либо актуальной...
да — есть некоторая древняя документация, после которой либа была изменена, но опять же она только по базовым моментам — коннект и окна... — остальное вообще никак не документировано...

safocl ★★
() автор топика
Ответ на: комментарий от James_Holden

xlib пытается прятать тот факт, что на самом деле выполняет асинхронные запросы к серверу. xcb делает реально происходящее явным

anonymous
()

это называется оперсорс. тут только немногие пишут доки, большинство из принципа ничего не документируют. особенно всякая инфраструктура - drm, xcb, alsa, и т.д. и т.п.

salozar
()

Я когда-то давно пытался с этим XCB разобраться Прокрутка(неполная перерисовка) изображения в иксах

Короче, там почти ничерта не документировано, приходится читать доки на X core protocol и ковызярять какие-то примеры.

Прокрутка(неполная перерисовка) изображения в иксах (комментарий) как советует Zubok

Я вообще рекомендую в случае именно xcb смотреть больше не на документацию Xlib (но на нее тоже за компанию, потому что она во многом совпадает), а на документацию по X-протоколу, потому что xcb - это буквально реализация протокола 1:1. Например, нужен xcb_render_composite. Это команда протокола Composite расширения Render (xcb_<расширение>_<команда>). Все параметры этой команды будут аргументами функции xcb_render_composite вплоть до названия. Но в описании протоколов нет примеров.

SZT ★★★★★
()

XCB ужасное и недокументированное говно. Чтобы что-то написать с его помощью, нужно долго и нудно ковырять исходники существующего.

Сейчас 2020 год, избегай XCB и прочих иксовых извращений.

Немного перлов из «качественнейшей» документации этого XCB-говна:

case XCB_KEY_RELEASE: {
    xcb_key_release_event_t *kr = (xcb_key_release_event_t *)event;
    
    switch (kr->detail) {
        /* ESC */
        case 9: {                       // <=== LOL
            free (event);
            xcb_disconnect (connection);
            return 0;
        }
    }
    free (event);
}

https://xcb.freedesktop.org/tutorial/fonts/

XCB keycode в ASCII вопрос (комментарий)

EXL ★★★★★
()

и тут я готов отправить кадр на вывод. — как енто сделать?

В vkCreateXcbSurfaceKHR указать окно-оверлей. Это специальное окно на котором надо рисовать десктоп, которое X-сервер тебе предоставит, оно находится поверх всех окон. XID окна ты получаешь из Composite Extenston (xcb_composite_get_overlay_window), далее отмапить его.

Но тебе еще много чего надо будет потом. Damage Extention, например.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

да — тут уже выше грили про ентот проект — уже посмотрел бегло, спс

safocl ★★
() автор топика
Ответ на: комментарий от Zubok

оу спс
а вот можешь огласить чо такое енто Damage Extention? А то я ваще не понимаю почему такое называние — хедеры уже излазил, его апи понял — оно тривиально по структуре — но чо енто, для чего и как именно юзать — я не понял...

safocl ★★
() автор топика
Ответ на: комментарий от Zubok

а XCB мне нужен был что бы узнать куда отсылать рендер — ты мне уже вроде ниже подсказал чо енто через xcb_composite_get_overlay_window делать.
ну и XCB еще же нужен что бы получать атрибуты окон — геометрию, боксы прозрачности и т.д. — иначе как я буду знать чо прозрачно а чо нет?

safocl ★★
() автор топика
Ответ на: комментарий от safocl

не понимаю почему такое называние

Пальцем в небо: у древних графических средств было такое понятие как Damage. Чтобы сервер актуализировал (обновил) какую-то информацию из пиксельного буфера, нужно вызвать Damage на его объекте.

В QNX Photon для того чтобы перерисовать виджет в окне или его часть, нужно было сделать что-то вроде: PtDamageWidget() вместо repaint(). Возможно Damage Extension для X.Org и реализует подобное.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от safocl

События Damage нужны, чтобы композитор узнал, что содержимое каких-то окон изменилось. Этот механизм везде используется, в том числе и на Wayland, но только там приложения сообщают композитору damage events напрямую, а в иксах композитор получает эти события от X-сервера.

Zubok ★★★★★
()
Ответ на: комментарий от EXL

В QNX Photon для того чтобы перерисовать виджет в окне или его часть, нужно было сделать что-то вроде: PtDamageWidget()

Да, именно так, я как раз из тех несчастных, кто в 2020 вынужден работать с фотонькой… =(

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

ваадушивися — ты же не на асме пишешь...

safocl ★★
() автор топика
11 июня 2021 г.
Ответ на: комментарий от anonymous

изначально в linux не было своего видео стека сто пудово был перекопепизжен с windows с помощью кастылизации конфигов.

и кстати енто вранье — разработка граф стека винды и иксов начиналась одновременно — и еще вопрос, что первым началось разрабатываться.
и да — в линуксе сразу был граф стек — поскольку иксы появились задолго до линукс

safocl ★★
() автор топика
Ответ на: комментарий от anonymous

вроде как раз Xlib делает синхронные запросы — а XCB делает возможным делать енто асинхронно

safocl ★★
() автор топика

по данной теме вроде во многом уже разобралси — однако остался по сути только один вопрос — мне как я изначально и планировал самому собирать новый кадр вставляя в него данные каждого видимого окна, или же есть способ как нормально брать откуда-то весь декстоп целиком.

в данный момент я эксперементирую с root окном — из него получаю кадр и отрисовываю его на композитном слое — однако в таком случае перед забором кадра из root окна надо делать unmap() композитного слоя, иначе root окно содержит так же и композитный слой — и получается статичная картинка. Но если делать каждый раз unmap(), map() root окна — все начинает фликаться. И почему то с включенным FIFO present типом в вулкан swapchain все равно получается тиринг — думаю енто не тиринг на композитном слое, а просто кадр полученный из root окна такой...

многие данные нашел в текстовых файлах отсюда

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.