窗口系统(WSI)
由于可以在没有显示内容的情况下使用 Vulkan API,因此 WSI 是通过Vulkan 扩展的形式来提供的。大多数设备厂商支持 WSI。WSI 的设计初衷是为了从Vulkan核心API 中抽象出各平台的窗口机制。
Surface
VkSurfaceKHR
对象是平台不相关的,这种设计使 Vulkan API 可以将其用于所有的 WSI 操作,它通过VK_KHR_surface
扩展来启用。
支持 Vulkan Surface 的各平台都有特定的 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
创建后,可以查询它的功能、格式和呈现模式。
交换链
VkSwapchainKHR
使用VkImage
数组将渲染结果呈现到surface。交换链的各种呈现模式决定了如何呈现渲染结果。
Khronos的示例教程阐述了在创建交换链和选择呈现模式时的各注意事项。
预旋转
移动设备是可以旋转的,因此应用程序窗口的方向和屏幕方向可能不匹配。应用程序需要支持两种模式:portrait
(竖向)和landscape
(横向),这两种模式的差异可以简化为分辨率的变化。然而某些显示系统使用屏幕的物理方向,设备旋转时,应用程序的输出也必须旋转才能显示正确的画面。
为了让应用程序在移动平台(如 Android)上充分利用 Vulkan,必须实现预旋转。Google 有一篇博客文章介绍了如何在交换链创建时指定方向来处理surface旋转,以及对应示例。Vulkan-Samples中的一个示例也详细说明了为什么预旋转,它提供了一种在着色器中解决该问题的方法。如果使用 Adreno GPU 驱动的设备,Qualcomm 建议使用 VK_QCOM_render_pass_transform 扩展来实现预旋转。