注: 私は最新の OpenGL の知識がほとんどない Vulkan を自己学習しています。
Vulkan の仕様を読むと、コマンド バッファーとスワップチェーンの同期を可能にする非常に優れたセマフォが表示されます。これは、単純な(しかし非効率的だと思う)物事を行う方法であると私が理解していることです。
vkAcquireNextImageKHR
、シグナリングで画像を取得sem_post_acq
- 以下を使用してコマンド バッファーをビルドします (または事前にビルドされたものを使用します)。
- 画像を移行するための画像バリア
VK_IMAGE_LAYOUT_UNDEFINED
- 与える
- 画像を遷移する画像バリア
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- 画像を移行するための画像バリア
sem_post_acq
キューに送信し、フラグメント ステージで待機し、シグナリングしsem_pre_present
ます。vkQueuePresentKHR
お待ちしておりsem_pre_present
ます。
ここでの問題は、コマンド バッファー内のイメージ バリアが、どのイメージが遷移しているかを認識している必要があることです。つまりvkAcquireNextImageKHR
、コマンド バッファーの作成方法 (または送信するビルド済みのコマンド バッファー) を知る前に、元に戻らなければなりません。ただし、vkAcquireNextImageKHR
潜在的に多くのスリープが発生する可能性があります (プレゼンテーション エンジンがビジー状態で、空き画像がないため)。一方で、コマンド バッファーの送信自体にコストがかかります。さらに重要なことは、最終結果がどのイメージにレンダリングされるかを知らなくても、フラグメントの前のすべてのステージを実行できることです。
理論的には、次のようなスキームを使用すると、より高度な並列処理が可能になるように思えます。
- 以下を使用してコマンド バッファーをビルドします (または事前にビルドされたものを使用します)。
- 画像を移行するための画像バリア
VK_IMAGE_LAYOUT_UNDEFINED
- 与える
- 画像を遷移する画像バリア
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- 画像を移行するための画像バリア
sem_post_acq
キューに送信し、フラグメント ステージで待機し、シグナリングしsem_pre_present
ます。vkAcquireNextImageKHR
、シグナリングで画像を取得sem_post_acq
vkQueuePresentKHR
お待ちしておりsem_pre_present
ます。
これもまた、理論的には、vkAcquireNextImageKHR
. これが機能しない唯一の理由は、このイメージが後で決定されることを (適切な同期で) コマンド バッファに伝えることも、プレゼンテーション エンジンに特定のイメージを要求することもできないことです。
私の最初の質問は、私の分析は正しいですか? もしそうなら、そのような最適化はVulkanではまったく不可能ですか?なぜですか?
vkAcquireNextImageKHR
2 番目の質問は、取得したい特定の画像を特定して、それらを自分で反復処理できれば、より理にかなっていると思いませんか? そうすれば、どのイメージを要求するかを事前に知ることができ、それに応じてコマンド バッファーを構築して送信できます。