交换链是最终显示给用户的图像缓冲区列表。这是设置渲染所需的所有缓冲区所需的第一步。
这是Vulkan交换链的视图,与系统的其他各个部分有关。其中一些部分是熟悉的,您将在本节中了解其余部分。
Vulkan和窗口系统
与其他图形API一样,Vulkan将窗口系统方面与核心图形API分开。在Vulkan中,窗口系统细节通过WSI(窗口系统集成)扩展来公开。您可以在启用了WSI内容的情况下准备的Vulkan规范文档中找到这些扩展的文档。在Vulkan SDK下载网站 和Khronos Vulkan注册表中找到的Vulkan规范 是使用此内容构建的。
WSI扩展包含对各种平台的支持。通过定义以下内容为特定平台激活扩展:
- VK_USE_PLATFORM_ANDROID_KHR - Android
- VK_USE_PLATFORM_WAYLAND_KHR - Wayland
- VK_USE_PLATFORM_WIN32_KHR - 微软Windows
- VK_USE_PLATFORM_XCB_KHR - X Window系统,使用XCB库
- VK_USE_PLATFORM_XLIB_KHR - X Window系统,使用Xlib库
名称的“KHR”部分表示该符号是在Khronos扩展中定义的。
表面抽象
Vulkan使用该VkSurfaceKHR对象来抽象本机平台表面或窗口。此符号被定义为VK_KHR_surface扩展的一部分。WSI扩展中的各种功能用于创建,操作和销毁这些表面对象
实例扩展
要使用WSI扩展,您需要激活常规表面扩展。init_instance_extension_names()在示例中查找函数中的代码,该代码将添加VK_KHR_SURFACE_EXTENSION_NAME到要加载的实例扩展列表中。
info.instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
另请注意,此功能确定特定于平台的扩展,具体取决于构建代码的平台。例如,如果为Windows构建,则该函数会添加 VK_KHR_WIN32_SURFACE_EXTENSION_NAME 到要加载的实例扩展列表中。
info.instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
在init_instance()函数中创建实例时会加载这些扩展。
设备扩展
交换链是GPU绘制的图像缓冲区列表,并且还呈现给显示硬件以扫描到显示器。由于是GPU硬件正在写入这些图像,因此需要使用设备级扩展来使用交换链。因此,示例代码将VK_KHR_SWAPCHAIN_EXTENSION_NAME 设备扩展添加到要加载的设备扩展列表中 init_device_extension_names()。
info.device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
总结:
- 此示例使用该init_instance_extension_names()函数将常规表面扩展和特定于平台的表面扩展加载为实例扩展。
- 此示例使用该init_device_extension_names()函数将交换链扩展加载为设备扩展。