Vulkan API は結果を表示しなくても使用できるため、オプションの Vulkan 拡張機能 を使用することで WSI を提供しています。ほとんどの実装には WSI の対応が含まれています。WSI の設計は、各プラットフォームのウィンドウメカニズムをコアの Vulkan API から抽象化するために作成されました。
VkSurfaceKHR
オブジェクトはプラットフォームに依存せず、Vulkan API の残りの部分がすべての WSI 操作に使用できるように設計されています。これは VK_KHR_surface
という拡張機能を使って有効にします。
Vulkan Surface をサポートする各プラットフォームは、それぞれのプラットフォーム固有の API から VkSurfaceKHR
オブジェクトを作成する独自の方法を持っています。
-
Android - vkCreateAndroidSurfaceKHR
-
DirectFB - vkCreateDirectFBSurfaceEXT
-
Fuchsia - vkCreateImagePipeSurfaceFUCHSIA
-
Google Games - vkCreateStreamDescriptorSurfaceGGP
-
iOS - vkCreateIOSSurfaceMVK
-
macOS - vkCreateMacOSSurfaceMVK
-
Metal - vkCreateMetalSurfaceEXT
-
VI - vkCreateViSurfaceNN
-
Wayland - vkWaylandSurfaceCreateInfoKHR
-
QNX - vkCreateScreenSurfaceQNX
-
Windows - vkCreateWin32SurfaceKHR
-
XCB - vkCreateXcbSurfaceKHR
-
Xlib - vkCreateXlibSurfaceKHR
-
Direct-to-Display - vkCreateDisplayPlaneSurfaceKHR
VkSwapchainKHR
オブジェクトは、VkImage
オブジェクトの配列を通じてレンダリング結果をサーフェスに表示する機能を提供します。スワップチェーンのさまざまな 表示モードは、表示エンジンがどのように実装されるかを決定します。
Khronos のサンプルとチュートリアルでは、スワップチェーンを作成する際や表示モードを選択する際に考慮すべきさまざまな点を説明しています。
モバイル機器は回転させることができるため、アプリケーションウィンドウの論理的な向きとディスプレイの物理的な向きが一致しないことがあります。アプリケーションは、portrait
と landscape
の2つのモードで動作できる必要があります。この2つのモードの違いは、単に解像度の変更だけで簡単に説明できます。しかし、ディスプレイサブシステムの中には、常にディスプレイパネルの「ネイティブ」(または「物理的」)な向きで動作するものがあります。デバイスが回転しているので、望ましい効果を得るためには、アプリケーション出力も回転させる必要があります。
Android などのモバイルプラットフォームで Vulkan を最大限に活用するためには、回転の前にすることを実装することが必須となります。スワップチェーンの作成時に方向を指定してサーフェスの回転を処理する方法については、Google のブログ記事に詳細が記載されており、スタンドアロンのサンプルも用意されています。また、Vulkan-Samples には、回転の前にすることがなぜ問題になるのか、またシェーダで解決する方法を示す実行サンプルが公開されています。Adreno GPU を搭載したデバイスを使用している場合、クアルコムは VK_QCOM_render_pass_transform 拡張機能を使用して回転の前にすることを実装することを提案しています。