vkGetInstanceProcAddr
API ドキュメントにvkGetDeviceProcAddr
は完全に記載されていません。ただし、スワップチェーンを使用してコマンドを実行する必要があります (したがって、意味のある Vulkan アプリを作成します)。さらに、SDK に付属するキューブ/トライ デモでは、それらの使用方法が非常に一貫していません。
これら 2 つの方法は互換性がありますか? そうでない場合、違いは何ですか?
vkGetInstanceProcAddr
API ドキュメントにvkGetDeviceProcAddr
は完全に記載されていません。ただし、スワップチェーンを使用してコマンドを実行する必要があります (したがって、意味のある Vulkan アプリを作成します)。さらに、SDK に付属するキューブ/トライ デモでは、それらの使用方法が非常に一貫していません。
これら 2 つの方法は互換性がありますか? そうでない場合、違いは何ですか?
vkGetInstanceProcAddress
渡されたインスタンスから作成されたデバイスで常に機能する関数ポインタを取得することです。
ただし、返される関数には、呼び出しの速度を低下させる可能性のあるディスパッチ ロジック (通常、デバイスで有効になっているかどうかにかかわらず、拡張機能を考慮したもの) が含まれている場合があります。これが、vkGetDeviceProcAddress
ディスパッチ ロジックを持たない関数を取得するために存在する理由です。それらを使用する義務はありませんが、速度を向上させるのに役立つ場合があります。
これは、複数のレイヤーをアクティブにした場合に特に顕著です。
デバイス固有の関数ポインターを使用すると、最終的なディスパッチを削除できます。
khonos ローダーおよびレイヤー インターフェイス ドキュメントの画像
1 つのデバイスのみを使用する場合、アプリケーションの操作の順序は次のようになります。
vkGetInstanceProcAddress
プラットフォーム/ローダーから取得します。
それからロードvkCreateInstance
し、拡張機能とレイヤーのクエリを実行します。(インスタンスパラメータとして null を使用)
インスタンスを作成します。(これを他の関数をロードするための最初のパラメーターとして使用します)
ロードvkEnumeratePhysicalDevices
し、クエリ デバイスに関連します。
vkCreateDevice
必要な拡張子を指定してデバイスを作成します。
必要な他のすべての機能をロードしvkGetDeviceProcAddress
、デバイスを最初のパラメーターとして渡します。