2

在 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 的通用代码,而不会弄乱。

4

2 回答 2

3

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

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

于 2016-05-08T06:07:27.000 回答
2

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

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

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

于 2016-05-09T12:19:58.403 回答