由于 Vulkan API 可不显示结果即可使用,WSI通过可选 Vulkan 扩展提供。多数实现会包含 WSI 支持。WSI 设计用于将各平台窗口机制与 Vulkan 核心 API 隔离开。

设置可呈现图像的步骤
表面(Surface)
VkSurfaceKHR对象与平台无关,设计为 Vulkan API 其余部分可将其用于所有 WSI 操作。通过VK_KHR_surface扩展启用。
每个支持 Vulkan 表面的平台,都有其从对应平台专用 API 创建VkSurfaceKHR对象的专属方式:
-
Android – vkCreateAndroidSurfaceKHR
-
DirectFB – vkCreateDirectFBSurfaceEXT
-
Fuchsia – vkCreateImagePipeSurfaceFUCHSIA
-
iOS – vkCreateIOSSurfaceMVK
-
macOS – vkCreateMacOSSurfaceMVK
-
Metal – vkCreateMetalSurfaceEXT
-
VI – vkCreateViSurfaceNN
-
Wayland – vkWaylandSurfaceCreateInfoKHR
-
QNX – vkCreateScreenSurfaceQNX
-
Windows – vkCreateWin32SurfaceKHR
-
XCB – vkCreateXcbSurfaceKHR
-
Xlib – vkCreateXlibSurfaceKHR
-
Direct-to-Display – vkCreateDisplayPlaneSurfaceKHR
创建VkSurfaceKHR后,可查询多种能力、格式与呈现模式。
交换链(Swapchain)
VkSwapchainKHR对象提供通过VkImage对象数组,将渲染结果呈现到表面的能力。交换链的多种呈现模式决定呈现引擎的实现方式。

Khronos 的示例与教程说明了创建交换链与选择呈现模式时需考虑的不同事项。
预旋转(Pre-Rotation)
移动设备可旋转,因此应用窗口的逻辑方向与显示器物理方向可能不一致。应用需在两种模式下运行:portrait(竖屏)与landscape(横屏)。两种模式的差异可简化为分辨率变化。但部分显示子系统始终以显示面板的 “原生”(或 “物理”)方向工作。设备旋转后,为达到预期效果,应用输出也必须旋转。
为让应用在 Android 等移动平台上充分发挥 Vulkan 性能,实现预旋转必不可少。Google 有一篇详细博客文章,讲解如何在交换链创建时指定方向来处理表面旋转,并附带独立示例。Vulkan-Samples 也详细说明了预旋转问题的成因,并有可运行示例展示在着色器中解决该问题的方法。若使用 Adreno GPU 设备,Qualcomm 建议使用VK_QCOM_render_pass_transform扩展实现预旋转。





