Vulkan は、メジャー、マイナー、パッチに分かれたバージョンシステムを採用しています。現在は4つのマイナーバージョン(1.0、1.1、1.2、1.3)がリリースされており、それぞれ後方互換性があります。アプリケーションはvkEnumerateInstanceVersion を使用して、サポートされている Vulkan インスタンスのバージョンを確認することができます。また、LunarG によるホワイトペーパーでは、サポートされているバージョンをクエリして確認する方法が紹介されています。マイナーバージョンをまたいで作業する場合は、いくつか注意すべき点があります。
インスタンスレベルのバージョンと、デバイスレベルのバージョンには違いがあるということが重要です。ローダと実装が異なるバージョンをサポートする可能性があります。
Vulkan Spec の バージョンサポートのクエリでは、インスタンスレベルとデバイスレベルの両方でサポートされているバージョンをクエリする方法を詳しく説明しています。
すべてのメジャーリリースの Vulkan には、サポートされているヘッダがひとつしかありません。つまり、マイナーバージョンとパッチバージョンのすべてのヘッダが統一されているため、「Vulkan 1.0のヘッダ」というものは存在しません。これは、Vulkan Spec の1.0バージョンを生成する機能と混同してはいけません。同じパッチバージョンの Vulkan Spec とヘッダが一致します。たとえば、生成された1.0.42の Vulkan Spec は、1.x.42のヘッダと一致します。
常に最新のヘッダファイルを利用することを強くお勧めします。Vulkan SDK には多くのバージョンがあり、それらは含まれているヘッダのバージョンに対応しています。
Vulkan のマイナーバージョン間では、一部の拡張機能がコアに昇格 します。新しいマイナーバージョンの Vulkan をターゲットにする場合、アプリケーションはインスタンスやデバイスの作成時に新しく昇格した拡張機能を有効にする必要はありません。ただし、アプリケーションが後方互換性を維持したい場合は、拡張機能を有効にする必要があります。
各バージョンの新機能の概要については、Vulkan Release Summary をご覧ください。
構造体や列挙型は、クエリしたインスタンスやデバイスのバージョンではなく、使用しているヘッダファイルに依存します。たとえば、構造体 VkPhysicalDeviceFeatures2
は、Vulkan 1.1がリリースされる前は VkPhysicalDeviceFeatures2KHR
でした。使用している Vulkan のバージョンが1.xであるかどうかにかかわらず、アプリケーションは、最新のヘッダバージョンに一致する VkPhysicalDeviceFeatures2
をコードで使用する必要があります。コード内で VkPhysicalDeviceFeatures2KHR
を使用していたアプリケーションについては、Vulkan ヘッダが昇格した構造体や列挙型もエイリアスしているので、心配する必要はありません(typedef VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2KHR;
)。
Vulkan Spec はどのバージョンが生成されても、VkPhysicalDeviceFeatures2
のみを参照するため、新しい名前の使用をお勧めします。新しい名前を使用することで、この構造体が使用されている場所を素早く検索することができます。
関数はローダや実装とのやりとりに使われるため、マイナーバージョン間で作業する際には少し注意が必要です。例として、Vulkan 1.0から Vulkan 1.1にかけて、vkGetPhysicalDeviceFeatures2
としてコアに昇格した vkGetPhysicalDeviceFeatures2KHR
を見てみましょう。Vulkan のヘッダを見ると、両方とも宣言されています。
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures);
// ...
typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceFeatures2KHR)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures);
主な違いは、vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2");
を呼び出す際に、Vulkan 1.0 の実装では vkGetPhysicalDeviceFeatures2
の存在を認識していない可能性があり、vkGetInstanceProcAddr
は NULL
を返します。この状況で Vulkan 1.0との後方互換性を保つためには、アプリケーションは vkGetPhysicalDeviceFeatures2KHR
をクエリするべきです。1.1の Vulkan 実装は、内部的に vkGetPhysicalDeviceFeatures2
関数ポインタを直接指す関数を持っている可能性が高いためです。
Note
|
なお、Vulkan 1.0の実装では、 |
マイナーバージョン間で、いくつかの機能ビットが追加されたり、削除されたり、オプションになったり、必須になったりする可能性があります。変更された機能の詳細は、Core Revisions のセクションに記載されています。
Vulkan Spec の Feature Requirements セクションでは、マイナーバージョン間で実装に要求されている機能のリストを見ることができます。
現在、Vulkanのすべてのバージョンで、最小/最大の制限要件は同じですが、変更があった場合は Vulkan Spec の Limit Requirements セクションに記載されます。
すべての Vulkan のマイナーバージョンは、サポートされなければならない SPIR-V のバージョンに対応しています。
-
Vulkan 1.0は SPIR-V 1.0をサポートしています。
-
Vulkan 1.1は SPIR-V 1.3以下をサポートしています。
-
Vulkan 1.2は SPIR-V 1.5以下をサポートしています。
-
Vulkan 1.3は SPIR-V 1.6以下をサポートしています。
アプリケーションは、VkShaderModule
の SPIR-V が、対応する Vulkan のバージョンに対して有効なバージョンであることを確認する必要があります。