Символ препроцессора для оконных систем Wayland, Xlib, XCB, МИР

В документах Vulkan у нас есть следующее относительно платформы WSI:

Vulkan API не определяет какой-либо тип объекта платформы. Определены специфичные для платформы расширения WSI, которые содержат специфичные для платформы функции для использования WSI. Использование этих расширений защищено символами препроцессора.

• VK_USE_PLATFORM_ANDROID_KHR – Android

• VK_USE_PLATFORM_MIR_KHR - Мир

• VK_USE_PLATFORM_WAYLAND_KHR — Вэйланд

• VK_USE_PLATFORM_WIN32_KHR — Microsoft Windows

• VK_USE_PLATFORM_XCB_KHR — система X Window, использующая библиотеку XCB.

• VK_USE_PLATFORM_XLIB_KHR — система X Window, использующая библиотеку Xlib.

Я понимаю, что мне следует выбрать платформу или оконную систему, а затем определить правильный символ перед компиляцией. При компиляции для Android или Windows я могу просто написать что-то вроде ниже:

#if defined(ANDROID) || defined (__ANDROID__)
  #define VK_USE_PLATFORM_ANDROID_KHR 1
#elif defined(_WIN32)
  #define VK_USE_PLATFORM_WIN32_KHR 1
#endif

Пока что ок. Android и Windows имеют собственную уникальную оконную систему, и этого вполне достаточно. Но в Linux есть несколько оконных систем - Xlib, XCB, Wayland и MIR, если честно.

Я хотел бы знать, существует ли символ препроцессора C/C++, который может помочь узнать, какая оконная система используется в этой среде, чтобы можно было написать общий код, способный работать с каждым API, тогда без шуток.


person Alex Byrth    schedule 08.05.2016    source источник
comment
Все эти вещи могут присутствовать одновременно в любой данной установке Linux. Нет возможности автоматически выбрать предпочтительный. Это потребует чтения мыслей пользователя. Также невозможно обнаружить любой из них с помощью символа препроцессора.   -  person n. 1.8e9-where's-my-share m.    schedule 08.05.2016
comment
Спасибо за повтор. После того, как я это скомпилирую, как вы думаете, возможно ли обнаружить во время выполнения, как оконная система активна?   -  person Alex Byrth    schedule 08.05.2016
comment
Да, это возможно. Если у вас установлена ​​переменная среды DISPLAY, скорее всего, у вас запущен X11. (Xlib и XCB — это две клиентские библиотеки, взаимодействующие с одной и той же графической системой X11). Чтобы обнаружить Wayland, unix.stackexchange.com/questions/202891/. Чтобы обнаружить Мир, askubuntu.com/questions/330862/. Обратите внимание, что биты Mir и Wayand, вероятно, используют слой эмуляции X11.   -  person n. 1.8e9-where's-my-share m.    schedule 08.05.2016
comment
@н.м. Я попробую и дам отзыв.   -  person Alex Byrth    schedule 09.05.2016


Ответы (2)


Xlib и XCB — это две библиотеки, которые можно использовать взаимозаменяемо для взаимодействия с оконным сервером X11 в Linux. Если вам нужно, чтобы ваше приложение было совместимо со старыми системами Linux, создайте его для Xlib; в противном случае используйте XCB.

Wayland и Mir все еще являются экспериментальными (по состоянию на май 2016 года), и их можно смело игнорировать.

person Community    schedule 08.05.2016
comment
Спасибо за повтор. Поскольку это библиотека для распространения, я думаю, мне придется создать библиотеку .so для каждой оконной системы. Поскольку Vulkan требует только точек входа (xcb_connection_t * и xcb_visualid_t или Display* и Window), как вы думаете, возможно ли скомпилировать Xlib и XCB в одной библиотеке моста? - person Alex Byrth; 08.05.2016
comment
Уже ответили в комментариях на вопрос. Я буду использовать уникальную библиотеку *.so со всеми включенными интерфейсами Vulkan для Linux: Xlib, XCB, Wayland и Mir. Я надеюсь, что все заголовки будут доступны и между ними не будет конфликтов! - person Alex Byrth; 09.05.2016

Если вы взаимодействуете с оконной системой, то вы уже знаете, какой символ препроцессора вам нужен.

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

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

person ratchet freak    schedule 09.05.2016
comment
@ratchet_freak Привет! Я создаю объектно-ориентированный Vulkan API поверх C API. Решив эти вопросы, связанные с этим вопросом, я сделаю то, что вы огорчили в 3-м абзаце: в Linux включите все препроцессоры Vulkan, связанные с оконной системой Linux (ws), и скомпилируйте их все сразу. В промежуточном программном обеспечении мне все еще нужно выяснить, какой из них является правильным w.s. для выбора во время выполнения. Само приложение может использовать Java AWT/Swing или собственный GLFW/SDL для взаимодействия с текущими X. - person Alex Byrth; 09.05.2016