【问题标题】:Preprocessor symbol for Wayland, Xlib, XCB, MIR window systemsWayland、Xlib、XCB、MIR 窗口系统的预处理器符号
【发布时间】:2016-05-08 05:35:08
【问题描述】:

在 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 窗口系统,使用 XCB 库

• VK_USE_PLATFORM_XLIB_KHR - X 窗口系统,使用 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,afaik。

我想知道是否有 C/C++ 预处理器符号,它可能有助于了解该环境使用哪个窗口系统,因此可以编写能够处理的通用代码每个API,然后没有弄乱。

【问题讨论】:

  • 所有这些东西都可能同时出现在任何给定的 Linux 安装中。无法自动选择首选的。那将需要阅读用户的想法。也没有办法用预处理器符号检测它们中的任何一个。
  • 感谢您的重播。一旦我编译了这个,你认为有可能在运行时发现窗口系统是如何活动的吗?
  • 是的,这是可能的。如果您设置了 DISPLAY 环境变量,则很有可能您正在运行 X11。 (Xlib 和 XCB 是与同一个 X11 图形系统通信的两个客户端库)。要检测 Wayland,unix.stackexchange.com/questions/202891/…。要检测 Mir,askubuntu.com/questions/330862/…。请注意,bith Mir 和 Wayand 可能运行 X11 仿真层。
  • @n.m.我会尝试并提供反馈。

标签: c linux xlib xcb vulkan


【解决方案1】:

Xlib 和 XCB 是两个可以互换使用的库,用于与 Linux 上的 X11 窗口服务器交互。如果您需要您的应用程序与旧的 Linux 系统兼容,请为 Xlib 构建;否则,请使用 XCB。

Wayland 和 Mir 都仍处于高度试验阶段(截至 2016 年 5 月),可以放心地忽略。

【讨论】:

  • 感谢您的重播。由于它是一个要分发的库,我想我必须为每个窗口系统构建一个 .so 库。由于 Vulkan 只需要入口点,(xcb_connection_t * 和 xcb_visualid_t,或 Display* 和 Window)您认为可以在单个桥接库中编译 Xlib 和 XCB 吗?
  • 已经在 cmets 中回答了问题。我将使用一个独特的 * .so 库,并启用所有到 Linux 的 Vulkan 接口:Xlib、XCB、Wayland 和 Mir。我希望所有标题都可用,并且没有冲突!
【解决方案2】:

如果您是与窗口系统交互的人,那么您已经知道需要什么预处理器符号。

如果您不是应用程序代码(使用原生窗口周围的包装器),那么您会向包装器询问 vkSurface,如果不可用,则向包装器的维护者提出问题。

如果您是 vulkan 库,那么您应该能够处理所有 linux 窗口选项。如果启用所有预处理器符号并根据应用程序调用的函数根据需要手动加载所需的函数。

【讨论】:

  • @ratchet_freak 嗨!我正在 C API 之上构建面向对象的 Vulkan API。解决了与这个问题相关的那些问题,我会在第 3 段中做你难过的事情:在 Linux 上,启用与 Linux 窗口系统 (w.s.) 相关的所有 Vulkan 预处理器,然后一次编译所有内容。在中间件中,我仍然需要发现哪个是正确的 w.s.在运行时选择。应用程序本身可以使用 Java AWT/Swing 或本机 GLFW/SDL 与当前的“X”进行交互。
猜你喜欢
  • 1970-01-01
  • 2014-05-17
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多