Es gibt mehrere Möglichkeiten, die Synchronisierung in Vulkan zu handhaben. Dies ist, wie ich es verstehe:Synchronisation zwischen Befehlspuffern in Vulkan
- Zäune sind GPU zu CPU synchronisiert.
- Semaphore sind GPU zu GPU-Synchronisierungen, sie werden verwendet, um die Warteschlange Übermittlungen (in der gleichen oder verschiedenen Warteschlangen) zu synchronisieren.
- Ereignisse sind allgemeiner, zurückgesetzt und überprüft auf CPU und GPU.
- Barrieren werden zur Synchronisation innerhalb eines Befehlspuffers verwendet.
In meinem Fall habe ich zwei Befehlspuffer. Und ich möchte, dass der zweite Befehlspuffer nach dem ersten ausgeführt wird.
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);
Welche Art von Synchronisation ist dafür am besten? Wenn ich vkQueueWaitIdle(queue)),
verwende, ist das die gleiche Sache wie mit einem Zaun oder sollte ich Event oder Semaphoren dafür verwenden?
Wenn ich mehrere commandbuffer in die Warteschlange zur gleichen Zeit senden:
std::vector<VkCommandBuffer> submitCmdBuffers = {
firstCommandBuffer,
secondCommandBuffer
};
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
Gibt es noch eine Möglichkeit, zwischen dem ersten und dem zweiten zu synchronisieren?
"* Und ich möchte, dass der zweite Befehlspuffer nach dem ersten ausgeführt wird. *" Wie viel willst du ", dass das passiert? Das heißt, was macht der zweite Befehlspuffer so, dass es so zwingend ist, dass die erste * Ausführung * abgeschlossen hat, bevor die zweite beginnt? –
Der erste Befehlspuffer rendert das Objekt mit eingeschaltetem Tiefentest. Der zweite Befehlspuffer rendert Konturen von Netzen mit deaktiviertem Tiefentest. Weil es über den anderen Objekten liegen muss. – hidayat
Wenn Sie eine Einreichung machen. Verwenden Sie dann vkCmdSetEvent in Ihrem ersten Befehlspuffer und vkCmdWaitEvents in Ihrem zweiten Befehl, und halten Sie die Masken für src und dst so schmal wie möglich. –