【发布时间】: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.我会尝试并提供反馈。