Vulkanで同期を処理する方法はいくつかあります。これは私がそれを理解する方法です:Vulkanのコマンドバッファ間の同期
- フェンスはGPUとCPUの同期です。
- セマフォはGPUからGPUへの同期であり、(同じキューまたは異なるキュー上の)キュー の送信を同期するために使用されます。
- イベントはより一般的で、リセットされ、CPUとGPUの両方でチェックされます。
- バリアは、コマンドバッファ内の同期に使用されます。
私の場合、私は2つのコマンドバッファを持っています。そして、最初のコマンドバッファの後に2番目のコマンドバッファを実行します。
submitInfo.pCommandBuffers = &firstCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
// wait for first command buffer to finish
submitInfo.pCommandBuffers = &secondCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
これにはどのような同期が最適ですか? もし私がvkQueueWaitIdle(queue)),
を使用しているのであれば、それはフェンスを使用しているのと同じことですか、これに対してイベントまたはセマフォを使うべきですか?
私は同時にキューに複数のcommandbufferを送信する場合:
std::vector<VkCommandBuffer> submitCmdBuffers = {
firstCommandBuffer,
secondCommandBuffer
};
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
はまだ第一及び第二の1の間で同期化する方法はありますか?
"*そして、最初のコマンドバッファの後に2番目のコマンドバッファを実行します。*"どれくらい "それを実現したいですか?つまり、2番目のコマンドバッファは、2番目のコマンドバッファが起動する前に最初のコマンドが実行されていることが非常に重要であるということをしていますか? –
最初のコマンドバッファは、デプステストをオンにしてレンダリングオブジェクトです。第2のコマンドバッファは、深度テストをオフにしてメッシュの輪郭をレンダリングしている。なぜなら、それは他のオブジェクトの上になければならないからです。 – hidayat
提出を1回行う場合。最初のコマンドバッファーではvkCmdSetEvent、2番目のコマンドバッファーではvkCmdWaitEventsを使用し、srcマスクとdstステージマスクはできるだけ狭くしておきます。 –