8

vkGetInstanceProcAddrAPI ドキュメントvkGetDeviceProcAddrは完全に記載されていません。ただし、スワップチェーンを使用してコマンドを実行する必要があります (したがって、意味のある Vulkan アプリを作成します)。さらに、SDK に付属するキューブ/トライ デモでは、それらの使用方法が非常に一貫していません。

これら 2 つの方法は互換性がありますか? そうでない場合、違いは何ですか?

4

2 に答える 2

14

vkGetInstanceProcAddress渡されたインスタンスから作成されたデバイスで常に機能する関数ポインタを取得することです。

ただし、返される関数には、呼び出しの速度を低下させる可能性のあるディスパッチ ロジック (通常、デバイスで有効になっているかどうかにかかわらず、拡張機能を考慮したもの) が含まれている場合があります。これが、vkGetDeviceProcAddressディスパッチ ロジックを持たない関数を取得するために存在する理由です。それらを使用する義務はありませんが、速度を向上させるのに役立つ場合があります。

これは、複数のレイヤーをアクティブにした場合に特に顕著です。

ここに画像の説明を入力

デバイス固有の関数ポインターを使用すると、最終的なディスパッチを削除できます。

ここに画像の説明を入力
khonos ローダーおよびレイヤー インターフェイス ドキュメントの画像

1 つのデバイスのみを使用する場合、アプリケーションの操作の順序は次のようになります。

  1. vkGetInstanceProcAddressプラットフォーム/ローダーから取得します。

  2. それからロードvkCreateInstanceし、拡張機能とレイヤーのクエリを実行します。(インスタンスパラメータとして null を使用)

  3. インスタンスを作成します。(これを他の関数をロードするための最初のパラメーターとして使用します)

  4. ロードvkEnumeratePhysicalDevicesし、クエリ デバイスに関連します。

  5. vkCreateDevice必要な拡張子を指定してデバイスを作成します。

  6. 必要な他のすべての機能をロードしvkGetDeviceProcAddress、デバイスを最初のパラメーターとして渡します。

于 2016-02-19T12:00:46.423 に答える