やっていくVulkan入門

補講4. 拡張機能とその依存関係について

このページは本編の2章2節(論理デバイス)までを理解していることを前提としています。また、4章の内容も2節あたりまで見ているとより理解が深まります。


Vulkanには「拡張機能」という仕組みがあります。これはVulkanが標準で必ず提供している機能(コア機能)とは別に、特定の環境でしか使えないが有用なGPUの機能を利用するためのものです。

例えばよく知られた例としてNVIDIAのRTXシリーズのGPUは、他のGPUと違ってレイトレーシングをハードウェア的にサポートしていることを売り文句にしています。このレイトレーシング機能はNVIDIAが独自にやっているものなのでVulkanのコア機能ではありませんが、Vulkanの拡張機能VK_NV_ray_tracingという形で利用できるようになっています。

他にももっと簡単な例として、Windowsのウィンドウに画像を表示するVK_surface_win32という拡張機能もあります。これはWindows環境では使えますが、MacOS環境などでは当然使えません。逆にMacOS環境ではVK_MVK_macos_surfaceという拡張機能によってウィンドウに表示できます。当然この拡張機能もまたWindowsでは使えません。

このようにVulkanには様々な拡張機能があり、使わないと出来ないことが結構あります。

拡張機能というものの扱い方については本編の4章などでも扱っているので是非そちらもお読みください。


本題ですが、Vulkanの拡張機能には依存関係というものがあります。 これは何かというと、ある拡張機能を有効化するには別のある拡張機能を有効化しなければならないといった関係のことです。

実際の例を挙げると、上に挙げたVK_surface_win32を有効化するには大本のサーフェス機能であるVK_surfaceを有効化する必要があります。また、動画をH264形式にエンコードする拡張機能であるVK_EXT_video_encode_h264VK_KHR_video_encode_queueに依存しており、それはさらにVK_KHR_video_queueVK_KHR_synchronization2などに依存しています。

このように、ある拡張機能を利用しようと思ったら連鎖的に他の拡張機能も有効化する必要が出てくるのです。

このような依存関係は公式の仕様書を見ることで確認できます。

例としてVK_EXT_video_encode_h264の仕様を見てみましょう。

VK_EXT_video_encode_h264(3) Manual Page

Requires VK_KHR_video_encode_queue to be enabled for any device-level functionality

仕様書に「VK_KHR_video_encode_queueを有効化する必要がある」と明記されています。

このように、Vulkanの仕様書でその拡張機能の仕様を読むことで、依存している拡張機能を確認し正しく使うことができます。 ある拡張機能を利用するときは依存している拡張機能もきちんと有効化しましょう。


入門レベルではそこまで拡張機能を利用することはないですが、さまざまな拡張機能を正しく使うには「拡張機能の依存関係」の概念の理解が必須なので1つの記事にまとめました。

サーフェス・スワップチェーンあたりの拡張機能については画面にものを表示するのに必須なため、多くの入門書で解説されています。しかし「拡張機能の依存関係」という一般のシステムについて真面目に解説していることはなかなかありません。筆者は動画のハードウェアエンコード・デコードあたりについて調べたときに初めてこの罠に引っかかって大変時間を費やした覚えがあります。

きっとこの記事を読んだ上であれば「新しいバージョンのVulkanではこんな拡張機能が追加!」といったニュースを見たら「じゃあちょっと試してみようかな」といったことが正しく出来るのではないでしょうか。